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

1) 序列化不支持 public List<T>,其余都支持JSBinding+Bridge无此功能)

2015年11月5日 补充:序列化只处理 Field。目前发现 AnimationCurve 可以在编辑器里编辑,不过他没有 Field,全是 Property,所以不支持,正在想办法

 1 1 public int v; // 支持
 2  2 public GameObject go; // 支持
 3  3 public Transform trans; // 支持
 4  4 public int[] arrInt; // 支持
 5  5 public Vector3 v; // 支持
 6  6 [Serializable]
 7  7 public struct HandsomeGuyInfo {
 8  8     public int jjLength;
 9  9     public Vector3 jjDirection;
10 10     public string[] girlFriendNames;
11 11 };
12 12 public HandsomeGuyInfo[] infos; // 支持
13 13 public List<int> lst; // 不支持 List,请使用数组
View Code

有一点需要注意:如果一个 GameObject 绑定同一个脚本A(A将变成JS)不止一次,那么这个A将不能被其他脚本引用,因为无法区分是哪一个。

2) 菜单:[JSB | Add JsType Attribute for all structs and classes]JSBinding+Bridge无此功能)
可以执行多次,如果一个类或者结构体已经有 JsType 标签,并不会再次添加。但是有个限制,如果类同时有多个标签,JsType 必须是最靠近类定义的那一行。

注意:如果类有<T>,无法自动加 JsType,要手动加

 1  1 using UnityEngine;
 2  2 using System.Collections;
 3  3 
 4  4 using SharpKit.JavaScript;
 5  5 [JsType(JsMode.Clr,"../../StreamingAssets/JavaScript/SharpKitGenerated/2DPlatformer/Scripts/Gun.javascript")]
 6  6 public class Gun : MonoBehaviour
 7  7 {
 8  8     public GameObject rocketGO;                // Prefab of the rocket.
 9  9     public float speed = 20f;                // The speed the rocket will fire at.
10 10 
11 11     //........
12 12 }
View Code

3) 支持 C# 的Coroutine,具体请查看:JSBinding + SharpKit / Coroutine支持

4) 不要使用 as 操作符。转换成 JS 后会有额外判断开销。最好直接用强制转换JSBinding+Bridge不需要注意)

1 UnityEngine.Object obj = ...;
2 
3 GameObject go = obj as GameObject; // DON'T
4 GameObject go = (GameObject)obj; // GREAT

5) 目前数组只能做为输入。也是只当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 

6) 数组只支持1维哦。是指 JS->CS交互时只1维,如果你的代码后来全部转换成JS代码了,没有交互,那么应该是几维都可以。

7) 使用Debug.Log() 时,要显示地使用 ToString() 来构造字符串

1 Vector3 v = Vector3.one;
2 Debug.Log("v is " + v); // WRONG
3 Debug.Log("v is " + v.ToString()); // OK

8) 完全支持 List<>, Dictionary<>。

2015年11月5日 补充:建议是使用 JS 版本的 List 和 Dictionary。

2016年04月06号 补充:如果使用 JS 版本的 List ,性能好,但是有一个重要的限制:不可以在 JS 和 C# 之间传递 List 对象!参数可以改用数组。

 

10) 支持 delegate =操作,+=操作,-=操作。具体查看生成的JS代码就很好理解了。

举个例子吧,NGUI 中对 UIEventListener 的使用

// C#

 1  1 public class test0610 : MonoBehaviour {
 2  2     public UIButton btn;
 3  3 
 4  4     void Start () 
 5  5     {
 6  6         UIEventListener.Get(btn.gameObject).onClick += this.OnClick1; // (1)
 7  7         UIEventListener.Get(btn.gameObject).onClick += this.OnClick2; // (2)
 8  8     }
 9  9 
10 10     void OnClick1(GameObject go)
11 11     {
12 12         Debug.Log("onclick1 ");
13 13 
14 14         UIEventListener.Get(btn.gameObject).onClick -= this.OnClick1; // (3)
15 15     }
16 16     void OnClick2(GameObject go)
17 17     {
18 18         Debug.Log("onclick2 ");
19 19     }
20 20 }
View Code

// JS

 1  1 if (typeof(JsTypes) == "undefined")
 2  2     var JsTypes = [];
 3  3 var test0610 = {
 4  4     fullname: "test0610",
 5  5     baseTypeName: "UnityEngine.MonoBehaviour",
 6  6     assemblyName: "SharpKitProj",
 7  7     Kind: "Class",
 8  8     definition: {
 9  9         ctor: function (){
10 10             this.btn = null;
11 11             UnityEngine.MonoBehaviour.ctor.call(this);
12 12         },
13 13         Start: function (){
14 14             UIEventListener.Get(this.btn.get_gameObject()).onClick = $CombineDelegates(UIEventListener.Get(this.btn.get_gameObject()).onClick, $CreateDelegate(this, this.OnClick1)); // (1)
15 15             UIEventListener.Get(this.btn.get_gameObject()).onClick = $CombineDelegates(UIEventListener.Get(this.btn.get_gameObject()).onClick, $CreateDelegate(this, this.OnClick2)); // (2)
16 16         },
17 17         OnClick1: function (go){
18 18             UnityEngine.Debug.Log$$Object("onclick1 ");
19 19             UIEventListener.Get(this.btn.get_gameObject()).onClick = $RemoveDelegate(UIEventListener.Get(this.btn.get_gameObject()).onClick, $CreateDelegate(this, this.OnClick1)); // (3)
20 20         },
21 21         OnClick2: function (go){
22 22             UnityEngine.Debug.Log$$Object("onclick2 ");
23 23         }
24 24     }
25 25 };
26 26 JsTypes.push(test0610);
View Code

 

这里的重点是 $CombineDelegate,$RemoveDelegate。可以在 clrlibrary.javascript 中找到实现。

另外需要注意,在JS中,不管是 +=,-=,都会被转换为 = ,这个说明一个问题,就是,你不可能对一个 C# 中的 Delegate 同时使用 C# 函数和 JS 函数。因为 JS 使用=了。这个没什么问题,通常也不需要那么做。

11) 没有测试过反射,尽可能不用反射相关代码,除非你对代码非常熟悉了。

12) 不支持不安全代码(char*等),SharpKit 不支持。

13) 不要在JS中操作大量的二进制数据(例如int数组、byte[]),因为C# <-> C <-> JS 传递时性能极差。建议将所有二进制操作都封装在C#。

以后会考虑特殊处理byte[]参数,将其用类包装起来,包装后byte[]仍然只存在于C#,可以用于在C#不同函数之间进行快速传递。

14) GetComponent系列的函数,支持 GetComponent<基类>()!(2015年8月13号增加支持,查看 JSEngine.IsInheritanceRel 函数)

15) 目前脚本转换成JSComponent时,所有 public 且没有 [NonSerialized] 标签的变量都会被处理序列化,并没有判断变量的类型,(请看JSSerializerEditor.GetTypeSerializedFields)。如果你有不能序列化的类型的public变量,需要手动加上 [NonSerialized]。例如 JSBinding+Bridge不需要注意)

[NonSerilized]
public Dictionary<int, int> someDict;

 16) Object.FindObjectOfType不支持

 17) 所有继承自带<T>类(A)的子类只能共用A里的静态变量。这是 SharpKit 不支持,没办法。例如 (JSBinding+Bridge已支持)

 1 class A<T>
 2 {
 3      public static int v;
 4 }
 5 class B : A<B>
 6 {
 7 }
 8 class C : A<C>
 9 {
10 }
11 
12 B.v = "v of B";
13 C.v = "v of C";
14 // C# 会打印2个不同的值
15 // 但是转成 JavaScript 后,以下2个将会都打印 v of C,因为他们的 v 实际是同一个
16 print(B.v);
17 print(C.v); 
View Code

 18) 不可在循环内产生闭包,JavaScript无法正确闭包。可以使用一个Action来做,例如:(JSBinding+Bridge已支持)

1 Action<int> doAction = (i) => {
2     combats[i].OnCombatStarted = () => {};
3 };
4 
5 for (var i = 0; i < 3; i++) {
6     doAction(i);
7 }
View Code

19) 不可使用params不定参数关键字  2016/1/7 支持

JavaScript不支持,请使用数组。如果是在导出的C#类中包含params关键字则是可以的。

20) 禁止使用Linq(JSBinding+Bridge已支持)

iOS不支持,JavaScript不支持

21) 不可使用隐式转换(JSBinding+Bridge已支持)

22) 整数数除整数必须使用 jsimp.Misc.Floor 括起来  2016/1/7 支持

23) 不可使用partial

可使用继承处理已有partial  2016/2/5 支持

24) 如果一个 GameObject 初始 active=false,则他上面脚本的编辑器里赋值的public变量还不可访问。

public变量初始化是在Awake里做的,但是如果一个 GameObject 还没有被active,他的Awake还没有被调用,所以那些变量还无法使用!

 2016/02/25 支持了

 

返回:

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

posted on 2015-05-05 11:44  AnswerWinner  阅读(1944)  评论(0编辑  收藏  举报

导航