xLua熱更開發之一:初見xlua,你好

笑臉人發表於2020-11-04


本篇主要使用的是騰訊開源並且維護的xLua!地址在文末!

前言


劃重點:語言設計 根據《Lua程式設計》一書所說:在設計上,Lua語言從一開始就把簡單,高效,可嵌入,可擴充套件等作為自己的目標! 那麼對於我們的遊戲或者專案來說,熱更的模組,就代表我們可能需要嵌入到主程式中,那Lua完美的解決了我們的需求!而且使用Lua使得我們可以不用重新提包,只需要熱更資源和配置就可以修改線上的某些bug或者開啟新的活動模組!

劃重點:蘋果稽核 我們都知道蘋果稽核包一般需要幾天,而且提包過於頻繁可能會因為政策被打回! 一般情況,我們不是大更版本的話,某些小功能,我們希望使用熱更的方式來實現!比如小型的活動!而且蘋果支援使用lua熱更,放鬆了限制!


HelloWorld

從這裡開始我們的教程!學習任何語言都需要的Helloworld!

public class MyLua : MonoBehaviour
{
    LuaEnv luaEnv;
    private void Start()
    {
        luaEnv = new LuaEnv();
        //使用lua列印
        luaEnv.DoString("print('xLua!你好')");

        luaEnv.DoString("CS.UnityEngine.Debug.Log('xLua!你好')");
    }

    void OnDisable()
    {
        luaEnv.Dispose();//關閉lua環境
    }
}

列印結果:

在這裡插入圖片描述
在這裡插入圖片描述


讀取和書寫Lua程式碼

書寫lua,我們只需要新建文字文件!然後把字尾改成Lua
劃重點:文字格式 我們儲存的時候需要把格式改成UTF-8格式,不然我們讀取中文的時候會亂碼!如下圖所示:

劃重點:目錄層級 我們需要把我們書寫的Lua檔案放在指定的目錄下,並且讀取的時候需要按目錄層級去讀取!如下圖所示:
在這裡插入圖片描述

書寫Lua程式碼

print"Helloworld"

C#讀取lua程式碼

public class MyLua : MonoBehaviour
{
    LuaEnv luaEnv;
    private void Start()
    {
        luaEnv = new LuaEnv();
        //使用lua列印
        //luaEnv.DoString("print('xLua!你好')");

        //luaEnv.DoString("CS.UnityEngine.Debug.Log('xLua!你好')");

        luaEnv.DoString("require 'Lua/text'");
    }

    void OnDisable()
    {
        luaEnv.Dispose();//關閉lua環境
    }
}

列印結果

在這裡插入圖片描述


c#訪問Lua屬性

Lua

name="李四"
age = 20
person =
{
  name = "張三",
  age = 20,
}
function Helloworld()
print("你好!")
end

function CreatGameObj()
local newObj = CS.UnityEngine.GameObject("LuaCreateGameObject");
newObj :AddComponent(typeof(CS.UnityEngine.BoxCollider));
end

C#

public class MyLua : MonoBehaviour
{
    LuaEnv luaEnv;
    private void Start()
    {
        luaEnv = new LuaEnv();
        //使用lua列印
        //luaEnv.DoString("print('xLua!你好')");

        //luaEnv.DoString("CS.UnityEngine.Debug.Log('xLua!你好')");

        luaEnv.DoString("require 'Lua/slg'");

        //訪問單獨屬性
        string name = luaEnv.Global.Get<string>("name");
        int age = luaEnv.Global.Get<int>("age");
        Debug.Log("name: " + name + " age: " + age);

        //訪問類
        Person person = luaEnv.Global.Get<Person>("person");
        Debug.Log("name: " + person.name + " age: " + person.age);

        //訪問函式
        Action action = luaEnv.Global.Get<Action>("Helloworld");
        action?.Invoke();
    }

    void OnDisable()
    {
        luaEnv.Dispose();//關閉lua環境
    }

    class Person
    {
        public string name;
        public int age;
    }
}

參考文章:

XLua
Unity3D 熱更新方案(集合各位專家的彙總)
[Unity3D進階4-15]Lua熱更新

相關文章