2012年10月15日 星期一

UNITY3D - SendMessage多重參數

善用Unity3D內建的SendMessage函式可以讓程式更容易拆解、更好重覆利用,在Component Oriented Design上是很好用的工具。

但SendMessage系列有個缺陷是只能接收單一參數,除非自己將多重參數包成struct、class使用,這樣在使用上也變得無法統一不太便利。

如何改善呢?

試了幾種方法後發現用Hashtable較為合適,且C#或JavaScript皆可使用。按Key來得知所接收的變數該塞在哪?不用像用Array時還要確定變數的位子。

C#

void Start () {
    Hashtable args = new Hashtable();
//想塞什麼型態都可以
    args.Add("string", "i am string"); 
    args.Add("int", 123);
    args.Add("float", 567.89f);
    args.Add("Vector3", new Vector3(1, 2, 3));
    SendMessage("TestMessage", args);
}
void TestMessage (Hashtable args) { //可以直接使用或新建變數接收,個人覺得新建變數接收使用上較為直覺 //接收時須轉型為正確型態     string stringVar = (args.Contains("string")) ? args["string"].ToString() : "";     int intVar = (args.Contains("int")) ? (int)args["int"] : 0;     float floatVar = (args.Contains("float")) ? (float)args["float"] : 0.0f;     Vector3 vectorVar = (args.Contains("Vector3")) ? (Vecotr3)args["Vector3"] : Vector.zero; }


========================================

JavaScript


function Start () {
    var args : Hashtable = new Hashtable();

//想塞什麼型態都可以

    args.Add("string", "i am string"); 
    args.Add("int", 123);
    args.Add("float", 567.89f);
    args.Add("Vector3", new Vector3(1, 2, 3));
    SendMessage("TestMessage", args);
}
function TestMessage (args : Hashtable) {
    string stringVar = (args.Contains("string")) ? args["string"] : "";
    int intVar = (args.Contains("int")) ? args["int"] : 0;
    float floatVar = (args.Contains("float")) ? args["float"] : 0.0f;
    Vector3 vectorVar = (args.Contains("Vector3")) ? args["Vector3"] : Vector.zero;
}