本文共 3657 字,大约阅读时间需要 12 分钟。
首先在Lua脚本中写一些function
——访问无参function
using XLua;using UnityEngine;using System;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); Action act = luaenv.Global.Get("fun1"); act(); //LUA:fun1 act = null; luaenv.Dispose(); }}
——访问有参function 运行后会报错:这个类型必须添加[CSharpCallLua]的标识 所以我们需要映射到委托中,添加[CSharpCallLua]的标识 ——————正确的完整代码如下:
using XLua;using UnityEngine;using System;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); Add act = luaenv.Global.Get("fun2"); act(1,2); //LUA:3 act = null; luaenv.Dispose(); } [CSharpCallLua] delegate void Add(int a, int b);}
——访问有一个返回值的function
using XLua;using UnityEngine;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); Add act = luaenv.Global.Get("fun3"); string returnNum = act(1, 2); //LUA:3 print(returnNum); //一个返回值 act = null; luaenv.Dispose(); } [CSharpCallLua] delegate string Add(int a, int b);}
——访问有多个返回值的functionLua中的函数可以有多个返回值,而C#中的函数最多只能有一个返回值,那么如果Lua中的函数有多个返回值的情况下,C#如何获取到多个返回值呢? 可以映射到out或者ref参数来获取:
using XLua;using UnityEngine;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); Add act = luaenv.Global.Get("fun4"); int n1, n2; string n3; act(1, 2, out n1, out n2, out n3); //LUA:3 print(n1 + "-" + n2 + "-" + n3); //1-2-第三个返回值 act = null; luaenv.Dispose(); } [CSharpCallLua] delegate void Add(int a, int b, out int returnValue1, out int returnValue2, out string returnValue3);}
注意映射之后的Action对象引用了Lua虚拟机,所以使用完需要将Action对象置为空,不然会报错
与LuaTable相同,xLua也提供了一种直接访问Lua中函数的方法,同样性能很低,不推荐使用
——访问无参function
using XLua;using UnityEngine;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); LuaFunction act = luaenv.Global.Get("fun1"); act.Call(); //LUA:fun1 luaenv.Dispose(); }}
——访问有参function
using XLua;using UnityEngine;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); LuaFunction act = luaenv.Global.Get("fun2"); act.Call(1,2); //LUA:3 luaenv.Dispose(); }}
——访问有一个返回值的function
using XLua;using UnityEngine;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); LuaFunction act = luaenv.Global.Get("fun3"); object[] o=act.Call(1,2); //LUA:3 foreach (object temp in o) { print(temp); //一个返回值 } luaenv.Dispose(); }}
——访问有多个返回值的function
using XLua;using UnityEngine;public class CsCallLua : MonoBehaviour{ private void Start() { LuaEnv luaenv = new LuaEnv(); luaenv.DoString("require '1'"); LuaFunction act = luaenv.Global.Get("fun4"); object[] o=act.Call(1,2); //LUA:3 foreach (object temp in o) { print(temp); //1 //2 //第三个返回值 } luaenv.Dispose(); }}
转载地址:http://qtyvf.baihongyu.com/