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

xlua的学习

[复制链接]
发表于 2021-8-13 10:23 | 显示全部楼层 |阅读模式
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"));
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-24 09:26 , Processed in 0.088828 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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