1. 将 xLua 加入现有项目中
    (1)从 xLua Git 地址 下载源码后解压;
    (2)将 Assets 文件夹中的全部文件,拷贝到现有项目的 Assets 文件夹中;
    (3)将 Tools 文件夹,拷贝到现有项目的 Assets 同级目录;
    (4)打开 08_Hotfix 示例场景,如下图所示:

    参考文档:
    项目地址:https://github.com/Tencent/xLua
    教程:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md
    常见问题(FAQ):https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md


  2. C# 加载 Lua 脚本
    (1)直接执行字符串
      
    (2)通过 Lua 的 require 加载文件
      注1:默认情况下只能加载 Resources 路径下,以 .lua.txt 为后缀名的 lua 脚本文件;
      注2:可通过自定义 Loader 从其他目录,加载其他后缀名的  lua 脚本文件。
      注3:官方文档 教程
       

      
  3. C# 访问 Lua
    (1)全局基本类型
    luaenv.Global.Get<int>("a")                                        //全局基本类型 Global.Get<类型>(“变量名”)
    luaenv.Global.Get<string>("b")
    luaenv.Global.Get<bool>("c")
    (2)全局 Table
    [CSharpCallLua]
    public interface ItfD
    {
        int f1 { get; set; }
        int f2 { get; set; }
        int add(int a, int b);
    }
    
    ItfD d3 = luaenv.Global.Get<ItfD>("d");                            //全局 table Global.Get<接口名>("变量名")
    d3.f2 = 1000;
    Debug.Log("_G.d = {f1=" + d3.f1 + ", f2=" + d3.f2 + "}");
    Debug.Log("_G.d:add(1, 2)=" + d3.add(1, 2));
    (3)全局 function
    [CSharpCallLua]
    public delegate int FDelegate(int a, string b, out DClass c);
    
    public class DClass
    {
        public int f1;
        public int f2;
    }
    
    FDelegate f = luaenv.Global.Get<FDelegate>("f");
    DClass d_ret;
    int f_ret = f(100, "John", out d_ret);    //lua的多返回值映射:从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数
    Debug.Log("ret.d = {f1=" + d_ret.f1 + ", f2=" + d_ret.f2 + "}, ret=" + f_ret);

     

  4. Lua 访问 C# 
    local UnityEngine = CS.UnityEngine
    local newGameObject = UnityEngine.GameObject()        --构造函数
    UnityEngine.Time.timeScale = 0.5                      --静态属性
    UnityEngine.Find('helloworld')                        --静态方法
    testobj.DMF = 1024                                    --成员属性
    testobj:DMFunc()                                      --成员方法(第一个参数需要传该对象,建议用冒号语法糖)

     

  5. 如何通过 Lua Fix C# 代码逻辑
    (1)给需要 Lua 修正逻辑的类打上 Hotfix 标签;
    (2)通过 xlua 的 xlua.hotfix(class, [method_name], fix)
    --把 C# 的 HotfixTest 类(继承于 MonoBehaviour)的 Update 函数替换成 lua 的实现
    xlua.hotfix(CS.HotfixTest, 'Update', function()
        print('Update in lua')
    end)


  6. 原理概览

     
     

posted on 2023-10-10 15:52  青叶煮酒  阅读(325)  评论(0编辑  收藏  举报