zoukankan      html  css  js  c++  java
  • 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文件里控制逻辑了,这对热更新非常友好。

  • 相关阅读:
    EditText setError 图片不显示问题
    android TextView getlinecount返回0
    PANIC: Could not open AVD config file:
    case expressions must be constant expressions
    无法创建抽象类或接口“Newtonsoft.Json.JsonWriter”的实例
    Listview嵌套ListView 及包含button onItemClic失效问题
    errror initializing phoneGap:class not found
    动态添加ImageView 设置setPadding不起作用问题
    Parameter 参数替换成value
    Listview addHeaderView添加view报错
  • 原文地址:https://www.cnblogs.com/Tearix/p/7859808.html
Copyright © 2011-2022 走看看