腾讯XLua 01-lua来写MonoBehaviour

前几天腾讯开源了热更新矿建XLua,今天开始第一天的学习(每天更新)

Example

1.C# 与lua的互相调用

public class Helloworld : MonoBehaviour {
    // Use this for initialization
    void Start () {
        // 用luaenv虚拟机 来电泳lua语句, lua 语句通过已经绑定的Debug.Log 调用C#的Debug.Log
         XLua.LuaEnv luaenv = new XLua.LuaEnv();
         luaenv.DoString("CS.UnityEngine.Debug.Log('Hello world')");

         //C#调用Lua 这边找到了 Lua的math库中的 max
         var max = luaenv.Global.GetInPath<LuaMax>("math.max");
         Debug.Log("max: " + max(32, 12)
         //释放 luaenv      
        luaenv.Dispose();
    }

    // Update is called once per frame
    void Update () {

    }
}

2.展示怎么用lua来写MonoBehaviour

[System.Serializable]
public class MyInjection {
    public string name;
    public GameObject value;
}

[LuaCallCSharp]
public class MyLuaBehaviour : MonoBehaviour {
    //在Unity Inspector面板中绑定 lua文件(.txt)
    public TextAsset luaScript;
    public MyInjection[] injections;
    //创建一个LuaEnv 实例对应Lua虚拟机,出于开销的考虑,建议全局唯一。
    internal static LuaEnv myLuaEnv = new LuaEnv();
    //记录最一次GC时间
    internal static float lastGCTime = 0;
    internal const float GCInterval = 1;
    //创建三个Action用于绑定lua脚本中的函数
    private Action luaStart;
    private Action luaUpdate;
    private Action luaOnDestroy;

    private LuaTable scriptEnv;

    void Awake() {
        scriptEnv = myLuaEnv.NewTable();

        LuaTable meta = myLuaEnv.NewTable();
        meta.Set("__index", myLuaEnv.Global);
        scriptEnv.SetMetaTable(meta);
        meta.Dispose();

        scriptEnv.Set("self", this);
        foreach (var injection in injections) {
            scriptEnv.Set(injection.name, injection.value);
        }
        //执行脚本 给scriptEnv 赋值
        myLuaEnv.DoString(luaScript.text, "MyLuaBehaviour", scriptEnv);
        //对Action绑定对应的 lua函数
        Action luaAwake = scriptEnv.Get<Action>("awake");
        scriptEnv.Get("start", out luaStart);
        scriptEnv.Get("update", out luaUpdate);
        scriptEnv.Get("ondestroy", out luaOnDestroy);
        //在对应函数中执行 luaAction
        if (luaAwake != null) {
            luaAwake();
        }
    }

    // Use this for initialization
    void Start () {
        if (luaStart != null) {
            luaStart();
        }
    }

    // Update is called once per frame
    void Update () {
        if (luaUpdate != null) {
            luaUpdate();
        }
        //执行GC操作
        if (Time.time - LuaBehaviour.lastGCTime > GCInterval) {
            myLuaEnv.Tick();
            LuaBehaviour.lastGCTime = Time.time;
        }
    }

    void OnDestroy() {
        if (luaOnDestroy != null) {
            luaOnDestroy();
        }

        luaOnDestroy = null;
        luaUpdate = null;
        luaStart = null;
        scriptEnv.Dispose();
        injections = null;
    }
}

凌晨一点了,周五晚上继续 XLua 的 UIEvent
发布了9 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_20770509/article/details/54359726