Unity3D 使用xLua

一、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#還是有很多不一樣的地方。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章