[3]自定义Lua解析器管理器-------演化脚本V0.5
方便我们在项目中使用Lua解析方法,我们封装管理一个lua解析器,管理LuaState的方法执行。
解析器脚本:
using LuaInterface; namespace BaseFramework { /// <summary> /// 自定义的toLua解析器 /// </summary> public class CallLuaManager:SingletonAutoMono<CallLuaManager> { private LuaState _luaState; /// <summary> /// 供外部获取使用的属性 /// </summary> public LuaState LuaState { get { return _luaState; } } public void Init() { _luaState = new LuaState(); _luaState.Start(); //初始化委托工厂 DelegateFactory.Init(); } public void Require(string fileName) { _luaState.Require(fileName); } public void Dispose() { if(_luaState==null) return; _luaState.CheckTop(); _luaState.Dispose(); _luaState = null; } } }
我们开始测试使用,其主要完成对Lua脚本中的全局变量的获取并赋值,Lua脚本中的无参无返回值函数调用、有参有返回值函数的四种方式调用,熟悉相关的API ,可以自行运行学习
using System; using BaseFramework; using LuaInterface; using UnityEngine; using UnityEngine.Events; namespace CallLua { public class CallLuaEntrance:MonoBehaviour { private void Start() { CallLuaManager.Instance().Init(); CallLuaManager.Instance().Require("Main"); //获取全局变量 Debug.Log(CallLuaManager.Instance().LuaState["string1"]); //无法获取lua脚本中的局部变量 CallLuaManager.Instance().LuaState["string1"] = "我被修改了!"; Debug.Log(CallLuaManager.Instance().LuaState["string1"]); //可以理解LuaState中存储的所有全局变量列表 //如果有则可以查看并修改 //如果没有则新建 CallLuaManager.Instance().LuaState["newGloString"] = "我是新来的,是Lua全局变量"; //获取执行无参无返回值的lua函数 LuaFunction luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc"); luaFunction.Call(); luaFunction.Dispose(); //直接获取 luaFunction = CallLuaManager.Instance().LuaState["testFunc"] as LuaFunction; luaFunction.Call(); luaFunction.Dispose(); //存入委托中再使用 luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc"); UnityAction action = luaFunction.ToDelegate<UnityAction>(); action(); //------------------------------------------------------------------------------------------------- //有参有返回值函数获取调用 方式1 luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc1"); luaFunction.BeginPCall(); luaFunction.Push(66); luaFunction.PCall(); int res = (int)luaFunction.CheckNumber(); Debug.Log("参数为"+66+" ,返回值为"+res); luaFunction.EndPCall(); //通过函数的Invoke方法来调用 方式2 //<参数类型,返回值类型> res = luaFunction.Invoke<int, int>(88); Debug.Log("参数为"+88+" ,返回值为"+res); //通过委托调用 方式3 Func<int, int> func = luaFunction.ToDelegate<Func<int, int>>(); res = func(99); Debug.Log("参数为"+99+" ,返回值为"+res); //通过解析器直接调用 方式4 和2本质上是一样的掉用方式 res = CallLuaManager.Instance().LuaState.Invoke<int, int>("testFunc1", 166, true); Debug.Log("参数为"+166+" ,返回值为"+res); CallLuaManager.Instance().Dispose(); } } }
其调用的lua测试脚本------Main.lua 放置在Lua文件夹下
--主入口函数。从这里开始lua逻辑 function Main() print("logic start") end Main() --场景切换通知 function OnLevelWasLoaded(level) collectgarbage("collect") Time.timeSinceLevelLoad = 0 end --全局变量 string1 = "我是全局变量" function testFunc() print("无参无返回值函数调用成功!") end --有参数有返回值的函数 function testFunc1(a) return a + 100 end function OnApplicationQuit() end