找回密码
 立即注册
查看: 275|回复: 0

XLua系列讲解_C#访问Lua中的function类型

[复制链接]
发表于 2021-8-13 09:47 | 显示全部楼层 |阅读模式
方式1:映射到delegate[*推荐使用]

优点:性能好,类型安全
缺点:要生成代码(如果没有生成代码会抛InvalidCastException异常)
多返回值要怎么处理?
从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。
---[下面通过一个案例了解具体如何使用]---
1.新建一个 CSharpCallLua.lua.txt 脚本(代码如下)
  1. --[[测试C#访问lua脚本中的 function 类型]]
  2. --测试调用无参数且无返回值函数
  3. function PrecMyFunc1()
  4.         print("PrecMyFunc1 调用无参数且无返回值函数")
  5. end
  6. --测试调用有2个参数,无返回值函数
  7. function PrecMyFunc2(num1,num2)
  8.         print("PrecMyFunc2 调用有参数,无返回值函数 num1+num2:"..num1+num2)
  9. end
  10. --测试调用有3个参数,无返回值函数
  11. function PrecMyFunc3(num1,num2,num3)
  12.         print("PrecMyFunc3 调用有参数,无返回值函数 num1+num2+num3:"..num1+num2+num3)
  13. end
  14. --测试调用有参数,单个返回值函数
  15. function PrecMyFunc4(num1,num2)
  16.         print("PrecMyFunc4 调用有参数,单个返回值函数 num1+num2:"..num1+num2)
  17.         return num1+num2
  18. end
  19. --测试调用有参数,多返回值函数
  20. function PrecMyFunc5(num1,num2)
  21.         local res = num1+num2
  22.         print("PrecMyFunc5 调用有参数,多返回值函数 num1+num2:"..num1+num2)
  23.         return num1,num2,res
  24. end
复制代码
2.新建一个c#脚本,命名为“CSharpCallFunctionByDele”(代码如下)
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using XLua;
  5. using System;
  6. /// <summary>测试C#调用lua Function类型,方式一:映射到delegate</summary>
  7. public class CSharpCallFunctionByDele : MonoBehaviour
  8. {
  9.     private LuaEnv m_LuaEnv;
  10.     private delegate void DelAdding(int num1, int num2);
  11.     private Action act = null;
  12.     private DelAdding act2 = null;
  13.     //注意:2个参数以上的委托定义,需要Lua配置文件支持
  14.     private Action<int, int, int> act3 = null;
  15.     //注意:这个类型委托定义,需要Lua配置文件支持
  16.     private Func<int, int, int> act4 = null;
  17.     [CSharpCallLua]
  18.     public delegate void DelAddingMutilReturn(int num1, int num2, out int res1, out int res2, out int res3);
  19.     private DelAddingMutilReturn act5 = null;
  20.     private void Start()
  21.     {
  22.         m_LuaEnv = new LuaEnv();
  23.         m_LuaEnv.DoString("require 'CSharpCallLua'");
  24.         act = m_LuaEnv.Global.Get<Action>("PrecMyFunc1");
  25.         act2 = m_LuaEnv.Global.Get<DelAdding>("PrecMyFunc2");
  26.         act3 = m_LuaEnv.Global.Get<Action<int, int, int>>("PrecMyFunc3");
  27.         act4 = m_LuaEnv.Global.Get<Func<int, int, int>>("PrecMyFunc4");
  28.         act5 = m_LuaEnv.Global.Get<DelAddingMutilReturn>("PrecMyFunc5");
  29.         //测试代码调用
  30.         act();
  31.         act2(10, 20);
  32.         act3(10, 20, 30);
  33.         int func4Res = act4(10, 20);
  34.         Debug.Log("PrecMyFunc4 的返回结果:" + func4Res);
  35.         //测试具有多返回值函数调用
  36.         int func5Res1 = 0;
  37.         int func5Res2 = 0;
  38.         int func5Res3 = 0;
  39.         act5(10, 20, out func5Res1, out func5Res2, out func5Res3);
  40.         print(string.Format("PrecMyFunc5函数调用返回结果:res1:{0},res2:{1},res3:{2}", func5Res1, func5Res2, func5Res3));
  41.     }
  42.     private void OnDestroy()
  43.     {
  44.         //释放Lua环境之前,需要先将委托释放
  45.         act = null;
  46.         act2 = null;
  47.         act3 = null;
  48.         act4 = null;
  49.         act5 = null;
  50.         m_LuaEnv.Dispose();
  51.     }
  52. }
复制代码
3. 在 ExampleGenConfig 脚本中,添加如下配置


4.要重新生成一下Xlua脚本


5.运行结果如下


方式2:映射到LuaFunction[*不推荐使用]

优点:使用简单、无需生成代码
缺点:性能不高,不推荐使用
---[下面通过一个案例了解具体如何使用]---
1.新建一个c#脚本,命名为“CSharpCallFunctionByLuaFun”(代码如下)
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using XLua;
  5. /// <summary>测试C#调用lua Function类型,方式二:映射到LuaFunction</summary>
  6. public class CSharpCallFunctionByLuaFun : MonoBehaviour
  7. {
  8.     private LuaEnv m_LuaEnv;
  9.     private void Start()
  10.     {
  11.         m_LuaEnv = new LuaEnv();
  12.         m_LuaEnv.DoString("require 'CSharpCallLua'");
  13.         LuaFunction luaFun1 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc1");
  14.         LuaFunction luaFun2 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc2");
  15.         LuaFunction luaFun3 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc3");
  16.         LuaFunction luaFun4 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc4");
  17.         LuaFunction luaFun5 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc5");
  18.         //测试代码调用
  19.         luaFun1.Call();
  20.         luaFun2.Call(10, 20);
  21.         luaFun3.Call(10, 20, 30);
  22.         object[] luaFun4Res = luaFun4.Call(10, 20);
  23.         print("PrecMyFunc4 函数调用返回值:" + luaFun4Res[0]);
  24.         object[] luaFun5Res = luaFun5.Call(10, 20);
  25.         print(string.Format("PrecMyFunc4 函数调用返回值:res1:{0},res2:{1},res3:{2}", luaFun5Res[0], luaFun5Res[1], luaFun5Res[2]));
  26.     }
  27.     private void OnDestroy()
  28.     {
  29.         m_LuaEnv.Dispose();
  30.     }
  31. }
复制代码
2.运行结果如下


推荐学习资料

XLua入门到精通系列讲解教程目录
Xlua官方插件下载:里面有很多示例工程
lua基础教程:菜鸟教程网
欢迎对Unity技术感兴趣的朋友,加入QQ群:299412191 讨论

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 09:43 , Processed in 0.090368 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表