什么是LuaInterface
LuaInterface包括兩個核心庫一個是LuaInterface.dll,一個是Luanet.dll击吱,我們可以通過LuaInterface完成Lua和C#(CLR)之間的互相調(diào)用
1环壤,在C#中執(zhí)行訪問Lua代碼
Lua lua = new Lua(); //創(chuàng)建Lua解析器
lua["num"]=2; //定義一個num
lua["str"]="a string"; //定義一個字符串
lua.newTable("tab"); //創(chuàng)建一個表 tab={}
2锅减,取得lua環(huán)境中的變量
double num = (double)lua["num"];
string str = (string)lua["str"];
3篡殷,在C#中執(zhí)行Lua腳本文件,或者腳本字符串
lua.DoFile(“script.lua”);//執(zhí)行script.lua文件
lua.DoString("num=2");//執(zhí)行l(wèi)ua腳本
lua.DoString("str='a string'");
object[] retVals = lua.DoString("return num,str");//返回?cái)?shù)字和字符串
在熱更新中,只需要寫好解析lua腳本的代碼突诬,然后c#代碼不需要變動颂龙,只需要修改lua腳本就好,通過lua腳本控制游戲邏輯鳍咱。
如果調(diào)試出錯誤降盹,先查看Lua中編碼器中格式是以ANSI格式編碼的。然后再查看如下:
執(zhí)行MyLua.lua文件,先用Lua寫一個腳本谤辜,然后此腳本在luaInterface工程中
4蓄坏,lua和C#中類型的對應(yīng)
nil null
string System.String
number System.Double
boolean System.Boolean
table LuaInterface.LuaTable
function LuaInterface.LuaFunction
5仅胞,把一個C#方法注冊進(jìn)Lua的一個全局方法(C#中操作)
//把一個類中的普通方法注冊進(jìn)去
lua.RegisterFunction("NormalMethod",obj,obj.GetType().GetMethod("NormalMethod"))
lua.DoString(" NormalMethod()");
//把一個類的靜態(tài)方法注冊進(jìn)去
lua.RegisterFunction("StaticMethod",null,typeof(ClassName).GetMethod("StaticMethod"))
lua.DoString(" StaticMethod()")
6,在Lua中使用c#中的類
require “l(fā)uanet“//引入庫
--加載CLR的類型剑辫、實(shí)例化CLR對象
luanet.load_assembly(“System.Windows.Forms”)//加載C#里面的DLL(命名空間)
luanet.load_assembly("System.Drawing")
Form = luanet.import_type("System.Windows.Forms.Form")
StartPosition = luanet.import_type(“System.Windows.Forms.FormStartPosition”)//引入類型
(命名空間里面的類)
print(Form)
print(StartPosition)
在Lua中使用C#中的類創(chuàng)建對象的時(shí)候干旧,會自動匹配最合適的構(gòu)造方法
7-01,在Lua中訪問C#中的屬性和方法
Lua代碼中妹蔽,訪問C#對象的屬性的方式和訪問table的鍵索引一樣椎眯,比如obj.name 或者 obj["name"]
Lua代碼中,訪問C#對象的普通函數(shù)的方式和調(diào)用table的函數(shù)一樣胳岂,比如obj:method1()
7-02编整,在Lua中訪問C#中的方法-特殊情況
當(dāng)函數(shù)中有out或ref參數(shù)時(shí),out參數(shù)和ref參數(shù)和函數(shù)的返回值一起返回乳丰,并且調(diào)用的時(shí)候掌测,out參數(shù)不需要傳入
C#函數(shù)定義
class Obj{
int OutMethod1(int parameter1,out parameter2,out parameter3){
parameter2=34;parameter3=213;
return parameter1;
}
int OutMethod2(int parameter1,ref parameter2){
parameter2=parameter2+2;
return parameter1+parameter2;
}
}
Lua中的調(diào)用和返回值
obj:OutMethod1(34)
--out參數(shù)不需要參數(shù),這個返回一個table产园,里面的值為parameter1,parameter2,parameter3
(34,34,213)
obj:OutMethod2(10,10)
--ref參數(shù)需要傳入汞斧,返回一個table有兩個值(value1,value2)
當(dāng)有重載函數(shù)的時(shí)候,調(diào)用函數(shù)會自動匹配第一個能匹配的函數(shù)
可以使用get_method_bysig函數(shù)得到C#中指定類的指定參數(shù)的函數(shù)用法
luaMethod = get_method_bysig(Obj,"CSharpMethod","System.String")
luaMethod("siki")
8什燕,在Lua中注冊C#中的事件委托
在Lua中通過Add方法或者Remove方法把一個Lua的函數(shù)注冊或者注銷從C#中的事件委托中
function method()
end
obj.SomeEvent:Add(methodname(不用帶引號))