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();
}
}
- 上一篇: xLua:一个LuaManager
- 下一篇: xLua:生成资源列表
local LuaTestScript = {}
function LuaTestScript:awake()
print(“lua awake…”)
end
return LuaTestScript
我的脚本改成这样,用doString之后,就拿不到awake函数了,求帮助~能否加一下Q呢。
如果lua脚本要继承该怎么做呢,请问
事实证明这种跟lua的交互方式还是不合适的,没有必要在每个对象上频繁地调用Update这种方法,并且跟C#唯一绑定的方式也不利于扩展。
常规的做法还是从C#这边起一个Main入口,后续的逻辑都由lua端自己控制,只把C#作为一个API接口层比较合适。
你说的lua脚本继承 不知道谁不是说的lua代码的继承, 这部分可以看看Lua面向对象方案相关的内容。