一、Lua
Lua 是一種輕量小巧的腳本語言,用標準C語言編寫並以源代碼形式開放, 其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。
相比C# Lua不需要編輯即可執行,所以Lua可以很好地用在Unity3D程序的熱更新。
二、xLua
xLua是騰訊開發的開源Lua插件,它爲Unity,.Net,Mono等C#環境增加Lua腳本編程的能力,藉助xLua可以使lua代碼與C#相互調用。
所以xLua可以很方便地實現Lua在Unity3D中的使用。
xLua下載地址 https://github.com/Tencent/xLua
三、使用
配置環境
1.創建一個新的Unity工程
2.打開下載好的xLua文件,如圖
把Assets文件拷貝替換到新建的Unity工程即可。
這樣Unity工程裏就包含的xLua。
3.創建一個Txt文本作爲Lua腳本,如圖
Lua代碼實現打印輸出
創建一個空物體掛上LuaBehaviour腳本組件,並把剛創建好的lua txt文本拖到LuaScript上,如圖
打開LuaBehaviour腳本,如下有對腳本的部分解釋
//指定Lua腳本
public TextAsset luaScript;
public Injection[] injections;
//Lua虛擬機運行的一個上下文對象
internal static LuaEnv luaEnv = new LuaEnv(); //all lua behaviour shared one luaenv only!
internal static float lastGCTime = 0;
internal const float GCInterval = 1;//1 second
private Action luaStart;
private Action luaUpdate;
private Action luaOnDestroy;
//當前腳本執行環境
private LuaTable scriptEnv;
void Awake()
{
scriptEnv = luaEnv.NewTable();
// 爲每個腳本設置一個獨立的環境,可一定程度上防止腳本間全局變量、函數衝突
LuaTable meta = luaEnv.NewTable();
meta.Set("__index", luaEnv.Global);
scriptEnv.SetMetaTable(meta);
meta.Dispose();
//這裏添加註冊後,在Lua中使用self即爲this
scriptEnv.Set("self", this);
//註冊綁定其他對象
foreach (var injection in injections)
{
scriptEnv.Set(injection.name, injection.value);
}
//執行Lua腳本代碼
luaEnv.DoString(luaScript.text, "LuaTestScript", scriptEnv);
//添加生命週期函數
Action luaAwake = scriptEnv.Get<Action>("awake");
scriptEnv.Get("start", out luaStart);
scriptEnv.Get("update", out luaUpdate);
scriptEnv.Get("ondestroy", out luaOnDestroy);
if (luaAwake != null)
{
luaAwake();
}
}
上面已經有添加生命週期函數,所以我們可以加在Lua腳本加上這些方法函數
function awake()
print("awake")
end
function start()
print("Hellow")
end
保存後,運行輸出結果
調用Unity組件
把空物體改爲一個Cube
在 LuaBehaviourscript中有註冊self指代this
scriptEnv.Set("self", this);
所以在Lua中使用self即可訪問當前對象
接下來就在Lua代碼添加update函數,並實現立方體旋轉的邏輯
function update()
local speed = CS.UnityEngine.Time.deltaTime * 100
self.transform:Rotate(0,speed,0)
end
注意:Lua中調用方法使用的是“:”
這樣立方體就轉起來了。
我們也可以添加指代對象,如下
在Lua中輸出
function start()
print(myName)
end
即能打印出當前物體的名稱
訪問其它物體對象
LuaBehaviourscript中定義了一個如下結構體
public class Injection
{
public string name;
public GameObject value;
}
在組件上添加好要調用的物體和使用的名字即可通過該名字在Lua中訪問改物體了。
例如,創建一個播放音頻的對象
指定到Cube的LuaBehaviourscript組件中,如圖
接下來在Lua中實現播放音頻的方法
function start()
print(myName)
Audio:GetComponent("AudioSource"):Play()
end
保存運行就能實現音頻播放了。
四、小結
xLua的初步使用大概就是這樣了,要更熟練掌握的話除了更深入瞭解xLua插件外,還需要學習Lua的基本語法,它和C#還是有很多不一樣的地方。