Unity3D熱更新之LuaFramework篇[06]--Lua中是怎麼實現指令碼生命週期的

子非魚`發表於2019-07-09

前言

用c#開發的時候,新建的指令碼都預設繼承自Monobehaviour, 因此指令碼才有了自己的生命週期函式,如Awake,Start, Update, OnDestroy等。

在相應的方法中實現遊戲邏輯,引擎會適時呼叫。

而Lua在這裡做為c#的一個外延語言,自然是不受Unity管理的。

不過,在前幾篇文章中能看到,在XxxPanel和XxxCtrl中確實又有生命週期的影子,比如在MessagePanel.lua指令碼中就存在MessagePanel.Awake和MessagePanel.OnDestroy方法。

通過日誌列印能知道,這些方法確實在相應的時候被執行了。

那他是怎麼實現的呢?

這裡就又要說到LuaBheavour指令碼了。

 

LuaBehaviour實現的lua指令碼生命週期

1、LuaBehaviour是一個c#指令碼

LuaBehaviour是一個c#指令碼,在XxxPanel預製體被例項化的時候,被新增到了這個物件上,點選每一個例項化生成的視窗,都能看到這個指令碼的存在。比如我們之前實現的LoginPanel,見下圖:

 

2、LuaBehaviour指令碼的內容

開啟這個指令碼,能直接看到Awake方法和Star方法數,從方法名稱就能猜到這個應該是Monobehaviour的生命週期函式,雖然這個指令碼是繼承的View。

 

 開啟View的定義,發現View繼承Base

繼續開啟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);
        }

3、LuaBehaviour是被誰繫結的

LuaFramework實現了很多的管理類,用於C#和Lua的對接工作,比如GameManager、LuaManager、NetworkManager等,以及PanelManager。

在PanelManager裡,我找到了用於例項化視窗的方法CreatePanel,也看到了繫結LuaBehaviour的語句。迷題解開。

 

 總結

1、PanelManager例項化視窗的時候,給視窗物件繫結LuaBehaviour指令碼;

2、LuaBehaviour指令碼中的生命週期函式執行,從而驅動對應的Lua指令碼中的生命週期函式執行。

遺留問題:

在XxxPanel中的和XxxCtrl中都存在Awake,那LuaBehaviour中的Awake到底呼叫的是哪一個指令碼上的方法呢?

這個應該需要研究一下LuaManager。

感悟

持續更新部落格的計劃總是失敗,想了想,也許是前幾篇文章都寫得太長了吧。

之前每寫一篇,都要準備好久,寫完總是到半夜,疲憊得不行。導致後來一想到寫博,就有畏難情緒,就不想寫了。

從這篇開始,每篇少寫一點。希望每週都有輸出,不求多,但求堅持。

 

相關文章