zoukankan      html  css  js  c++  java
  • 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 首页

  • 相关阅读:
    EVIOCGNAME:Get Device Name
    Andriod Sensor HAL 分析
    通知内核你的设备 不支持llseek, 通过在你的 open 方法中调用nonseekable_open
    linux Gsensor驱动(bma250为例子)
    Linux输入子系统:输入设备编程指南 -- input-programming.txt
    Android UEventObserver 使用
    android switch模块
    linux里的驱动接口
    input subsystem 函数解释
    2.6 内核中的计时器 小结
  • 原文地址:https://www.cnblogs.com/answerwinner/p/4478735.html
Copyright © 2011-2022 走看看