1. 程式人生 > >xLua筆記(熱更新框架設計之Xlua基礎)

xLua筆記(熱更新框架設計之Xlua基礎)

熱 更新的 基本原理

 C#指令碼不能直接熱更新的原因:

下載的圖片與模型都沒有問題,如果是Unity邏輯程式碼,無論是以前的

Mono AOT 還是後面的il2cpp , 都是編譯成native code, IOS下是執行不起

來的。

 解決方法

就是不用native code ,改為解釋執行。包括Xlua在內所有熱更新就是這

個思路來實現。

 

Xlua外掛的GitHub 下載地址

https://github.com/Tencent/xLua

 作者對於Xlua外掛的整體介紹性文章

http://www.gad.qq.com/article/detail/24967

 

具體準備開發環境:

1:下載Xlua外掛,且匯入工程。

2: 把Xlua中的Xlua與Plugins 目錄直接拷貝到專案所在資料夾。成功拷貝後,

在Unity選單中可以看到出現"XLua"的選單項。


1.lua中使用冒號“:”表示成員方法的呼叫。它自動完成當前物件作為一個引數,傳入方法;lua中使用點“.”,則表示靜態屬性與方法呼叫,它需要手工往方法中傳遞當前物件。

2.冒號定義方法,預設會接受self引數,而點號定義的時候,預設不會接受self引數

3.lua中 classObj:Method()與 classObj.Method(classObj)一樣

 

1.lua 的欄位或者函式之間要用 ,(逗號)隔開

 

2.lua裡面的類或者table可以對映到C#裡面的Interface,C#裡面的Interface要用public修飾,並且要新增[CSharpCallLua]特性標籤

 

3.載入Resources檔案裡面的lua檔案:

 

  a.   env = new LuaEnv();

 

        env.DoString("require 'LuaCallCSharp'");

  b. env = new LuaEnv();

       TextAsset txtAsset = Resources.Load<TextAsset>("simpleLua.lua");

       env.DoString(txtAsset.text);

 

  c. LuaEnv env = null;

    // Use this for initialization

 

    string fileName = "CustomDIRLuaFile";

    void Start()

    {

        env = new LuaEnv();

        env.AddLoader(CustomMyLoader);

        env.DoString("require 'CustomDIRLuaFile'");

    }

 

    byte[] CustomMyLoader(ref string fileName)

    {

        string luaPath = Application.dataPath + "/Scripts/LuaScripts/" + fileName + ".lua";

 

        string strLuaContent = File.ReadAllText(luaPath);

 

        byte[] back=null;

        back = System.Text.Encoding.UTF8.GetBytes(strLuaContent);

        return back;

    }

 

uv:告訴貼圖如何貼在模型上

 

反轉法線

高亮 unlit/texture

 

                使用

1. 最基本是直接用LuaEnv.DoString執行一個字串,當然,字串得符合Lua語法

比如:luaenv.DoString("print('hello world')")

2. 載入 lua 檔案

 使用TextAsset 方式載入檔案:

Eg:

TextAsset ta=Resources.Load<TextAsset>("HelloWorld.lua");

LuaEnv env=new LuaEnv();

env.DoString(ta.text);

 

3. 載入 lua 檔案

 Require函式進行載入 (常用方式)

require 就是一個個的呼叫Loader ,查找出匹配的lua檔案,然後執行

該檔案。

注意事項:

1:因為Resource 只支援有限的字尾,放Resource下的lua檔案需要加上

txt字尾。

2:使用lua開發專案推薦的方式是:整個程式就一個

DoString(“require‘main’”), 然後在main.lua中載入其他指令碼。(這裡

的Main檔名稱可以任意)

3. 在xLua加自定義loader是很簡單的,只涉及到一個介面:

public delegate byte[] CustomLoader(ref string filepath);

public void LuaEnv.AddLoader(CustomLoader loader)

通過AddLoader可以註冊個回撥,該回調引數是字串,lua程式碼裡頭呼叫require時,引數將會透傳給回撥,回撥中就可以根據這個引數去載入指定檔案,如果需要支援除錯,需要把filepath修改為真實路徑傳出。該回調返回值是一個byte陣列,如果為空表示該loader找不到,否則則為lua檔案的內容。如下:

//lua環境(官方建議全域性唯一)

LuaEnv env = null;

private void Start()

{

env = new LuaEnv();

env.AddLoader(CustomMyLoader);

env.DoString("require 'CustomDIRLuaFile'");

}

/// <summary>

/// 定義回撥方法

/// 功能:

///     本方法主要功能是自定義lua檔案路徑。

/// </summary>

/// <param name="fileName">檔名稱</param>

/// <returns></returns>

private byte[] CustomMyLoader(ref string fileName)

{

byte[] byArrayReturn = null; //返回資料

//定義lua路徑

string luaPath = Application.dataPath + "/Scripts/LuaScripts/" + fileName + ".lua";

//讀取lua路徑中指定lua檔案內容

string strLuaContent = File.ReadAllText(luaPath);

//資料型別轉換

byArrayReturn = System.Text.Encoding.UTF8.GetBytes(strLuaContent);

return byArrayReturn;

}

 

不同lua檔案的載入方式分析:

 使用Require 方式載入lua檔案,必須放置在Resources特殊目錄下,否則

查詢不到無法載入。

 自定義Loader 可以進一步擴充套件前面兩種方法的弊端,可以按照自己的方

式進行載入lua與執行lua程式碼。(即:可以把*.lua檔案放置到任意合法文

件夾下,且lua檔案不用字尾增加txt標識。)

 require 本質是按照既定的查詢順序,找到需要的lua程式,否則返回

nil ,然後報錯。演示當查詢一個錯誤的lua檔案時候,控制檯詳細列印的

查詢路徑。

C#呼叫lua

Lua類:

--定義一個綜合表(lua中的OOP思想)屬性或方法中以逗號分隔

gameUser={

       name="崔永元",

       age=40,

       ID="18011112222",

       Speak=function()

              print("lua玩家在討論中")

       end,

       Walking=function()

              print("lua玩家在健身中")

       end,

       Calulation=function(age,num1,num2)--說明:age 這裡命名可以任意,表示當前物件(即:gameUser)

              return age.age+num1+num2

       end

}

 

1. 獲取 一個全域性基本 資料型別

 訪問LuaEnv.Global就可以了,上面有個模版Get方法,可指定返回的型別。

env = new LuaEnv();

            env.DoString("require 'CsharpCallLua'");

            string str1=env.Global.Get<string>("str");  //字串型別

            int num = env.Global.Get<int>("number");//數字型別

 

2. 訪問一個全域性 table
方式1: 對映到普通class或struct

定義一個class,有對應於table的欄位的public屬性,而且有無引數構

造函式即可,比如對於{f1 = 100, f2 = 100}可以定義一個包含

public int f1;

public int f2; 的class。

這種方式下xLua會幫你new一個例項,並把對應的欄位賦值過去。

table的屬性可以多於或者少於class的屬性。可以巢狀其它複雜型別。

 

方式2:對映到一個interface [*推薦方式]

這種方式依賴於生成程式碼(如果沒生成程式碼會拋InvalidCastException異

常),程式碼生成器會生成這個interface的例項。 如果get一個屬性,生成代

碼會get對應的table欄位,如果set屬性也會設定對應的欄位。甚至可以通過

interface的方法訪問lua的函式。

注意點與效能分析:

A: 介面需要新增特性標籤[CSharpCallLua],否則無法生成例項程式碼。

B: 為引用拷貝,適合用在複雜表,一般商業專案推薦使用本方式。

如下:

//定義介面

        [CSharpCallLua]

        public interface IGameLanguage

        {

            string str1 { get; set; }

            string str2 { get; set; }

            string str3 { get; set; }

            string str4 { get; set; }

        }

  //lua環境(官方建議全域性唯一)

        LuaEnv env = null;

 

        private void Start()

        {

            env = new LuaEnv();

            env.DoString("require 'CsharpCallLua'");

            //得到lua中的表資訊

            IGameLanguage gameLan = env.Global.Get<IGameLanguage>("gameLanguage");

            //輸出顯示

            Debug.Log("[使用介面]gameLan.str1="+ gameLan.str1);

            Debug.Log("[使用介面]gameLan.str2=" + gameLan.str2);

            Debug.Log("[使用介面]gameLan.str3=" + gameLan.str3);

            Debug.Log("[使用介面]gameLan.str4=" + gameLan.str4);

            //演示介面的引用拷貝原理

            gameLan.str1 = "我是修改後的內容";

            env.DoString("print('修改後gameLanguage.str1='..gameLanguage.str1)");

 

        }

 

 

Example: 通過interface ,呼叫lua中一個複雜一些的Table

public class CallLuaTableByInterfaceComp:MonoBehaviour

    {

        //lua環境(官方建議全域性唯一)

        LuaEnv env = null;

 

        private void Start()

        {

            env = new LuaEnv();

            env.DoString("require 'CsharpCallLua'");

            //得到lua中的表資訊

            IGameUser gameUser = env.Global.Get<IGameUser>("gameUser");

            //輸出顯示

            Debug.Log("[使用介面]gameLan.ID=" + gameUser.ID);

            Debug.Log("[使用介面]gameLan.Name=" + gameUser.name);

            Debug.Log("[使用介面]gameLan.Age=" + gameUser.age);

 

            //輸出呼叫方法

            gameUser.Speak();

            gameUser.Walking();

            int tmpResult=gameUser.Calulation(100,200);

            Debug.Log("經過lua中計算,結果= "+tmpResult);

 

        }

 

        private void OnDestroy()

        {

            //釋放luaenv

            env.Dispose();

        }

 

        //定義介面

        [CSharpCallLua]

        public interface IGameUser

        {

            string name { get; set; }

            int age { get; set; }

            string ID { get; set; }

 

            void Speak();

            void Walking();

            int Calulation(int num1, int num2);

 

        }

    }

方式3: by value 方式:

這是更輕量級的by value 方式,對映到Dictionary<>,List<> (適合用在

簡單表)不想定義class或者interface的話,可以考慮用這個,前提table下

key和value的型別都是一致的。如下:

//得到lua中的簡單表資訊

Dictionary<string, object>  dicGameLan=env.Global.Get<Dictionary<string, object>>("gameLanguage");//對映一個簡單表

 

            //得到lua中的複雜表信

Dictionary<string, object>  dicGameLan=env.Global.Get<Dictionary<string, object>>("gameUser");//對映一個複雜表


//得到一個更加簡單lua表,使用List<> 來對映。

List<string> liProLan=env.Global.Get<List<string>>("programLanguage");

 

Example:  講解使用委託的方式,呼叫Lua中具備多個返回數值的函式。

 *          1: 定義out 關鍵字的委託。

 *          2:定義ref 關鍵字的委託。
 

  //自定義委託(使用out關鍵字)

    [CSharpCallLua]

    public delegate void delAddingMutilReturn(int num1, int num2, out int res1, out int res2, out int res3);

    [CSharpCallLua]

    public delegate void delAddingMutilRetRef(ref int num1, ref int num2, out int result);

 

    public class CallLuaFunctionByDeleMultiReturn:MonoBehaviour

    {

        //lua環境(官方建議全域性唯一)

        LuaEnv env = null;

        //委託宣告

        delAddingMutilReturn act1 = null;

        delAddingMutilRetRef act2 = null;

 

        private void Start()

        {

            env = new LuaEnv();

            env.DoString("require 'CsharpCallLua'");

            ////得到lua中的具有多個返回數值的函式(通過委託out關鍵字來進行對映)

            //act1=env.Global.Get<delAddingMutilReturn>("ProcMyFunc5");

 

            ////輸出返回結果

            //int intOutRes1 = 0;

            //int intOutRes2 = 0;

            //int intOutRes3 = 0;

            //act1(100, 880,out intOutRes1, out intOutRes2, out intOutRes3);

            //Debug.Log(string.Format("res1={0},res2={1},res3={2}", intOutRes1, intOutRes2, intOutRes3));

 

            //得到lua中的具有多個返回數值的函式(通過委託ref關鍵字來進行對映)

            act2=env.Global.Get<delAddingMutilRetRef>("ProcMyFunc5");

 

            //輸出返回結果

            int intNum1 = 20;

            int intNum2 = 30;

            int intResult = 0;

 

            act2(ref intNum1, ref intNum2, out intResult);

            Debug.Log(string.Format("使用ref關鍵字,測試多輸出 res1={0},res2={1},res3={2}", intNum1,intNum2, intResult));

        }


方式4: by ref方式,對映到LuaTable類。

這種方式好處是不需要生成程式碼,但問題就是比較慢(即:效率低下),

比interface方式要慢一個數量級,比如沒有型別檢查。

效能分析:

因為效率較低,所以不推薦常用,適合用在一些較為複雜且使用頻率很

低的情況下,一般不推薦使用。如下:

env = new LuaEnv();

            env.DoString("require 'CsharpCallLua'");

            //得到lua中的複雜表資訊

            XLua.LuaTable tabGameUser=env.Global.Get<XLua.LuaTable>("gameUser");

 

            //輸出顯示

            Debug.Log("name="+tabGameUser.Get<string>("name"));

            Debug.Log("Age=" + tabGameUser.Get<int>("age"));

            Debug.Log("ID=" + tabGameUser.Get<string>("ID"));

 

            //輸出表中函式

            XLua.LuaFunction funSpeak=tabGameUser.Get<XLua.LuaFunction>("Speak");

            funSpeak.Call();

            XLua.LuaFunction funWalking = tabGameUser.Get<XLua.LuaFunction>("Walking");

            funWalking.Call();

 

            XLua.LuaFunction funCalulation = tabGameUser.Get<XLua.LuaFunction>("Calulation");

            object[] objArray=funCalulation.Call(tabGameUser, 10, 20);

            Debug.Log("輸出結果="+ objArray[0]);//輸出結果: 70

 

2. 訪問 一個全域性的
方式1: 對映到delegate [* 推薦方式]

優點: 這是建議的方式,效能好很多,而且型別安全。

缺點: (含有out與ref關鍵字delegate)要生成程式碼(如果沒生成程式碼會拋

InvalidCastException異常)。

注意:

A: 含有 out 與 ref 關鍵字委託也需要新增特性標籤[ [ CSharpCallLua] ]

B: 委託 引用後,退出 luaEnv 前,需要釋放委託引用,否則 lua 報錯 !

C: 對於 Unity 與 C# 中的複雜型別 API, 必須加入 Xlua 的配置檔案,經過生

成程式碼後才能正確應用。

例如: Action< int,int,int > 、 Func< < int,int,int >


delegate要怎樣宣告呢?

對於function的每個引數就宣告一個輸入型別的引數。

多返回值要怎麼處理?

從左往右對映到c#的輸出引數,輸出引數包括返回值,out引數,ref參

數。

引數、返回值型別支援哪些呢?

都支援,各種複雜型別,out,ref修飾的,甚至可以返回另外一個

delegate

public class CallLuaFunctionByDele:MonoBehaviour

    {

        //lua環境(官方建議全域性唯一)

        LuaEnv env = null;

        //自定義委託

        public delegate void delAdding(int num1, int num2);

        Action act = null;

        delAdding act2 = null;

        //注意: 以下兩種委託定義,需要配置檔案支援。

        Action<int, int, int> act3 = null;

        Func<int, int, int> act4 = null;

 

 

        private void Start()

        {

            env = new LuaEnv();

            env.DoString("require 'CsharpCallLua'");

            //得到lua中的函式資訊(通過委託來進行對映)

            act=env.Global.Get<Action>("ProcMyFunc1");

            //使用自定義委託呼叫具備兩個輸入引數的lua中的函式

            act2=env.Global.Get<delAdding>("ProcMyFunc2");

            //定義三個輸入引數的委託。

            act3 = env.Global.Get<Action<int, int, int>>("ProcMyFunc4");

            //定義具備返回數值,兩個輸入數值的委託

            act4 = env.Global.Get<Func<int, int, int>>("ProcMyFunc3");

 

            //呼叫

            act.Invoke();

            act2(50,60);

            act3(20, 30, 40);

            int intResult=act4(60,40);

            Debug.Log("Func 委託,輸出結果="+intResult);

 

        }

        private void OnDestroy()

        {

            act = null;

            act2 = null;

            act3 = null;

            act4 = null;

            //釋放luaenv

            env.Dispose();

        }

}

 

方式2: 對映到LuaFunction

優點: 無需生成程式碼

缺點: 效能不高,不推薦。

這種方式的優缺點剛好和第一種相反。使用也簡單。LuaFunction上有個

變參的Call函式,可以傳任意型別,任意個數的引數,返回值是object的數

組,對應於lua的多返回值。

private void Start()

        {

            env = new LuaEnv();

            env.DoString("require 'CsharpCallLua'");

            //得到lua中的函式資訊(通過LuaFunction來進行對映)

            LuaFunction luaFun=env.Global.Get<LuaFunction>("ProcMyFunc1");

            LuaFunction luaFun2 = env.Global.Get<LuaFunction>("ProcMyFunc2");

            LuaFunction luaFun3 = env.Global.Get<LuaFunction>("ProcMyFunc3");

            //呼叫具有多返回數值。

            LuaFunction luaFun4 = env.Global.Get<LuaFunction>("ProcMyFunc5");

 

            //輸出

            luaFun.Call();

            luaFun2.Call(10, 20);

            object[] objArray = luaFun3.Call(30, 40);

            Debug.Log("呼叫ProcMyFunc3 ,結果=" + objArray[0]);

 

            object[] objArray2=luaFun4.Call(22,80);

            Debug.Log(string.Format("測試多返回數值 res1={0},res2={1},res3={2}",objArray2[0], objArray2[1], objArray2[2]));

 

        }

 

官方使用建議:

A: 訪問lua全域性資料,特別是table以及function,代價比較大,建議

儘量少做,比如在初始化時把要呼叫的lua function獲取一次(對映到

delegate)後,儲存下來,後續直接呼叫該delegate即可。table也類似。

B: 如果lua實現的部分都以delegate和interface的方式提供,使用方

可以完全和xLua解耦: 由一個專門的模組負責xlua的初始化以及delegate、

interface的對映,然後把這些delegate和interface設定到要用到它們的地

方。

 

 

Lua呼叫C#

1. lua 訪問 C# 靜態屬性與 方法
基本方法:

使用CS開頭,例項化類。

在C#這樣new一個物件:

var newGameObj = new UnityEngine.GameObject();

對應到Lua是這樣:

local newGameObj = CS.UnityEngine.GameObject()
基本規則:

A: lua裡頭沒有new關鍵字。

B: 所有C#相關的都放到CS下,包括建構函式,靜態成員屬性、方法。

 如果有多個建構函式呢?

xlua支援過載,比如你要呼叫GameObject的帶一個string引數的構造函

數,這麼寫:

local newGameObj2 = CS.UnityEngine.GameObject('helloworld')
 

2. lua 訪問 C# 常用方式
 1. 方式1:訪問成員屬性與方法

讀成員屬性 testobj.DMF

寫成員屬性 testobj.DMF = 1024

呼叫成員方法 testobj:DMFunc()

注意:

lua中使用冒號,表示成員方法的呼叫。它自動完成把當前物件作為一

個引數,傳入方法。

lua中使用點,則表示靜態屬性與方法呼叫。它需要手工往方法中傳遞

當前物件。

 

2. 方式2:訪問父類屬性與方法

xlua支援(通過派生類)訪問基類的靜態屬性,靜態方法,(通過派生

類例項)訪問基類的成員屬性,成員方法。

 

3. 方式3: 訪問過載方法

Xlua 支援方法的過載,但為“有限過載”。直接通過不同的引數型別進

行過載函式的訪問,例如:

testobj:TestFunc(100)

testobj:TestFunc('hello')

將分別訪問整數引數的TestFunc和字串引數的TestFunc。
 

注意:

xlua只一定程度上支援過載函式的呼叫,因為lua的型別遠遠不如C#豐富,

存在一對多的情況,

比如C#的int,float,double都對應於lua的number,上面的例子中

TestFunc如果有這些過載引數,第一行將無法區分開來,只能呼叫到其中一

個(生成程式碼中排前面的那個)

 

 

3. lua 呼叫 C# 中帶參方法

 1. 方式1: C# 中可變引數方法

對於C#的如下方法:

void VariableParamsFunc(int a, params string[] strs)

可以在lua裡頭這樣呼叫:

testobj:VariableParamsFunc(5, 'hello', 'john')

 

 2. 方式2: C#結構體引數

lua 使用一個表,來對映C#的結構體。

 

 3. 方式3:C#介面引數

注意: 介面需要加入標記: [CSharpCallLua]

lua 使用一個表,來對映C#的介面。

 

 4. 方式4: C#委託引數

委託需要加入標記: [CSharpCallLua]

lua 使用一個函式,來對映C#的委託。

 

4. lua 接收 C# 方法返回的多個結果數值
 1. 基本規則: 引數的輸入輸出屬性(out,ref)

A: C#的普通引數算一個輸入形參,ref修飾的算一個輸入形參,out不算,

然後從左往右對應lua 呼叫的實參列表。

B: Lua呼叫返回值處理規則:

C#函式的返回值(如果有的話)算一個返回值,out算一個返回值,

ref算一個返回值,然後從左往右對應lua的多返回值。

 

5. lua 如何呼叫 C# 泛型方法
  基本規則:

lua 不直接支援C#的泛型方法,但可以通過擴充套件方法功能進行封裝後調

用。

 使用 Extension methods (擴充套件方法)技術就是C#中在不改變原始類的基

礎上,使用一種機制可以無限擴充套件這個類功能的機制。

Eg:

原始類為: A 擴充套件類為: Ext_A

注意: Ext_A 必須是一個靜態類,且擴充套件方法也必須是靜態的。方法的

引數中必須要有被擴充套件類作為其中一個引數,此引數前面必須有this 關鍵字

修飾。
 

6.Lua 呼叫其他 C# 知識點
  1. 引數帶預設值的方法

與C#呼叫有預設值引數的函式一樣,如果所給的實參少於形參,則會

用預設值補上。

 列舉型別

列舉值就像列舉型別下的靜態屬性一樣。

testobj:EnumTestFunc(CS.Tutorial.TestEnum.E1)

上面的EnumTestFunc函式引數是Tutorial.TestEnum型別的

 

 2. 委託與事件

delegate 屬性可以用一個luaFunction 來賦值(前面已經講過)

比如testobj裡頭有個事件定義是這樣:public event Action

TestEvent;

增加事件回撥

testobj:TestEvent('+', lua_event_callback)

移除事件回撥

testobj:TestEvent('-', lua_event_callback)

 

委託與事件(續)

delegate 使用 (呼叫,+,-)

注意:

A: 這裡lua中可以使用“+/-”操作符,來增加與減少一個委託的呼叫。

B: delegate 屬性可以用一個 luafunction 來賦值。

 

 委託與事件(續)

event使用

Eg:

public event Action TestEvent;

增加事件回撥:

testObj: TestEvent('+',lua_event_callback)

移除事件回撥:

testObj: TestEvent('-',lua_event_callback)

 

7. Lua 呼叫 C# 經驗總結

 1. 一: lua 呼叫C#,需要在Xlua中生成“適配程式碼”,則在這個類打入一個

[luaCallCSharp] 的標籤。

 二: 如果lua呼叫C#的系統API ,則無法拿到原始碼,無法打入標籤。則

使用“靜態列表”方式解決。

Eg:

public static List<Type> mymodule_LuaCallCS_List=new

List<Type>()

{

typeof(GameObject),

typeof(Dictionary<string,int>),

};

然後把以上程式碼放入一個靜態類中即可。

 

三: 實際開發過程中,lua 呼叫C# 用的比較多。

xlua 的優點體現的沒有必要每次改的時候,都要生成程式碼。主要原理是

依賴於編譯器環境下,利用反射來動態生成程式碼介面。

 四: 在標有“[XLua.LuaCallCSharp]”的C#類中,新增新的方法後,如

果是生成了程式碼類,則必須重新生成或者刪除,否則Xlua 用以前生成的,

進行註冊查詢,會出現lua 異常:“試圖訪問一個nil 的方法”

 

 

 

LuaCallCsharp.lua檔案

--詳細演示 lua Call C# 各種特性

--

print("測試lua檔案是否正確載入")

 

--[[  一: 學習 lua  呼叫 Unity 系統 API   ]]--

--1: lua 中例項化一個 Unity 的物件

local newGo=CS.UnityEngine.GameObject()

newGo.name="New GameObject"

 

--2: 查詢遊戲物體

--   學習lua 訪問Unity API 中靜態屬性與方法

local TxtGo=CS.UnityEngine.GameObject.Find("Txt_Logo");

--TxtGo.name="Modify Name"

 

--3: 得到遊戲物件上的元件,學習使用冒號與句號(":",“.”)

local txtLogo=TxtGo:GetComponent("UnityEngine.UI.Text")

txtLogo.text="公告系統"

 

 

--[[  二: 學習 lua  呼叫自定義C#指令碼   ]]--

local IsInvoked=CS.XluaPro.IsInvokedClass

local classObj=IsInvoked()   --自動呼叫父類與子類的建構函式

 

--呼叫普通方法

--classObj:Mehtod1()                               --ok

--classObj.Mehtod1()                         --語法報錯!

--classObj.Mehtod1(classObj)               --語法OK

 

--呼叫父類的欄位與方法

--classObj:ShowFatherInfo();              --呼叫父類的方法

--print(classObj.FatherClassName)         --呼叫父類的公共欄位

--print(classObj.ChildClassName)          --呼叫子類的公共欄位

 

--測試呼叫C#方法過載

--classObj:Method2(10,20)

--classObj:Method2("abc","def")

 

--測試C#中帶有params 關鍵字的方法

--local intResult=classObj:Method3(20,70,"Hello ","World","EveryOne")

--print("呼叫parmas關鍵字的方法,返回數值= "..intResult)

 

--測試lua呼叫C#中帶有結構體引數的方法

--定義一個表

--myStructTable={x="C#語言",y="lua語言"}

--classObj:Method4(myStructTable)

 

 

相關推薦

xLua筆記(更新框架設計Xlua基礎)

熱 更新的 基本原理  C#指令碼不能直接熱更新的原因: 下載的圖片與模型都沒有問題,如果是Unity邏輯程式碼,無論是以前的 Mono AOT 還是後面的il2cpp , 都是編譯成native code, IOS下是執行不起 來的。  解決方法 就是不用native

[Unity3D框架] LuaMVCXLua

1.Lua   本篇部落格內容本著“我們只是大自然的搬運工”這樣的理念,為大家快速入門Lua和學習使用XLua(Unity Lua程式設計解決方案)提供一個學習線路以方便快速上手使用LuaMVC框架(基於pureMVC+XLua開發的Unity熱更新框架

XLUA更新example執行的筆記

最近終於開始動xlua了 ,一開始官方的例子大都能執行,可到了Hotfix是就報錯了,在群裡問了下,結果 自己太馬虎都沒看專案的FAQ,被群裡的大佬們譏諷了一波,好難過,所以記錄下學習的過程 1、hotfix.md的原話:這個特性預設是關閉的,需要新增HOTF

客戶端更新框架UI框架設計(上)

pro 參考 校驗 版本 並行 技術分享 自己 加載項 很多 什麽是熱更新,為什麽需要熱更新?熱更新是目前各大手遊等眾多App常用的更新方式。簡單來說就是在用戶通過App Store下載App之後,打開App時遇到的即時更新。對於手遊客戶端來說,受到蘋果審核的約束, 一次審

XLua學習 更新步驟整理

前言 使用Xlua可以用lua語言覆蓋CS指令碼的內容。  這裡貼出官方的熱更新教程~ https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md 然後以下是本文大致的實現步驟:  1. 這裡使

站在巨人的肩上——Android更新框架Tinker探索

參考資料: 1.Tinker 2.Android 熱修復 Tinker接入及原始碼淺析 如果大家對tinker比較陌生,請先去看看tinker的wiki和鴻洋_大神的這篇文章 現在比較流行的熱修復框架的優缺點和特色,在Tinker的wiki下都可

【轉】: 《江湖X》開發筆談 - 更新框架

列表 ane lua 會有 數據文件 由於 嚴格 http服務 tex 前言 大家好,我們這期繼續借著我們工作室正在運營的在線遊戲《江湖X》來談一下熱更新機制以及我們的理解和解決方案。這裏先簡單的介紹一下熱更新的概念,熟悉這部分的朋友可以跳過,直接看我們的方案。 熱更新

Android開發——整合Tinker更新框架出現java.lang.NoClassDefFoundError

前言 在Android開發當中,Tinker熱更新是很常見的使用框架,但是我今天在整合的時候卻出現異響不到的事情,出現bug了。應用啟動出現Tinker.UncaughtHandler: TinkerUncaughtHandler catch exception

深度學習筆記——深度學習框架TensorFlowDNN深度神經網路的實現(十四)

DNN與CNN的本質差不多,只不過CNN加上了卷積層C以及池化層。做了卷積操作,引數共享減少了網路之間的連線引數。 DNN就是去掉C之後,使用全連線層+dropout下降+relu啟用,一層一層的WX+B的網路模式。

深度學習筆記——深度學習框架TensorFlowMLP(十四)

MLP多層感知器的使用,多層感知器,常用來做分類,效果非常好,比如文字分類,效果比SVM和bayes好多了。 感知器學習演算法基本介紹 單層感知器: 感知器(Single Layer Perceptron)是最簡單的神經網路,它包含輸入層和輸

應用程式框架設計前言 (轉)

要做一個應用程式框架的念頭Bigtall在幾年前就有了,因為在工作中發覺很多方面非常的不順手,幾乎每一個環節都存在這樣或者那樣的問題: 公司不同專案組做的設計是完全不同的風格,而且設計做不細,導致專案計劃越來越流於形式 各層程式碼凌亂,從後臺的java或者c#到前臺的htm

APP研發錄讀書筆記:網路底層框架設計

一.統一響應實體類Response      我們一般採用JSON作為API返回結果,資料格式一般為: { "errorCode":0, "errorMessage":""; "res

lua框架XLua

eric 開發 rap ons 框架 ++ 判斷 org ati 框架介紹 xLua是當下最流行的unity熱更方案之一,作者是騰訊的車雄生前輩,自2016年初推出以來,已經在騰訊的多款遊戲項目上應用,目前xLua已經開源到了GitHub。xLua最大的特色是不僅支持純lu

015-更新xlua語言二

urn info 而且 .text 賦值 image global space 時間 因為我們在前面已經花了大量的時間來學習lua,所以我們在本節就會結束xlua的部分。 2.3更輕量的by value方式:映射到dictionary<>,list<>

Xlua更新筆記

成員方法:通過物件呼叫 靜態方法:通過類呼叫 static全域性的,靜態方法只能放在靜態方法中,普通方法生命週期小於靜態方法(全域性的)如協程不能在靜態方法中呼叫 ***************************環境配置與匯入******************** 匯入

XLua實現基於MVC框架更新架構

1、將XLua的包匯入工程 2 -1、編寫程式的主入口指令碼GameMgr、用於啟動Lua程式 `public class GameMgr : MonoBehaviour { private void Awake() { gameObject.Ad

Unity3D遊戲輕量級xlua修復框架

一  這是什麼東西   前陣子剛剛整合xlua到專案,目的只有一個:對線上遊戲C#邏輯有Bug的地方執行修復,通過考察xlua和tolua,最終選擇了xlua,很大部分原因是因為專案已經到了後期,線上版本迭代了好幾次,所以引入Lua的目的不是為了開發新版本模組。xlua在我們的這種情況下很是適用

xLua 2.1.13 釋出,騰訊開源的手遊更新解決方案

   新增特性 新增AdaptByDelegate注入模式; 新增xlua.get_generic_method,用於呼叫泛型函式; 支援類似CS.System.Collections.Generic.List(CS.System.Int32)的泛型寫法; 注入新選項

ToLua更新LuaFramework框架資源更新(2)

1、建立物體 為了除錯的方便,筆者先將框架配置為本地模式,待測試熱更新時再改成更新模式。 圖:配置為本地模式 先測試個簡單的建立物體,新建一個名為go的物體,然後設定它的座標為(1,1,1)。這段程式碼雖然不涉及資源載入,但能展示“把物體新增到場景中”的過程。M

ToLua更新LuaFramework框架編寫Lua邏輯(3)

1、Lua的Update方法 第一篇“程式碼熱更新”演示了用lua列印HelloWorld的方法,第二篇“資源熱更新”演示了載入坦克模型的方法。這一篇要把兩者結合起來,用lua實現“用鍵盤控制坦克移動”的功能。用Lua和用c#編寫的Unity3D程式大同小異,只需正確使用A