自己最近也在研究怎么用lua控制UI,然后看着網上介紹,決定選用XLua,畢竟TX爸爸出的,有人維護,自己琢磨着怎么用,於是弄出來一個能用的作為記錄。
當然,XLua主要是用於熱更新,我自己是拿來嘗試用一下看看怎么和C#交互進行的。
然后是XLua的下載地址:https://github.com/Tencent/xLua
下載完了之后,把Assect文件夾下的東西放在工程里面,引入命名空間XLua就可以使用了。
using System.IO; //引入這個空間是為了輸入路徑用 using UnityEngine; using XLua; //首先引入Xlua的命名空間 public class CSToLua : MonoBehaviour { // Use this for initialization void Start () { LuaEnv lua = new LuaEnv(); //首先必須要做這一步,類似new一個類的用法,只是這個換成了Lua lua.AddLoader(CustomLoader); //這個是將一個自定義載入的路徑給Lua,這樣就能在這個自定義路徑進行查找 lua.DoString("require 'MainLua'"); //這是載入一個名字為MainLua的lua腳本 } // Update is called once per frame void Update () { } private byte[] CustomLoader(ref string filepath) //這個是在網上查的,可以記下來作為一個API來使用,這個函數返回一個自定義路徑 { //重定向 可以在AB包里去讀取 也可以指定 本地的一個路徑 string str = Application.dataPath + "/Lua/" + filepath + ".lua"; Debug.Log(str); if( File.Exists(str)) return File.ReadAllBytes(str); return null; } }
這樣執行了之后,那么Luau中又是怎么執行的呢?而且unity中,又update這樣的生命周期函數,這些函數應該怎么用呢?接下來實現一下
首先,我們要在Unity中,建立一個委托,用來讓Update來不停執行它
using UnityEngine; public delegate void LuaUpdate(); public class LuaBehaviour : MonoBehaviour { public LuaUpdate luaUpdate; void Start () { }
// 將LuaUpdate委托放在Update周期函數里面一直執行 void Update () { if (luaUpdate != null) luaUpdate(); } }
之后我們就是要用lua去找到這個掛載的代碼,然后在lua中將需要反復執行的函數加入到LuaUpdate委托里面
--我把Lua掛載到ToLuaVoid這個物體上面的,所以先查找這個gameobject,用unity的時候,需要CS.(API所在的命名空間).Api
--至於什么時候用 ".",什么時候用":",我查過關系到是否傳入self,不過自己還沒理解,都是錯了后改,改着改着知道這里用什么符號。。(大家查下其他資料吧) luaBehaviour = CS.UnityEngine.GameObject.Find("ToLuaVoid"):GetComponent(typeof(CS.LuaBehaviour)) -- 這里獲取組件,要用typeof(類型),因為lua中沒有c# <T>這種泛型用法 local timeCount = 0 local function UpdataLua() timeCount = timeCount + CS.UnityEngine.Time.deltaTime print(timeCount) end luaBehaviour.luaUpdate = UpdataLua -- 將Lua中的函數加入到這個委托里面(第一次只能用 = ,不能 +=,因為會報空,但是在C#中,第一次使用就可以+=