木骰

xLua:一个LuaBehaiour

一个LuaBehaviour.基本上就是例子里带的LuaBehaviour了。做了一些修改,只是跟LuaManager关联起来了而已。
使用的时候只要设置一个lua文件名,然后调LuaManager的DoFile,由LuaManager去查找对应的lua脚本并加载。因为热更下来的PreFab会保留脚本的参数设置,只要这个脚本在本地已存在,所以完全可以把挂载了LuaBehaviour的prefab热更下来使用,并且保留对应的lua脚本。实现了一些Unity的生命周期方法,用来赋予lua Unity的生命周期。

lua.DoString的时候如果带上了第三个参数LuaTable env,则再DoString加载完Lua代码的时候会把这段代码的运行环境设置为带进去的这个LuaTable,作为一个新的模块。所以每个LuaBehaviour对应的lua脚本都是相互独立的,即使使用的是同一个luaFile。之前在toLua上实现这一步得在lua端自己建一个table并提供new方法,实现一个面向对象。而这里xLua已经帮我们做好了。

有时候会需要在别的lua代码里访问某一个LuaBehaviour对应的lua中的成员,但是却拿不到这个lua模块的引用,所以在LuaBehaviour中应该保留一个当初DoString传递的LuaTable即Lua模块的引用,并开成public。这样就可已通过GetComponent的方法先获取到LuaBehaviour,然后再访问scriptTable的方法访问到lua模块了。就跟C#开发的时候想要获取某个GameObject上的脚本一样。
当然这个LuaBehaviour还得打上LuaCallCSharp标签


[LuaCallCSharp]
public class LuaBehaviour : MonoBehaviour
{
    LuaManager lua { get { return LuaManager.Instance; } }
    public string luaFile;
    public LuaTable scriptTable { get; private set; }
    Action lua_Awake;
    Action lua_Start;
    Action lua_OnEnable;
    Action lua_OnDisable;
    Action lua_Update;
    Action lua_FixedUpdate;
    Action lua_LateUpdate;
    Action lua_OnDestroy;
    void Awake()
    {
        if (!string.IsNullOrEmpty(luaFile) && lua != null)
        {
            scriptTable = lua.NewTable(true);
            lua.DoFile(luaFile, scriptTable);
            scriptTable.Set("this", this);
            scriptTable.Get("Awake", out lua_Awake);
            scriptTable.Get("Start", out lua_Start);
            scriptTable.Get("OnEnable", out lua_OnEnable);
            scriptTable.Get("OnDisable", out lua_OnDisable);
            scriptTable.Get("Update", out lua_Update);
            scriptTable.Get("FixedUpdate", out lua_FixedUpdate);
            scriptTable.Get("LateUpdate", out lua_LateUpdate);
            scriptTable.Get("OnDestroy", out lua_OnDestroy);
        }
        if (lua_Awake != null)
            lua_Awake();
    }
    void Start()
    {
        if (lua_Start != null)
        {
            lua_Start();
        }
    }
    void OnEnable()
    {
        if (lua_OnEnable != null)
        {
            lua_OnEnable();
        }
    }
    void OnDisable()
    {
        if (lua_OnDisable != null)
        {
            lua_OnDisable();
        }
    }
    void Update()
    {
        if (lua_Update != null)
        {
            lua_Update();
        }
    }
    void FixedUpdate()
    {
        if (lua_FixedUpdate != null)
        {
            lua_FixedUpdate();
        }
    }
    void LateUpdate()
    {
        if (lua_LateUpdate != null)
        {
            lua_LateUpdate();
        }
    }
    void OnDestroy()
    {
        if (lua_OnDestroy != null)
        {
            lua_OnDestroy();
        }
        scriptTable.Dispose();
    }
}
— 于 共写了1980个字
— 文内使用到的标签:

3条回应:“xLua:一个LuaBehaiour”

  1. rambo说道:

    local LuaTestScript = {}

    function LuaTestScript:awake()
    print(“lua awake…”)
    end

    return LuaTestScript

    我的脚本改成这样,用doString之后,就拿不到awake函数了,求帮助~能否加一下Q呢。

  2. 啊啊说道:

    如果lua脚本要继承该怎么做呢,请问

    • 木骰说道:

      事实证明这种跟lua的交互方式还是不合适的,没有必要在每个对象上频繁地调用Update这种方法,并且跟C#唯一绑定的方式也不利于扩展。
      常规的做法还是从C#这边起一个Main入口,后续的逻辑都由lua端自己控制,只把C#作为一个API接口层比较合适。
      你说的lua脚本继承 不知道谁不是说的lua代码的继承, 这部分可以看看Lua面向对象方案相关的内容。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*