FeastSC 发表于 2021-8-13 09:47

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

方式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

end2.新建一个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;

   
    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);
      object[] luaFun5Res = luaFun5.Call(10, 20);
      print(string.Format("PrecMyFunc4 函数调用返回值:res1:{0},res2:{1},res3:{2}", luaFun5Res, luaFun5Res, luaFun5Res));
    }

    private void OnDestroy()
    {
      m_LuaEnv.Dispose();
    }

}2.运行结果如下


推荐学习资料

XLua入门到精通系列讲解教程目录
Xlua官方插件下载:里面有很多示例工程
lua基础教程:菜鸟教程网
欢迎对Unity技术感兴趣的朋友,加入QQ群:299412191 讨论
页: [1]
查看完整版本: XLua系列讲解_C#访问Lua中的function类型