1.输出lua脚本内容:
void Start () { TextAsset ta = Resources.Load<TextAsset>("helloworld.lua"); // 是 helloworld.lua.txt LuaEnv env = new LuaEnv();//最好一个游戏只有一个,它对应lua虚拟机,处于开销考虑 env.DoString(ta.text); //env.DoString("require 'helloworld'");// 或者是这样,helloworld.lua.txt env.Dispose(); }
2.自定义Loader
void Start () { LuaEnv env = new LuaEnv(); env.AddLoader(MyLoader); env.DoString("require 'test'"); env.Dispose(); } private byte[] MyLoader(ref string filePath) { string absPath = Application.streamingAssetsPath + "/" + filePath + ".lua.txt"; return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath)); }3.加载变量
double a = luaEnv.Global.Get<double>("a");//获取到lua里面的全局变量 a print(a); //1,通过class(struct) //值拷贝,改变任意一者,不会改变对方并且耗费性能 //可以吧类型加载到GCOptimize生成降低开销 Person p = luaEnv.Global.Get<Person>("person"); print(p.name + "-" + p.age + "-" + p.age2); p.name = "Sikiedu.com"; luaEnv.DoString("print(person.name)"); //2,通过interface //引用方式,方法里面第一个参数是隐藏参数,传递自身对象 //需要在interface前面加上特性 [CSharpCallLua] IPerson p = luaEnv.Global.Get<IPerson>("person"); print(p.name + "-" + p.age); p.name = "Sikiedu.com"; luaEnv.DoString("print(person.name)"); p.eat(12, 34);// p.eat(p,12,34); //3,通过Dictionary、List //轻量级 前提是table里面value和key类型需要一致 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(o); } //4,通过LuaTable,不推荐使用 //不需要生成代码,,但是很慢,比方式2慢一个数量级,而且没有类型检查 LuaTable tab = luaEnv.Global.Get<LuaTable>("person"); print(tab.Get<string>("name")); print(tab.Get<int>("age")); print(tab.Length);
class Person
{
public string name;
public int age;
public int age2;
}
[CSharpCallLua]
interface IPerson
{
string name { get; set; }
int age { get; set; }
void eat(int a,int b);
}
4.访问函数
//访问Lua中的全局函数 Action act1 = luaEnv.Global.Get<Action>("add"); act1(); act1 = null;//有绑定,没这一步没法释放env //1、映射到Delegate //性能好,类型安全,但是要生成很多代码 Add add = luaEnv.Global.Get<Add>("add"); int resa = 0; int resb = 0; int res = add(34, 78, out resa, out resb); print(res); print(resa); print(resb); add = null; //2、映射到LuaFunction //优缺点与前者正好相反 LuaFunction func = luaEnv.Global.Get<LuaFunction>("add"); object[] os= func.Call(1, 2);//可以传递任意类型参数,返回值是数组 foreach(object o in os) { print(o); } luaEnv.Dispose(); }
Lua写入C#
--实例化对象
CS.UnityEngine.GameObject("ss");
--Debug
print(CS.UnityEngine.Time.deltaTime);
--给静态变量赋值
CS.UnityEngine.Time.timeScale=0.5
--方法,把CS.UnityEngine作为一个变量存起来,简单还节省内存
local gameObject=CS.UnityEngine.GameObject
camera=gameObject.Find("MainCamera")
//使用.需要把自身作为第一个参数传递
cameraConmmpont=camera.GetComponent(camera."Camera")
//使用:不需要cameraConmmpont=camera:GetComponent(camera."Camera")