|
方式1:映射到delegate[*推荐使用]
优点:性能好,类型安全
缺点:要生成代码(如果没有生成代码会抛InvalidCastException异常)
多返回值要怎么处理?
从左往右映射到c#的输出参数,输出参数包括返回值,out参数,ref参数。
参数、返回值类型支持哪些呢?都支持,各种复杂类型,out,ref修饰的,甚至可以返回另外一个delegate。
delegate的使用就更简单了,直接像个函数那样用就可以了。
---[下面通过一个案例了解具体如何使用]---
1.新建一个 CSharpCallLua.lua.txt 脚本(代码如下)- --[[测试C#访问lua脚本中的 function 类型]]
- --测试调用无参数且无返回值函数
- function PrecMyFunc1()
- print("PrecMyFunc1 调用无参数且无返回值函数")
- end
- --测试调用有2个参数,无返回值函数
- function PrecMyFunc2(num1,num2)
- print("PrecMyFunc2 调用有参数,无返回值函数 num1+num2:"..num1+num2)
- end
- --测试调用有3个参数,无返回值函数
- function PrecMyFunc3(num1,num2,num3)
- print("PrecMyFunc3 调用有参数,无返回值函数 num1+num2+num3:"..num1+num2+num3)
- end
- --测试调用有参数,单个返回值函数
- function PrecMyFunc4(num1,num2)
- print("PrecMyFunc4 调用有参数,单个返回值函数 num1+num2:"..num1+num2)
- return num1+num2
- end
- --测试调用有参数,多返回值函数
- function PrecMyFunc5(num1,num2)
- local res = num1+num2
- print("PrecMyFunc5 调用有参数,多返回值函数 num1+num2:"..num1+num2)
- return num1,num2,res
- end
复制代码 2.新建一个c#脚本,命名为“CSharpCallFunctionByDele”(代码如下)- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using XLua;
- using System;
- /// <summary>测试C#调用lua Function类型,方式一:映射到delegate</summary>
- public class CSharpCallFunctionByDele : MonoBehaviour
- {
- private LuaEnv m_LuaEnv;
- private delegate void DelAdding(int num1, int num2);
- private Action act = null;
- private DelAdding act2 = null;
- //注意:2个参数以上的委托定义,需要Lua配置文件支持
- private Action<int, int, int> act3 = null;
- //注意:这个类型委托定义,需要Lua配置文件支持
- private Func<int, int, int> act4 = null;
- [CSharpCallLua]
- public delegate void DelAddingMutilReturn(int num1, int num2, out int res1, out int res2, out int res3);
- private DelAddingMutilReturn act5 = null;
- private void Start()
- {
- m_LuaEnv = new LuaEnv();
- m_LuaEnv.DoString("require 'CSharpCallLua'");
- act = m_LuaEnv.Global.Get<Action>("PrecMyFunc1");
- act2 = m_LuaEnv.Global.Get<DelAdding>("PrecMyFunc2");
- act3 = m_LuaEnv.Global.Get<Action<int, int, int>>("PrecMyFunc3");
- act4 = m_LuaEnv.Global.Get<Func<int, int, int>>("PrecMyFunc4");
- act5 = m_LuaEnv.Global.Get<DelAddingMutilReturn>("PrecMyFunc5");
- //测试代码调用
- act();
- act2(10, 20);
- act3(10, 20, 30);
- int func4Res = act4(10, 20);
- Debug.Log("PrecMyFunc4 的返回结果:" + func4Res);
- //测试具有多返回值函数调用
- int func5Res1 = 0;
- int func5Res2 = 0;
- int func5Res3 = 0;
- act5(10, 20, out func5Res1, out func5Res2, out func5Res3);
- print(string.Format("PrecMyFunc5函数调用返回结果:res1:{0},res2:{1},res3:{2}", func5Res1, func5Res2, func5Res3));
- }
- private void OnDestroy()
- {
- //释放Lua环境之前,需要先将委托释放
- act = null;
- act2 = null;
- act3 = null;
- act4 = null;
- act5 = null;
- m_LuaEnv.Dispose();
- }
- }
复制代码 3. 在 ExampleGenConfig 脚本中,添加如下配置
4.要重新生成一下Xlua脚本
5.运行结果如下
方式2:映射到LuaFunction[*不推荐使用]
优点:使用简单、无需生成代码
缺点:性能不高,不推荐使用
---[下面通过一个案例了解具体如何使用]---
1.新建一个c#脚本,命名为“CSharpCallFunctionByLuaFun”(代码如下)- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using XLua;
- /// <summary>测试C#调用lua Function类型,方式二:映射到LuaFunction</summary>
- public class CSharpCallFunctionByLuaFun : MonoBehaviour
- {
- private LuaEnv m_LuaEnv;
- private void Start()
- {
- m_LuaEnv = new LuaEnv();
- m_LuaEnv.DoString("require 'CSharpCallLua'");
- LuaFunction luaFun1 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc1");
- LuaFunction luaFun2 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc2");
- LuaFunction luaFun3 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc3");
- LuaFunction luaFun4 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc4");
- LuaFunction luaFun5 = m_LuaEnv.Global.Get<LuaFunction>("PrecMyFunc5");
- //测试代码调用
- luaFun1.Call();
- luaFun2.Call(10, 20);
- luaFun3.Call(10, 20, 30);
- object[] luaFun4Res = luaFun4.Call(10, 20);
- print("PrecMyFunc4 函数调用返回值:" + luaFun4Res[0]);
- object[] luaFun5Res = luaFun5.Call(10, 20);
- print(string.Format("PrecMyFunc4 函数调用返回值:res1:{0},res2:{1},res3:{2}", luaFun5Res[0], luaFun5Res[1], luaFun5Res[2]));
- }
- private void OnDestroy()
- {
- m_LuaEnv.Dispose();
- }
- }
复制代码 2.运行结果如下
推荐学习资料
XLua入门到精通系列讲解教程目录
Xlua官方插件下载:里面有很多示例工程
lua基础教程:菜鸟教程网
欢迎对Unity技术感兴趣的朋友,加入QQ群:299412191 讨论 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|