用c#開發的時候,新建的腳本都默認繼承自Monobehaviour, 所以腳本纔有了本身的生命週期函數,如Awake,Start, Update, OnDestroy等。c#
在相應的方法中實現遊戲邏輯,引擎會適時調用。函數
而Lua在這裏作爲c#的一個外延語言,天然是不受Unity管理的。post
不過,在前幾篇文章中能看到,在XxxPanel和XxxCtrl中確實又有生命週期的影子,好比在MessagePanel.lua腳本中就存在MessagePanel.Awake和MessagePanel.OnDestroy方法。lua
經過日誌打印能知道,這些方法確實在相應的時候被執行了。spa
那他是怎麼實現的呢?日誌
這裏就又要說到LuaBheavour腳本了。code
一、LuaBehaviour是一個c#腳本
LuaBehaviour是一個c#腳本,在XxxPanel預製體被實例化的時候,被添加到了這個對象上,點擊每個實例化生成的窗口,都能看到這個腳本的存在。好比咱們以前實現的LoginPanel,見下圖:
二、LuaBehaviour腳本的內容
打開這個腳本,能直接看到Awake方法和Star方法數,從方法名稱就能猜到這個應該是Monobehaviour的生命週期函數,雖然這個腳本是繼承的View。對象
打開View的定義,發現View繼承Baseblog
繼續打開Base,能直到Base確實繼承自MonoBehaviour繼承
顯而易見的,LuaBehaviour中的Awake和Start是會被引擎調用的。而在Awake和Start中的調用語句:
Util.CallMethod(name, "Awake", gameObject);
Util.CallMethod(name, "Start");
應該就是對Lua腳本XxxPanel中相應函數的調用。
打開Util.CallMethod方法,能看到確實如此。
/// <summary> /// 執行Lua方法 /// </summary> public static object[] CallMethod(string module, string func, params object[] args) { LuaManager luaMgr = AppFacade.Instance.GetManager<LuaManager>(ManagerName.Lua); if (luaMgr == null) return null; return luaMgr.CallFunction(module + "." + func, args); }三、LuaBehaviour是被誰綁定的
LuaFramework實現了不少的管理類,用於C#和Lua的對接工做,好比GameManager、LuaManager、NetworkManager等,以及PanelManager。
在PanelManager裏,我找到了用於實例化窗口的方法CreatePanel,也看到了綁定LuaBehaviour的語句。迷題解開。
一、PanelManager實例化窗口的時候,給窗口對象綁定LuaBehaviour腳本;
二、LuaBehaviour腳本中的生命週期函數執行,從而驅動對應的Lua腳本中的生命週期函數執行。
遺留問題:
在XxxPanel中的和XxxCtrl中都存在Awake,那LuaBehaviour中的Awake到底調用的是哪個腳本上的方法呢?
這個應該須要研究一下LuaManager。
持續更新博客的計劃老是失敗,想了想,也許是前幾篇文章都寫得太長了吧。
以前每寫一篇,都要準備很久,寫完老是到半夜,疲憊得不行。致使後來一想到寫博,就有畏難情緒,就不想寫了。
從這篇開始,每篇少寫一點。但願每週都有輸出,不求多,但求堅持。