JSBinding + SharpKit / 需要注意及不支持的列表

序列化

 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#不同函数之间进行快速传递。

 

 

返回:

Unity代码热更新方案 JSBinding + SharpKit 首页

你可能感兴趣的:(bind)