[游戏开发][Unity] Xlua与C#互相调用规则

这篇具有很好参考价值的文章主要介绍了[游戏开发][Unity] Xlua与C#互相调用规则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一部分:Xlua调用C#

1、xlua获取C#的类并调用类的构造方法

--Lua获取C#类
local GameObjectClass = CS.UnityEngine.GameObject

--使用C#类New新对象
local newGameObj = GameObjectClass('helloworld')
print(GameObjectClass, newGameObj)

 2、xlua执行C#类的静态方法

静态方法无需获取类对象,获取到类直接执行

例1:

local FindObj = CS.UnityEngineGameObject.Find('helloworld')

local deltaTime = CS.UnityEngine.Time.deltaTime

--修改C#的静态属性
CS.UnityEngine.Time.timeScale = 0.5

例2

//C#代码
public class LuaEventUtility
{
    public static void Init(int value)
    {
        Debug.LogError("value:" + value);
    }
}
--调用C#带参静态方法
CS.LuaEventUtility.ParamFunction(1)

3、获取C#类对象,并调用类对象非静态方法

调用非静态方法一定要获取到具体的C#类对象!!!

例1:获取单例对象并调用非静态方法,Singleton是单例的一种写法,网上源码很多

//Singleton是单例,网上源码很多,获取一个Instance对象
public class LuaEventUtility:Singleton<LuaEventUtility>
{
    public void ParamFunction(int a)
        Debug.Log("ParamFunction a:" + a);
}
--调用C#带参静态方法
CS.LuaEventUtility.Instance.ParamFunction(1)

4、Lua向C#注册委托回调方法


public class LuaEventUtility:Singleton<LuaEventUtility>
{
    [CSharpCallLua]
    public delegate void NoTableDelegate(int param1);

    [CSharpCallLua]
    public delegate void TableDelegate(LuaTable tab,int param1);

    public static void DoTest1(LuaTable tab, string functionName)
    {
        NoTableDelegate callback = tab.Get<NoTableDelegate>(functionName);
        callback(1111);
    }
    public static void DoTest2(LuaTable tab, string functionName)
    {
        TableDelegate callback = tab.Get<TableDelegate>(functionName);
        callback(tab,2222);
    }
}

下面是Lua调用C#的代码,我这是模拟Xlua的工程,以类的方式实现交互

--创建--
function UI_Start:OnCreate(UIElement)
    CS.LuaEventUtility.DoTest1(self,"Test1Callback")

    self.Test2Example = "AAAA"
    CS.LuaEventUtility.DoTest2(self,"Test2Callback")
end

function UI_Start:Test1Callback(param)
    print("Test1, param: ".. tostring(param))
end

function UI_Start:Test2Callback(param)
    print("Test2, param: " .. param)
    print("Test2, example: " .. self.Test2Example)
end

[游戏开发][Unity] Xlua与C#互相调用规则

看Log日志发现:

Test1回调方法执行,但参数没有返回,

Test2参数打印正常,且table也传回来了,可以调用self

为何Test1的回调参数失败,由于上面的lua代码是传入的类内方法,换成table继续测试Test1,执行这个lua代码

        TestTable = {}
        TestTable.Test2Example = 'AAAA'

        function LuaStartUp()
            CS.LuaEventUtility.DoTest1(TestTable,'Test1Callback')
            CS.LuaEventUtility.DoTest2(TestTable,'Test2Callback')
        end
        function TestTable.Test1Callback(param)
            print('Test1, param: '.. tostring(param))
        end

        function TestTable.Test2Callback(tab,param)
            print('Test2, param: ' .. param)
            print('Test2, example: ' .. tab.Test2Example)
        end

        LuaStartUp()

[游戏开发][Unity] Xlua与C#互相调用规则

Test打印成功,参数也没有问题。

lua调用C#Action委托使用总结:

要点1:lua代码是不允许直接调用C#的delegate变量的,我看官方教程也是先把lua的table和luafunction通过一个方法传入到C#中,方法内完成lua回调方法和C#委托的绑定。

要点2:Lua调用C#方法的参数的类型必须提前加入到Lua环境中,不添加会报错

[游戏开发][Unity] Xlua与C#互相调用规则

ExampleConfig文件是官网demo给的添加参数例子,这里面把我们委托的参数都加进去,重新生成Lua

[游戏开发][Unity] Xlua与C#互相调用规则

要点3:打了标记记得运行一下Xlua的Generate Code

5、Lua向C#注册Action委托

public class LuaEventUtility:Singleton<LuaEventUtility>
{    
    [LuaCallCSharp]
    public event Action<int> ActionTest3;

    [LuaCallCSharp]
    public event Action<LuaTable,int, int> ActionTest4;

    public void DoTest3()
    {
        ActionTest3.Invoke(3333);
    }

    public void DoTest4(LuaTable tab)
    {
        ActionTest4.Invoke(tab, 4444, 5555);
    }
}

 下面是Lua调用C#的代码,我这是模拟Xlua的项目工程,以类的方式实现交互

--创建--
function UI_Start:OnCreate(UIElement)
    CS.LuaEventUtility.Instance:ActionTest3('+', self.Test3Callback)
    CS.LuaEventUtility.Instance:DoTest3()

    self.Test4Example = "BBBB"
    CS.LuaEventUtility.Instance:ActionTest4('+', self.Test4Callback)
    CS.LuaEventUtility.Instance:DoTest4(self)
end

function UI_Start:Test3Callback(param)
    print("Test3, param: " .. tostring(param))
end

function UI_Start:Test4Callback(param1,param2)
    print("Test4, param: " .. param1 .. "  ,param2: " .. param2)
    print("Test4, example: " .. self.Test4Example)
end

[游戏开发][Unity] Xlua与C#互相调用规则

看Log日志发现:

Test3回调方法执行,但参数没有返回,

Test4参数打印正常,且table也传回来了,可以调用self

Test3和调用委托的Test1出现了同样的问题,

换成table继续测试,执行这个lua代码

    TestTable = {}
    TestTable.Test4Example = 'BBBB'
    function TestTable.Test3Callback(param)
        print('Test3, param: ' .. tostring(param))
    end

    function TestTable.Test4Callback(tab,param1, param2)
        print('Test4, param: ' .. tostring(param1).. '  ,param2: ' .. tostring(param2))
        print('Test4, example: ' .. tab.Test4Example)
    end

    function LuaStartUp()
        CS.LuaEventUtility.Instance:ActionTest3('+', TestTable.Test3Callback)
        CS.LuaEventUtility.Instance:DoTest3()
        CS.LuaEventUtility.Instance:ActionTest4('+', TestTable.Test4Callback)
        CS.LuaEventUtility.Instance:DoTest4(TestTable)
    end

    LuaStartUp()

[游戏开发][Unity] Xlua与C#互相调用规则

打印成功 

lua调用C#Action委托总结:

要点1: lua代码调用 C#的 Action要用冒号,把C#Action当成是一个方法。

要点2:C#代码的Action要用  [CSharpCallLua]标记

要点3:打了标记记得运行一下Xlua的Generate Code

[游戏开发][Unity] Xlua与C#互相调用规则

下面是C#和Lua的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

public class TestLuaCallback : MonoBehaviour
{
    private LuaEnv _luaEnv;

    string str1 = @"
        TestTable = {}
        TestTable.Test2Example = 'AAAA'

        function LuaStartUp()
            CS.LuaEventUtility.DoTest1(TestTable,'Test1Callback')
            CS.LuaEventUtility.DoTest2(TestTable,'Test2Callback')
        end
        function TestTable.Test1Callback(param)
            print('Test1, param: '.. tostring(param))
        end

        function TestTable.Test2Callback(tab,param)
            print('Test2, param: ' .. param)
            print('Test2, example: ' .. tab.Test2Example)
        end

        LuaStartUp()
    ";


    string str2 = @"
    TestTable = {}
    TestTable.Test4Example = 'BBBB'
    function TestTable.Test3Callback(param)
        print('Test3, param: ' .. tostring(param))
    end

    function TestTable.Test4Callback(tab,param1, param2)
        print('Test4, param: ' .. tostring(param1).. '  ,param2: ' .. tostring(param2))
        print('Test4, example: ' .. tab.Test4Example)
    end

    function LuaStartUp()
        CS.LuaEventUtility.Instance:ActionTest3('+', TestTable.Test3Callback)
        CS.LuaEventUtility.Instance:DoTest3()
        CS.LuaEventUtility.Instance:ActionTest4('+', TestTable.Test4Callback)
        CS.LuaEventUtility.Instance:DoTest4(TestTable)
    end

    LuaStartUp()
";

    // Start is called before the first frame update
    void Start()
    {
        _luaEnv = new LuaEnv();
        //_luaEnv.DoString(str1);
        _luaEnv.DoString(str2);
        //LuaFunction luaRoot = _luaEnv.Global.Get<LuaFunction>("LuaStartUp");
        //luaRoot.Call();
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;

[CSharpCallLua]
public class LuaEventUtility:Singleton<LuaEventUtility>
{
    [CSharpCallLua]
    public delegate void NoTableDelegate(int param1);
    [CSharpCallLua]
    public delegate void TableDelegate(LuaTable tab, int param1);

    public event Action<int> ActionTest3;
    [CSharpCallLua]
    public event Action<LuaTable,int, int> ActionTest4;

    public static void DoTest1(LuaTable tab, string functionName)
    {
        NoTableDelegate callback = tab.Get<NoTableDelegate>(functionName);
        callback(1111);
    }
    public static void DoTest2(LuaTable tab, string functionName)
    {
        TableDelegate callback = tab.Get<TableDelegate>(functionName);
        callback(tab,2222);
    }
    public void DoTest3()
    {
        ActionTest3.Invoke(3333);
    }

    public void DoTest4(LuaTable tab)
    {
        ActionTest4.Invoke(tab, 4444, 5555);
    }

    public void Update()
    { 
         //ActionTest3.Invoke(3333);
    }
}

 文章来源地址https://www.toymoban.com/news/detail-468501.html

 

到了这里,关于[游戏开发][Unity] Xlua与C#互相调用规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [游戏开发][Unity] Xlua生成wrap文件报错、打AB包Wrap报错

     Xlua生成wrap文件,自带添加了ref字段报错 例如Material生成MaterialWrap时,EnableKeyword(in LocalKeyword keyword);带着in,所以在Wrap文件中会自动在参数前生成ref导致编译不过 解决办法: 换Xlua版本就好了,也不知道我xlua当时从哪个版本copy过来的,换了xlua-master里的Xlua源码

    2024年02月04日
    浏览(53)
  • Unity中使用Xlua调用lua相关

    这样只能读取Resources文件夹下的脚本,但是我们做热更新需要从AB包中读取,所以需要自定义加载路径 require寻找文件的逻辑是,先找AddLoader中自定义的路径(可以有多个路径)中有没有相应文件,再去Resources下查找

    2024年02月08日
    浏览(54)
  • 【Unity框架】XLua中Lua代码注入C#代码操作

    1.游戏框架下载地址:https://github.com/kof123w/gitWorkSpace/tree/main/XLua 2.XLua官方与教程地址:https://github.com/Tencent/xLua I.宏定义:添加 HOTFIX_ENABLE 到 Edit Project Settings Player Other Settings Scripting Define Symbols II.生成代码:执行 ‘XLua Generate Code’ 菜单,等待Unity编译完成 III.注入:执行 ‘XLua

    2024年02月08日
    浏览(62)
  • LabVIEW于C#各自生成的DLL互相调用的方法

    1.LV调用C#生成的DLL (1)C#类库代码原型 Debug生成的DLL: LV代码: 结果显示 2.C#调用LabVIEW生成的DLL: LV源码 VS2017添加LV生成的DLL 加入命名控件,加源码 运行结果:

    2024年02月16日
    浏览(63)
  • ILRuntime是如何与Unity互相调用的

    一、ILRuntime的基本介绍 ILRuntime是一个跨平台CLR实现,它可以在多个平台上运行C#代码,包括Android、iOS、Windows、Linux等等。ILRuntime的实现方式是将C#代码编译成IL代码,然后在运行时通过JIT或AOT的方式将IL代码转换为机器代码,从而实现跨平台的效果。ILRuntime的主要功能包括热更

    2024年02月16日
    浏览(48)
  • Unity 游戏开发、03 基础篇 | C#初级编程

    https://learn.u3d.cn/tutorial/beginner-gameplay-scripting Update(不是按固定时间调用的) 经常用于 移动非物理特性的物体(不是物理对象) 简单定时器 接收输入 FixedUpdate(调用时间间隔相同) 进行任何必要的物理计算(任何物理对象) 最好使用力来定义移动 使用 IDE 的 Unity Event Func

    2024年02月08日
    浏览(64)
  • Unity xLua开发环境搭建与基础进阶

    Unity是一款非常流行的游戏开发引擎,而xLua是一个为Unity开发者提供的Lua框架,可以让开发者使用Lua语言来进行游戏开发。在本文中,我们将介绍如何搭建Unity xLua开发环境,并进行基础进阶的学习。 环境搭建 首先,我们需要下载xLua框架,可以在GitHub上找到最新的版本。下载

    2024年02月22日
    浏览(54)
  • 第十一部分 隐含规则(二)

    目录 一、隐含规则使用的变量 1、关于命令的变量。 2、关于命令参数的变量 二、隐含规则链         在隐含规则中的命令中,基本上都是使用了一些预先设置的变量。你可以在你的 makefile 中改变这些变量的值,或是在 make 的命令行中传入这些值,或是在你的环境变量

    2024年01月17日
    浏览(55)
  • 关于Unity在Xlua调用Lua脚本函数时报错This type must add to CSharpCallLua 解决办法

    使用委托来获取xlua中的function是不行的 报错脚本示范 即使全部接口打好标签并且在编辑器中把兼容等级改为4.X 打包出去还是会出问题 建议在lua脚本中建立一个空的table 再把方法塞进去 比如 然后在c#端 就可以正常运作这个方法了

    2024年02月12日
    浏览(65)
  • Unity3D xLua开发环境搭建详解

    xLua是一种基于Lua语言的开发框架,可以帮助开发者在Unity3D中使用Lua脚本来开发游戏。 对惹,这里有一 个游戏开发交流小组 ,希望大家可以点击进来一起交流一下开发经验呀! 在本文中,我们将详细介绍如何搭建Unity3D xLua开发环境,包括安装Unity3D和xLua插件,配置环境变量

    2024年02月22日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包