自定义Lua解析器管理器——-演化脚本V0.5

[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解析器管理器-------演化脚本V0.5

我们开始测试使用,其主要完成对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 

发表评论

相关文章