但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;
}
沒有留言:
張貼留言