xlua的学习

using xlua;
//Demo1:lua环境
导入Asset文件 ,声明 lua环境
private LuaEnv luaenv;

luaenv=new LuaEnv();

luaenv.DoString("print('Hello World!')");//lua方法
luaenv.DoString("CS.UnityEngine.Debug.log('Hello world')"); 引擎方法
完成方法之后消除环境
luaenv.Dispose();


//Demo2:C#加载lua文件执行
方法1:创建lua文件 文件名称 :xx .lua.txt
TextAsset ta=Resources.Load<TextAsset>("Helloword.lua");

LuaEnv env=new LuaEnv();
env.DoString(ta.text);
env.Dispose;

方法2: LuaEnv env =new LuaEnv();
env.DoString("require 'helloworld'") //require相当于using,引入命名空间,并且执行,文件不用书写后缀名。loader加载 (虚拟机执行) lua内置 xlua也有

方法3:LuaEnv env=new LuaEnv(); //自定义 返回的是字节数组
 env.AddLoader(MyLoader);
env.DoString("require 'helloworld'"); //执行完自定义loader之后,如果找不到文件,就执行内置loader

env.Dispose();

private byte[] MyLoader(ref string filepath)
{
        print(filepath);//打印名称引擎方法
        string s="print(123)";
        return System.Text.Encoding.UTF8.GetBytes(s);
}

private byte[] MyLoader(ref string filepath) //读取对应的文件夹内容
{
        
        string s=Application.streamingAssetsPath+"/"+filePath+".lua.txt";

        return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
}

//Demo3 :C#访问lua变量
LuaEnv luaEnv=new LuaEnv(); lua变量少,C#变量多,C#要对应变量
luaEnv.DoString("require CSharpCallLua");//加载进虚拟机才能接受
double a=luaEnv.Global.Get<double>("a");
//Demo4 C#访问luatable
方法1//只能复制,双边不能修改对方
Person p=luaEnv.Global.Get<Person>("person");
p.name="Sikied.com";//不可修改
luaEnv.DoString("print(person.name)")
class Person  //声明类接受
{
public string name;
public int age;
public int age2;
 
}

方法2://可通过接口进行修改(推荐使用)
IPerson p=luaEnv.Global.Get<IPerson>("person");
p.name="Sikied.com";//可修改
luaEnv.DoString("print(person.name)")
p.eat();
[CSharpCallLua]
interface IPerson
{
 string name{get;set;}
 int age {get;set;}
 void eat();

}

lua文本 ://没有等于号("=”)C#默认不加载
person ={
 name="siki",age=100,12,2,2,2,
eat=function(self,a,b)   可为arg  //lua方法默认传输三个参数,第一个参数为自身的table
print(a+b);
end

方法可以放在table外
funtion person:eat(a,b)--默认带一个self的参数,代表当前的table
 print(a+b);

funtion person.eat(self,a,b)
 print(a+b);  

}
方法3 :可以通过Dictionary List筛选值
Dictionary<string,object> dict=LuaEnv.Global.Get<Dictionary<string,object>>("person");
foreach(string Key in dict.Keys)
{
       print(Key+"_"+dict[key]);

}

List<int> list=luaEnv.Global.Get<List<int>>("person");
foreach (object o in list)
{

   print(0)
}
luaEnv.Dispose();

方法4 :通过luatable (不推荐)
LuaTable tab=luaEnv.Global.Get<LuaTable>("person");
print(tab.Get<string>("name"));
print(tab.Get<int>("age"));


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用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、付费专栏及课程。

余额充值