Unity中使用Lua,大多情況下是通過C#來調用Lua腳本。但如果想讓Lua像C#腳本那樣,可以掛載到GameObject 上該如何做呢?
一下是根據網絡上個大神的思路,整理的一段代碼實現Lua腳本掛載到GameObject 上。
這里使用的是XLua
[LuaCallCSharp] public class LuaComponent : MonoBehaviour { public LuaTable luaTable; LuaFunction luaStart; LuaFunction luaUpdate; LuaFunction luaOnDestroy ; LuaFunction luaAwake ; LuaFunction luaOnEnable; LuaFunction luaFixedUpdate; LuaFunction luaOnDisable; LuaFunction luaLateUpdate; /// <summary> /// 添加lua組件 /// </summary> /// <param name="go"></param> /// <param name="tableClass"></param> /// <returns></returns> public static LuaTable Add(GameObject go,LuaTable tableClass) { LuaFunction luaCtor = tableClass.Get<LuaFunction>("ctor"); if ( null != luaCtor) { object[] rets = luaCtor.Call(tableClass); if (1 != rets.Length) { return null; } LuaComponent cmp = go.AddComponent<LuaComponent>(); cmp.luaTable = (LuaTable)rets[0]; cmp.initLuaFunction(); cmp.CallAwake(); return cmp.luaTable; } else { throw new Exception("Lua function .ctor not found"); } } /// <summary> /// 獲取lua組件 /// </summary> /// <param name="go"></param> /// <param name="table"></param> /// <returns></returns> public static LuaTable Get(GameObject go,LuaTable table) { LuaComponent[] cmps = go.GetComponents<LuaComponent>(); string tableStr = table.ToString(); for(int i = 0; i < cmps.Length;i++) { string temp = cmps[i].luaTable.ToString(); if(string.Equals(tableStr,cmps[i].luaTable.ToString())) { return cmps[i].luaTable; } } return null; } /// <summary> /// 設置組件父節點 /// </summary> /// <param name="go"></param> /// <param name="parent"></param> public static void SetParent(GameObject go,Transform parent) { go.transform.SetParent(parent); } /// <summary> /// 初始化Lua腳本中的方法 /// </summary> void initLuaFunction() { luaOnDestroy = luaTable.Get<LuaFunction>("OnDestroy"); luaAwake = luaTable.Get<LuaFunction>("Awake"); luaStart = luaTable.Get<LuaFunction>("Start"); luaUpdate = luaTable.Get<LuaFunction>("Update"); luaOnEnable = luaTable.Get<LuaFunction>("OnEnable"); luaFixedUpdate = luaTable.Get<LuaFunction>("FixedUpdate"); luaOnDisable = luaTable.Get<LuaFunction>("OnDisable"); luaLateUpdate = luaTable.Get<LuaFunction>("LateUpdate"); } /// <summary> /// 調用lua腳本中定義的Awake方法 /// </summary> void CallAwake() { if ( null != luaAwake) { luaAwake.Call(luaTable, gameObject); } } /// <summary> /// 調用lua腳本中定義的Start方法 /// </summary> private void Start() { if ( null != luaStart) { luaStart.Call(luaTable, gameObject); } } /// <summary> /// 調用lua腳本中定義的Update方法 /// </summary> private void Update() { if (null != luaUpdate) { luaUpdate.Call(); } } /// <summary> /// 調用lua腳本中定義的FixedUpdate方法 /// </summary> private void FixedUpdate() { if (null != luaFixedUpdate) { luaFixedUpdate.Call(); } } /// <summary> /// 調用lua腳本中定義的OnDestroy方法 /// </summary> private void OnDestroy() { if (null != luaOnDestroy) { luaOnDestroy.Call(); } } /// <summary> /// 調用lua腳本中定義的 OnEnable /// </summary> private void OnEnable() { if (null != luaOnEnable) { luaOnEnable.Call(); } } /// <summary> /// 調用lua腳本中定義的 OnDisable /// </summary> private void OnDisable() { if (null != luaOnDisable) { luaOnDisable.Call(); } } /// <summary> /// 調用lua腳本中定義的 LateUpdate /// </summary> private void LateUpdate() { if (null != luaLateUpdate) { luaLateUpdate.Call(); } } }
以上LuaComponent.cs 是一個工具類,以幫助將Lua腳本掛載到一個GameObject 上。
一下是測試代碼,該代碼有一個C#腳本調用
require "TestCmp"
-- 將TestCmp 腳本掛載到當前GameObject上。
function addLuaScript()
local cmp1 = CS.LuaComponent.Add(self.gameObject, TestCmp)
cmp1.name = "TestCmp"
end
以下是 TestCmp.Lua
TestCmp = {
name = "TestCmp"
}
function TestCmp:Awake(gameObject)
print("GameObject "..gameObject.name)end
function TestCmp:Start()
print("TestCmp start...")
end
function TestCmp:OnEnable()
print("TestCmp OnEnable...")
end
function TestCmp:OnDestroy()
print("TestCmp OnDestroy...")
end
function TestCmp:OnDisable()
print("TestCmp OnDisable...")
end
function TestCmp:ctor(obj)
local o = {}
setmetatable(o,self)
self.__index = self
return o
end
