XLua框架原理(一)
XLua框架原理(一)
LuaEnv 中調用的 initers 和 ObjectTranslator 的構造函數 XLua_Gen_Initer_Register__,在其中添加了生成中間代碼的回調方法,用于在 Lua 中訪問 c# 對象時生成必要的代碼。而 StaticLuaCallback.ImportType 方法在調用 import_type(fqn) 時,通過 translator 查找類型,確保 Lua 注冊表中存在相應的元表,以便在訪問不存在的元素時調用正確的查找邏輯。
導讀LuaEnv 中調用的 initers 和 ObjectTranslator 的構造函數 XLua_Gen_Initer_Register__,在其中添加了生成中間代碼的回調方法,用于在 Lua 中訪問 c# 對象時生成必要的代碼。而 StaticLuaCallback.ImportType 方法在調用 import_type(fqn) 時,通過 translator 查找類型,確保 Lua 注冊表中存在相應的元表,以便在訪問不存在的元素時調用正確的查找邏輯。
![](https://img.51dongshi.com/20241126/wz/18337225952.jpg)
在探討 XLua 框架原理時,我們首先聚焦于核心類 LuaEnv。LuaEnv 包含了 Lua 的狀態機 RealStatePrt、全局表 G 表、注冊表 LuaIndexes.LUA_REGISTRYINDEX 等關鍵元素。其構造函數主要進行了一系列初始化,包括調用 translator 進行翻譯、執行初始化代碼 DoString(init_xlua,"Init")、添加 c# 回調到 Lua 中等操作。其中,DoString 的調用至關重要,它定義了 Lua 中訪問 c# 對象時的具體行為。LuaEnv 中調用的 initers 和 ObjectTranslator 的構造函數 XLua_Gen_Initer_Register__,在其中添加了生成中間代碼的回調方法,用于在 Lua 中訪問 c# 對象時生成必要的代碼。而 StaticLuaCallback.ImportType 方法在調用 import_type(fqn) 時,通過 translator 查找類型,確保 Lua 注冊表中存在相應的元表,以便在訪問不存在的元素時調用正確的查找邏輯。在 init.lua 文件中,通過調用 import_type(fqn) 來實現 Lua 中對 c# 對象的訪問。這一過程涉及一系列回調和注冊,包括生成 GameObject 對象的 GetComponent 方法、transform 的 get 屬性和 layer 的 set 屬性,以及靜態方法和靜態屬性的生成。在創建 ObjectTranslator 對象后,會調用部分內置類型的__Register 方法,通過注冊回調實現方法和屬性的生成。Utils.BeginObjectRegister 方法用于給類添加元表,并設置相應的元方法,如 __gc 和 __tostring。注冊函數 RegisterFunc 則將指定函數設置到指定表中,如方法表、getter 表或setter 表。當在 Lua 中調用相應方法時,會訪問到注冊的函數。Utils.EndObjectRegister 方法生成閉包,并將其與類關聯,實現元方法的調用機制。gen_obj_indexer 方法用于生成閉包,實現 __index 和 __newindex 元方法的具體邏輯。每當訪問類成員方法或屬性時,會按照方法表、getter 表、arrayindexer 和 csindexer 等表的順序進行查找。如果未找到,會訪問父類的 base 表。這種機制確保了 Lua 和 c# 之間的無縫交互。以 GameObjectWrap 中的 _m_GetComponent 方法為例,說明了 Lua 如何訪問 c# 類的成員方法。方法中通過檢查參數類型,調用 translator 的相關函數獲取對象,實現對方法的調用。至此,我們完整地了解了 Lua 如何訪問 c# 對象的全部實現原理。最后,關于 Lua 如何持有 c# 對象的問題,將在后續文章中進行詳細介紹。
XLua框架原理(一)
LuaEnv 中調用的 initers 和 ObjectTranslator 的構造函數 XLua_Gen_Initer_Register__,在其中添加了生成中間代碼的回調方法,用于在 Lua 中訪問 c# 對象時生成必要的代碼。而 StaticLuaCallback.ImportType 方法在調用 import_type(fqn) 時,通過 translator 查找類型,確保 Lua 注冊表中存在相應的元表,以便在訪問不存在的元素時調用正確的查找邏輯。
為你推薦