经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Lua » 查看文章
自定义Lua解析器管理器-------演化脚本V0.5
来源:cnblogs  作者:畅知  时间:2024/5/8 9:11:37  对本文有异议

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

方便我们在项目中使用Lua解析方法,我们封装管理一个lua解析器,管理LuaState的方法执行。

解析器脚本:

  1. using LuaInterface;
  2. namespace BaseFramework
  3. {
  4. /// <summary>
  5. /// 自定义的toLua解析器
  6. /// </summary>
  7. public class CallLuaManager:SingletonAutoMono<CallLuaManager>
  8. {
  9. private LuaState _luaState;
  10. /// <summary>
  11. /// 供外部获取使用的属性
  12. /// </summary>
  13. public LuaState LuaState
  14. {
  15. get
  16. {
  17. return _luaState;
  18. }
  19. }
  20. public void Init()
  21. {
  22. _luaState = new LuaState();
  23. _luaState.Start();
  24. //初始化委托工厂
  25. DelegateFactory.Init();
  26. }
  27. public void Require(string fileName)
  28. {
  29. _luaState.Require(fileName);
  30. }
  31. public void Dispose()
  32. {
  33. if(_luaState==null)
  34. return;
  35. _luaState.CheckTop();
  36. _luaState.Dispose();
  37. _luaState = null;
  38. }
  39. }
  40. }

image-20240508080302400

我们开始测试使用,其主要完成对Lua脚本中的全局变量的获取并赋值,Lua脚本中的无参无返回值函数调用、有参有返回值函数的四种方式调用,熟悉相关的API ,可以自行运行学习

  1. using System;
  2. using BaseFramework;
  3. using LuaInterface;
  4. using UnityEngine;
  5. using UnityEngine.Events;
  6. namespace CallLua
  7. {
  8. public class CallLuaEntrance:MonoBehaviour
  9. {
  10. private void Start()
  11. {
  12. CallLuaManager.Instance().Init();
  13. CallLuaManager.Instance().Require("Main");
  14. //获取全局变量
  15. Debug.Log(CallLuaManager.Instance().LuaState["string1"]);
  16. //无法获取lua脚本中的局部变量
  17. CallLuaManager.Instance().LuaState["string1"] = "我被修改了!";
  18. Debug.Log(CallLuaManager.Instance().LuaState["string1"]);
  19. //可以理解LuaState中存储的所有全局变量列表
  20. //如果有则可以查看并修改
  21. //如果没有则新建
  22. CallLuaManager.Instance().LuaState["newGloString"] = "我是新来的,是Lua全局变量";
  23. //获取执行无参无返回值的lua函数
  24. LuaFunction luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc");
  25. luaFunction.Call();
  26. luaFunction.Dispose();
  27. //直接获取
  28. luaFunction = CallLuaManager.Instance().LuaState["testFunc"] as LuaFunction;
  29. luaFunction.Call();
  30. luaFunction.Dispose();
  31. //存入委托中再使用
  32. luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc");
  33. UnityAction action = luaFunction.ToDelegate<UnityAction>();
  34. action();
  35. //-------------------------------------------------------------------------------------------------
  36. //有参有返回值函数获取调用 方式1
  37. luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc1");
  38. luaFunction.BeginPCall();
  39. luaFunction.Push(66);
  40. luaFunction.PCall();
  41. int res = (int)luaFunction.CheckNumber();
  42. Debug.Log("参数为"+66+" ,返回值为"+res);
  43. luaFunction.EndPCall();
  44. //通过函数的Invoke方法来调用 方式2
  45. //<参数类型,返回值类型>
  46. res = luaFunction.Invoke<int, int>(88);
  47. Debug.Log("参数为"+88+" ,返回值为"+res);
  48. //通过委托调用 方式3
  49. Func<int, int> func = luaFunction.ToDelegate<Func<int, int>>();
  50. res = func(99);
  51. Debug.Log("参数为"+99+" ,返回值为"+res);
  52. //通过解析器直接调用 方式4 和2本质上是一样的掉用方式
  53. res = CallLuaManager.Instance().LuaState.Invoke<int, int>("testFunc1", 166, true);
  54. Debug.Log("参数为"+166+" ,返回值为"+res);
  55. CallLuaManager.Instance().Dispose();
  56. }
  57. }
  58. }

其调用的lua测试脚本------Main.lua 放置在Lua文件夹下

  1. --主入口函数。从这里开始lua逻辑
  2. function Main()
  3. print("logic start")
  4. end
  5. Main()
  6. --场景切换通知
  7. function OnLevelWasLoaded(level)
  8. collectgarbage("collect")
  9. Time.timeSinceLevelLoad = 0
  10. end
  11. --全局变量
  12. string1 = "我是全局变量"
  13. function testFunc()
  14. print("无参无返回值函数调用成功!")
  15. end
  16. --有参数有返回值的函数
  17. function testFunc1(a)
  18. return a + 100
  19. end
  20. function OnApplicationQuit()
  21. end

原文链接:https://www.cnblogs.com/TonyCode/p/18178850

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号