Xlua 使用

 

 

 

一,热更新:

    当游戏出现某个功能的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下的按钮生成对应类型

 

使用XLua可以在Unity中实现Lua脚本的编写,同时也可以让Lua脚本与C#代码进行交互。 以下是基本的使用步骤: 1. 下载XLua插件并导入到Unity中。 2. 在Unity中创建一个新的Lua文件,编写Lua脚本代码。 3. 在C#代码中使用XLua的API来加载并运行Lua脚本,例如: ``` using XLua; public class LuaManager : MonoBehaviour { private LuaEnv luaEnv; void Awake() { luaEnv = new LuaEnv(); luaEnv.DoString("require 'main'"); // 加载并执行Lua脚本 } void Update() { luaEnv.Tick(); // 更新Lua环境 } void OnDestroy() { luaEnv.Dispose(); // 释放Lua环境 } } ``` 在上面的例子中,`Awake()`方法中创建了一个Lua环境,然后通过`DoString()`方法加载并执行了Lua脚本。`Update()`方法中每帧都调用了`Tick()`方法来更新Lua环境,`OnDestroy()`方法中释放了Lua环境。需要注意的是,在实际的项目中,可能需要更加复杂的逻辑和管理方式来处理Lua脚本的加载和运行。 4. 在Lua脚本中使用XLua提供的API来调用C#代码或者导出Lua模块,例如: ``` -- 导出一个Lua模块 local module = {} module.foo = function() print("Hello from Lua!") end return module -- 调用C#代码 local gameObject = CS.UnityEngine.GameObject("LuaObject") local transform = gameObject.transform transform.position = CS.UnityEngine.Vector3(1, 2, 3) ``` 在上面的例子中,导出了一个名为`module`的Lua模块,并定义了其中的一个函数`foo()`。同时,也调用了C#代码的API来创建了一个新的GameObject,并修改了它的Transform组件的位置。 XLua还提供了其他的功能,例如自定义导出规则、GC优化等。在使用XLua之前,建议先了解一些基本的Lua语法和C#与Lua交互的机制,以便更好地使用XLua
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值