slua中,绑定lua文件到Monobehavior的一种方法

Posted Tearix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了slua中,绑定lua文件到Monobehavior的一种方法相关的知识,希望对你有一定的参考价值。

slua本身并不提供如何把一个lua文件绑定到一个预制中,就像一个普通的继承自monobehavior的自定义脚本那样,而tolua的框架却采用了拙劣的做法:

public class LuaBehaviour : Base {
        private string data = null;
        private AssetBundle bundle = null;
        private Dictionary<string, LuaFunction> buttons = new Dictionary<string, LuaFunction>();

        protected void Awake() {
            Util.CallMethod(name, "Awake", gameObject);
        }

        protected void Start() {
            Util.CallMethod(name, "Start");
        }

        protected void OnClick() {
            Util.CallMethod(name, "OnClick");
        }

        protected void OnClickEvent(GameObject go) {
            Util.CallMethod(name, "OnClick", go);
        }
}

所以我琢磨了一下,在slua框架下用下面脚本来完成绑定:

using UnityEngine;
using System.Collections;
using SLua;

public class LuaMonoBehavior : MonoBehaviour {
    public string V_LuaFilePath;

    LuaTable self;

    [CustomLuaClass]
    public delegate void UpdateDelegate(object self);

    UpdateDelegate ud;
    UpdateDelegate enabled;
    UpdateDelegate disabled;
    UpdateDelegate destroyd;

    // Use this for initialization
    void Start () {
        LuaState.main.doFile(V_LuaFilePath);
        self = (LuaTable)LuaState.main.run("main");
        var update = (LuaFunction)self["update"];
        var destroy = (LuaFunction)self["destroy"];
        var enablef = (LuaFunction)self["enable"];
        var disablef = (LuaFunction)self["disable"];
        if (update != null) ud = update.cast<UpdateDelegate>();
        if (destroy != null) destroyd = destroy.cast<UpdateDelegate>();
        if (enablef != null) enabled = enablef.cast<UpdateDelegate>();
        if (disablef != null) disabled = disablef.cast<UpdateDelegate>();
    }
    
    void OnEnable()
    {
        if (enabled != null) enabled(self);
    }

    void OnDiable()
    {
        if (disabled != null) disabled(self);
    }

    // Update is called once per frame
    void Update () {
        if (ud != null) ud(self);
    }
    
    void OnDestroy()
    {
        if (destroyd != null) destroyd(self);
    }
}

对一个新预制,我们只需要挂上LuaMonoBehavior脚本并加上对应Lua文件路径即可,然后就在你的lua文件里控制逻辑了。

以上是关于slua中,绑定lua文件到Monobehavior的一种方法的主要内容,如果未能解决你的问题,请参考以下文章

浅析一个lua文件窥slua工作机制

SLua 调试

slua,ulua,nlua,unilua这几种unity3D的lua插件各有啥优劣

关于SLua的性能问题

高效使用lua作为业务开发语言的秘诀在这里!

热更新--lua