序列化
1 public int v; // 支持 2 public GameObject go; // 支持 3 public Transform trans; // 支持 4 public int[] arrInt; // 支持 5 public Vector3 v; // 支持 6 [Serializable] 7 public struct HandsomeGuyInfo { 8 public int jjLength; 9 public Vector3 jjDirection; 10 public string[] girlFriendNames; 11 }; 12 public HandsomeGuyInfo[] infos; // 支持 13 public List<int> lst; // 不支持 List,请使用数组
菜单:[JSB | Add JsType Attribute for all structs and classes]
可以执行多次,如果一个类或者结构体已经有 JsType 标签,并不会再次添加。但是有个限制,如果类同时有多个标签,JsType 必须是最靠近类定义的那一行。
1 using UnityEngine; 2 using System.Collections; 3 4 using SharpKit.JavaScript; 5 [JsType(JsMode.Clr,"../../StreamingAssets/JavaScript/SharpKitGenerated/2DPlatformer/Scripts/Gun.javascript")] 6 public class Gun : MonoBehaviour 7 { 8 public GameObject rocketGO; // Prefab of the rocket. 9 public float speed = 20f; // The speed the rocket will fire at. 10 11 //........ 12 }
C#语言相关:
支持 C# 的Coroutine,具体请查看:JSBinding + SharpKit / Coroutine支持
最好不要使用 as 操作符。转换成 JS 后会有额外判断开销。最好直接用强制转换。
1 UnityEngine.Object obj = ...; 2 3 GameObject go = obj as GameObject; // DON'T 4 GameObject go = (GameObject)obj; // GREAT
目前数组只能做为输入。也是只当JS->CS交互时。比如说C#里有一个函数
1 void ModifyArray(int[] arr) 2 { 3 for (var i = 0; i < arr.Length; i++) 4 arr[i] = i; 5 }
当你从JS调用这个函数
1 var arr = [5,2,3,2]; 2 ModifyArray(arr); 3 4 // 调用完后,arr 仍然是 5,2,3,2
数组只支持1维哦。是指 JS->CS交互时只1维,如果你的代码后来全部转换成JS代码了,没有交互,那么应该是几维都可以。
使用Debug.Log() 时,要显示地使用 ToString() 来构造字符串:
1 Vector3 v = Vector3.one; 2 Debug.Log("v is " + v); // WRONG 3 Debug.Log("v is " + v.ToString()); // OK
完全支持 List<>, Dictionary<>
对了,泛型套泛型不支持,比如说 Dictionary<string, List<int> >。可以用 Dictionary<string, object> 代替。===>有待验证
支持 delegate =操作,+=操作,-=操作。具体查看生成的JS代码就很好理解了。
举个例子吧,NGUI 中对 UIEventListener 的使用
// C#
1 public class test0610 : MonoBehaviour { 2 public UIButton btn; 3 4 void Start () 5 { 6 UIEventListener.Get(btn.gameObject).onClick += this.OnClick1; // (1) 7 UIEventListener.Get(btn.gameObject).onClick += this.OnClick2; // (2) 8 } 9 10 void OnClick1(GameObject go) 11 { 12 Debug.Log("onclick1 "); 13 14 UIEventListener.Get(btn.gameObject).onClick -= this.OnClick1; // (3) 15 } 16 void OnClick2(GameObject go) 17 { 18 Debug.Log("onclick2 "); 19 } 20 }
// JS
1 if (typeof(JsTypes) == "undefined") 2 var JsTypes = []; 3 var test0610 = { 4 fullname: "test0610", 5 baseTypeName: "UnityEngine.MonoBehaviour", 6 assemblyName: "SharpKitProj", 7 Kind: "Class", 8 definition: { 9 ctor: function (){ 10 this.btn = null; 11 UnityEngine.MonoBehaviour.ctor.call(this); 12 }, 13 Start: function (){ 14 UIEventListener.Get(this.btn.get_gameObject()).onClick = $CombineDelegates(UIEventListener.Get(this.btn.get_gameObject()).onClick, $CreateDelegate(this, this.OnClick1)); // (1) 15 UIEventListener.Get(this.btn.get_gameObject()).onClick = $CombineDelegates(UIEventListener.Get(this.btn.get_gameObject()).onClick, $CreateDelegate(this, this.OnClick2)); // (2) 16 }, 17 OnClick1: function (go){ 18 UnityEngine.Debug.Log$$Object("onclick1 "); 19 UIEventListener.Get(this.btn.get_gameObject()).onClick = $RemoveDelegate(UIEventListener.Get(this.btn.get_gameObject()).onClick, $CreateDelegate(this, this.OnClick1)); // (3) 20 }, 21 OnClick2: function (go){ 22 UnityEngine.Debug.Log$$Object("onclick2 "); 23 } 24 } 25 }; 26 JsTypes.push(test0610);
这里的重点是 $CombineDelegate,$RemoveDelegate。可以在 clrlibrary.javascript 中找到实现。
另外需要注意,在JS中,不管是 +=,-=,都会被转换为 = ,这个说明一个问题,就是,你不可能对一个 C# 中的 Delegate 同时使用 C# 函数和 JS 函数。因为 JS 使用=了。这个没什么问题,通常也不需要那么做。
没有测试过反射,尽可能不用反射相关代码,除非你对代码非常熟悉了。
不支持不安全代码(char*等),SharpKit 不支持。
不要在JS中操作大量的二进制数据(例如int数组、byte[]),因为C# <-> C <-> JS 传递时性能极差。建议将所有二进制操作都封装在C#。
以后会考虑特殊处理byte[]参数,将其用类包装起来,包装后byte[]仍然只存在于C#,可以用于在C#不同函数之间进行快速传递。
返回: