找回密码
 立即注册
查看: 241|回复: 0

Xlua 使用

[复制链接]
发表于 2021-8-14 23:26 | 显示全部楼层 |阅读模式
一,热更新:
    当游戏出现某个功能的bug或者修复了某些功能,增加了某些功能时,我们不希望让玩家去重新下载安装包,一方面太不方便,在这不太人性化,所以要使用热更新,让玩家不需要下载安装包就可以更新。
好处:
   不浪费流量,不需要商店审核,不用重新安装就可以体验更新的内容。平时可以用c#开发,运行也是c#,性能更好。有bug时候发布个fix脚本,下次整体更新时在吧lua的实现换回c#实现,更新时甚至可以不重启游戏。
    本质上xlua只是一个插件,实现了lua和c#交互的插件。
    热更新使用lua的原因:
    程序安装包下载下来后,c#语言要先编译成dll,才能打进安装包,而lua这是源代码,可以直接下载替换使用。
二,Xlua使用:
  1,原作者介绍文章:xlua
   2,插件的导入:下载xlua的插件,可以去github上下载最新版本
       新建工程,将插件Assets下的文件夹拷贝到工程内。
   3, 在全局脚本中创建luaenv,建议全局唯一,有改变量来调用lua脚本。调用后要进行释放
       1.直接执行lua逻辑
  LuaEnv luaenv = new LuaEnv();        luaenv.DoString(@"            print('Lua访问特性标记的对象方法111111111111')        ");        luaenv.Dispose();        2,通过脚本文件
     LuaEnv luaenv;    // Use this for initialization    void Start()    {        luaenv = new LuaEnv();       //将文件注册进去 dostring 方法执行操作s 会执行loader 默认路径在resources文件夹下        luaenv.DoString("require'TestLua'");        luaenv.Dispose();    }       自定义loader的格式如下,这样文件可以放在任意位置,而不用限定在resources文件夹:
void Start () {        luaEnv = new LuaEnv();        luaEnv.AddLoader(Loader);//当未找到返回的文件时,会继续找,知道找到        luaEnv.DoString("require'TestLUa'");        luaenv.Dispose();    }  /// <summary>    /// 加载器    /// </summary>    /// <param name="filepath"></param>    /// <returns></returns>    private byte[] Loader(ref string filepath)    {        string foderPath = @"C:\Users\jdfs\Desktop\";        return Encoding.UTF8.GetBytes(File.ReadAllText(foderPath + filepath + ".lua"));    }     也可以使用resources加载txt文本,用lua来执行,文件后缀为.lua.txt;
  luaenv = new LuaEnv();        TextAsset ta=   Resources.Load<TextAsset>("File.lua");// resources会自动加.txt后缀        luaenv.DoString(ta.text);4,调用 lua文件如下
print("进入lua")--c#调用lua,建议使用delegate映射,性能较好 --1,映射luafunction function NoneArg()   print ("无参lua函数")   end  function OneArg(a)   print ("参数a-->",a)   end  function TwoArgs(a,b)    print ("两个参数,和-->",(a+b))   end   function MoreReturn(a,b)    print ("返回值多个",a,b)        return a+b,a,b,a-b        end c#调lua文件:
    LuaEnv luaenv;    // Use this for initialization    void Start()    {        luaenv = new LuaEnv();        luaenv.DoString("require'TestLua'");//将文件注册进去  dostring 方法执行操作s 会执行loader filepath=TestLUa        //函数访问          //使用委托映射 需要写更多代码,性能较好        nullArgfuc nu = luaenv.Global.Get<nullArgfuc>("NoneArg");        nu.Invoke();        nu = null;//移除映射关系,否则会抛异常        twoArgfuc two = luaenv.Global.Get<twoArgfuc>("TwoArgs");        two.Invoke(10, 5);        two = null;        BackArgs re = luaenv.Global.Get<BackArgs>("MoreReturn");        int b; int a;        int c = re.Invoke(20, 5, out a, out b);        Debug.Log(a + "___" + b + "____" + c);        re = null;        //使用luafunction 调用简单,性能略差        LuaFunction func = luaenv.Global.Get<LuaFunction>("OneArg");        object[] obs = func.Call(1, 2);        luaenv.Dispose();    }    [CSharpCallLua]    public delegate void nullArgfuc();    [CSharpCallLua]    public delegate void twoArgfuc(int a, int b);//只能使用int,其他类型会异常,需要配置类型    [CSharpCallLua]    public delegate int BackArgs(int a, int b, out int resa, out int resb);//若报错说需要注册此类型的,点xlua下的按钮生成对应类型
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 11:28 , Processed in 0.068091 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表