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

使用自定义委托来调用lua脚本中的多返回值函数和长参数类型的函数。

先看代码,依旧是上篇文章中所贴的脚本。新增调用两个函数testFunc

  1. using System;
  2. using BaseFramework;
  3. using LuaInterface;
  4. using UnityEngine;
  5. using UnityEngine.Events;
  6. using Object = System.Object;
  7. namespace CallLua
  8. {
  9. public class CallLuaEntrance:MonoBehaviour
  10. {
  11. //+ 委托
  12. public delegate int CustomCallFunc(int a, out int b, out int c, out string d, out bool e);
  13. public delegate void CustomCallParams(int a, params Object[] objects);
  14. private void Start()
  15. {
  16. CallLuaManager.Instance().Init();
  17. CallLuaManager.Instance().Require("Main");
  18. //获取全局变量
  19. Debug.Log(CallLuaManager.Instance().LuaState["string1"]);
  20. //无法获取lua脚本中的局部变量
  21. CallLuaManager.Instance().LuaState["string1"] = "我被修改了!";
  22. Debug.Log(CallLuaManager.Instance().LuaState["string1"]);
  23. //可以理解LuaState中存储的所有全局变量列表
  24. //如果有则可以查看并修改
  25. //如果没有则新建
  26. CallLuaManager.Instance().LuaState["newGloString"] = "我是新来的,是Lua全局变量";
  27. //获取执行无参无返回值的lua函数
  28. LuaFunction luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc");
  29. luaFunction.Call();
  30. luaFunction.Dispose();
  31. //直接获取
  32. luaFunction = CallLuaManager.Instance().LuaState["testFunc"] as LuaFunction;
  33. luaFunction.Call();
  34. luaFunction.Dispose();
  35. //存入委托中再使用
  36. luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc");
  37. UnityAction action = luaFunction.ToDelegate<UnityAction>();
  38. action();
  39. //-------------------------------------------------------------------------------------------------
  40. //有参有返回值函数获取调用 方式1
  41. luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc1");
  42. luaFunction.BeginPCall();
  43. luaFunction.Push(66);
  44. luaFunction.PCall();
  45. int res = (int)luaFunction.CheckNumber();
  46. Debug.Log("参数为"+66+" ,返回值为"+res);
  47. luaFunction.EndPCall();
  48. //通过函数的Invoke方法来调用 方式2
  49. //<参数类型,返回值类型>
  50. res = luaFunction.Invoke<int, int>(88);
  51. Debug.Log("参数为"+88+" ,返回值为"+res);
  52. //通过委托调用 方式3
  53. Func<int, int> func = luaFunction.ToDelegate<Func<int, int>>();
  54. res = func(99);
  55. Debug.Log("参数为"+99+" ,返回值为"+res);
  56. //通过解析器直接调用 方式4 和2本质上是一样的掉用方式
  57. res = CallLuaManager.Instance().LuaState.Invoke<int, int>("testFunc1", 166, true);
  58. Debug.Log("参数为"+166+" ,返回值为"+res);
  59. //+ 新增内容
  60. //----------------------------多返回值函数----------------------------------------------------
  61. //001直接获取 执行结果 传统方式
  62. luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc2");
  63. luaFunction.BeginPCall();
  64. luaFunction.Push(566);
  65. luaFunction.PCall();
  66. int res1 = (int)luaFunction.CheckNumber();
  67. int res2 = (int)luaFunction.CheckNumber();
  68. int res3 = (int)luaFunction.CheckNumber();
  69. string res4 = luaFunction.CheckString();
  70. bool res5 = luaFunction.CheckBoolean();
  71. Debug.Log("多返回值函数数值结果--->"+res1+","+res2+","+res3+","+res4+","+res5);
  72. //002使用委托方式调用函数
  73. CustomCallFunc customCallFunc = luaFunction.ToDelegate<CustomCallFunc>();
  74. int b2, b3;
  75. string s2;
  76. bool bl;
  77. //注意 res接收第一个返回值 其它都按照out 变量赋值出
  78. int res0 = customCallFunc(788, out b2, out b3, out s2, out bl);
  79. Debug.Log("多返回值函数数值结果--->"+res0+","+b2+","+b3+","+","+s2+","+bl);
  80. //--------------------------------------------长参数函数调用--------------------------------
  81. luaFunction = CallLuaManager.Instance().LuaState.GetFunction("testFunc3");
  82. CustomCallParams customCallParams = luaFunction.ToDelegate<CustomCallParams>();
  83. customCallParams(1, 2, "tony", true, 666.66);
  84. //也可以直接调用 call用来调用void 类型函数
  85. luaFunction.Call<int,bool,float,string>(56,false,88.88f,"Chang");
  86. luaFunction.Call(98,365,false,88.88f,"Chang");//不给泛型也可以!
  87. CallLuaManager.Instance().Dispose();
  88. }
  89. }
  90. }

注意!在tolua中使用自定义委托时候,需要在Seting脚本中添加自定义委托,之后再重新Generate一下。

要调用的Main.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. --多返回值函数
  21. function testFunc2(e)
  22. print("多返回值函数执行")
  23. return e,e+100,e+200,"yes!",true
  24. end
  25. --变长参数函数
  26. function testFunc3(a,...)
  27. print("变长参数函数---")
  28. print(a)
  29. args = {...}
  30. for k,v in pairs(args) do
  31. print(k,v)
  32. end
  33. end
  34. function OnApplicationQuit()
  35. end

好了,现在自定义的lua解析管理器已经完善对lua中全局变量的访问修改和添加、以及多种函数类型的调用。

先到这里了,接下来要接着完善管理器的功能,敬请期待!

[4]自定义Lua解析器管理器-------演化脚本V0.7的更多相关文章

  1. WinServer-服务器管理器-从入门到放弃

    WIN7 远程服务器管理工具 看看这篇帖子,他们说可以在WIN7上通过服务器管理工具来管理服务器上的软件 https://social.technet.microsoft.com/Forums/zh- ...

  2. Django Managers管理器

    Managers class Manager 管理器是向Django模型提供数据库查询操作的接口.Django应用程序中每个模型至少有一个管理器. Manager names 默认情况下管理器的名字为 ...

  3. with和上下文管理器

    with和上下文管理器 如果你有时间阅读源码的习惯,可能会看到一些优秀的代码会出现带有with关键字的语句. 对于系统资源如文件,数据库连接,socket而言,应用程序打开这些资源并执行完业务逻辑之后 ...

  4. [置顶] Android布局管理器 - 详细解析布局实现

    布局管理器都是以ViewGroup为基类派生出来的; 使用布局管理器可以适配不同手机屏幕的分辨率,尺寸大小; 布局管理器之间的继承关系 : 在上面的UML图中可以看出, 绝对布局 帧布局 网格布局 相 ...

  5. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  6. 【Android 应用开发】AndroidUI设计之 布局管理器 - 详细解析布局实现

    写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ...

  7. SpringMVC自动封装List对象 —— 自定义参数解析器

    前台传递的参数为集合对象时,后台Controller希望用一个List集合接收数据. 原生SpringMVC是不支持,Controller参数定义为List类型时,接收参数会报如下错误: org.sp ...

  8. win2008以上的系统,在vmware esxi5.5里怎么使用自定义规范管理器?sysprep

    经过测试,原来08以上的系统自带了sysprep.exe,所以vcenter对08以上的系统直接使用自定义规范管理器即可,跟linux一样了.注意不要跟03一样写入了sn即可. vCenter可使用s ...

  9. AndroidUI设计之 布局管理器 - 详细解析布局实现

    写完博客的总结 : 以前没有弄清楚的概念清晰化 父容器与本容器属性 : android_layout...属性是本容器的属性, 定义在这个布局管理器的LayoutParams内部类中, 每个布局管理器 ...

  10. Django中自定义模型管理器(Manager)及方法

    1.自定义管理器(Manager) 在语句Book.objects.all()中,objects是一个特殊的属性,通过它来查询数据库,它就是模型的一个Manager.每个Django模型至少有一个ma ...

随机推荐

  1. 实现一个简单的echarts柱状图PythonFlask

    bar.html 1 <!DOCTYPE html> 2 <html style="height: 100%"> 3 <head> 4 < ...

  2. #Manacher,并查集#洛谷 3279 [SCOI2013]密码

    题目 分析 这些回文长度可以提供相等或者不等的信息, 不等的直接连边强制不等,相等用并查集合并连通块, 但是这样判断是\(O(n^2)\),考虑这些回文长度当用Manacher求时, 所有的回文长度都 ...

  3. #虚树,树形dp#CF613D Kingdom and its Cities

    洛谷题面 Codeforces 分析 若两个重要城市为一条边的两个顶点显然无解 否则考虑建一棵虚树,设\(dp[x]\)表示以\(x\)为根的子树最少需要摧毁的城市数, 令\(Siz[x]\)表示\( ...

  4. Jetty的console-capture模块

    console-capture模块用于记录Jetty运行时向标准输出和标准错误写出的信息. Java的标准输出流,即System.out. Java的标准错误流,即System.err. consol ...

  5. 使用OHOS SDK构建libwebp

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/webmproject/ ...

  6. OpenAtom OpenHarmony三方库创建发布及安全隐私检测

    OpenAtom OpenHarmony三方库(以下简称"三方库"或"包"),是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者快速开 ...

  7. 关于openGauss中的虚拟索引

    关于 openGauss 中的虚拟索引 作为曾经的 Oracle 资深使用者,对于 Oracle 11gR2 版本推出的 invisible Index 感觉一直很良好:因为这对于大部分情况下做优化是 ...

  8. HarmonyOS属性动画开发示例(ArkTS)

      介绍 利用ArkUI组件不仅可以实现属性变化引起的属性动画,也可以实现父组件状态变化引起子组件产生动画效果,这种动画为显式动画.效果如图所示: 相关概念 显式动画:提供全局animateTo显式动 ...

  9. linux 性能自我学习 ———— 软中断 [五]

    前言 linux 性能的自我学习. 正文 什么是软中断呢? 举一个网络的例子. linux 将中断处理过程分为两个阶段: 上半部用来快速处理中断,他在中断禁止模式下运行,注意是处理跟硬件紧密相关或时间 ...

  10. 重新整理.net core 计1400篇[八] (.net core 中的依赖注入的深入理解)

    生命周期策略 在实例Transient 和 Scoped 中,所以实现Idisposable 接口的服务实例会被当前IServiceProvider 对象保存起来,当IService 对象的Dispo ...