Tolua使用笔记六:在lua中操作C#的委托事件与在lua中对Unity的GameObject的操作

本文详细介绍了如何在Unity中使用Tolua#库在Lua中操作C#的委托事件,包括添加、移除和调用委托,以及对Unity GameObject的组件添加、创建和销毁等操作。示例代码清晰地展示了在Lua中如何实现C#委托的赋值、绑定、解绑以及事件处理。同时,文章提到了在Tolua#中支持函数重载和在Lua中创建委托的语法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例十一:

该案例主要讲解的是再Unity中对于C#中的委托的一些操作的方法

相比之前的一些例子,如果细心完整的看下来,会发现较开始的例子,这个例子算是比较复杂的了

核心代码就不贴了,太长了,如果没有经验,直接看这个例子,可能你已经晕在这里了,现在我就开始为大家细细的解析这样一篇代码

先从类TestEventListener开始说起,这是一个例子作者自己封装的一个类,里面包含了2种类型的委托和一些委托事件的变量和一些基础的方法

public class TestEventListener : MonoBehaviour
{
    public delegate void VoidDelegate(GameObject go);
    public delegate void OnClick(GameObject go);    
    public OnClick onClick = delegate { };

    public event OnClick onClickEvent = delegate { };    
    
    public void SetOnFinished(OnClick click)
    {
        Debugger.Log("SetOnFinished OnClick");
    }
    
    public void SetOnFinished(VoidDelegate click)
    {
        Debugger.Log("SetOnFinished VoidDelegate");
    }

    [NoToLuaAttribute]
    public void OnClickEvent(GameObject go)
    {
        onClickEvent(go);
    }
}
这里大家先留下一个概念,后面会用到这个类,然后大家回到脚本TestDelegate这边来,这便是这个例子的入口类

按照惯例,作者一如既往的在Awake里面就几乎做完了所有的基本加载操作,我们都的时候也都是从这里开始:

    void Awake()
    {               
        state = new LuaState();
        state.Start();
        LuaBinder.Bind(state);   //加载基本的Warp文件
        Bind(state);

        state.LogGC = true;
        state.DoString(script);
        GameObject go = new GameObject("TestGo");
        listener = (TestEventListener)go.AddComponent(typeof(TestEventListener));

        SetClick1 = state.GetFunction("SetClick1");
        AddClick1 = state.GetFunction("AddClick1");
        AddClick2 = state.GetFunction("AddClick2");
        RemoveClick1 = state.GetFunction("RemoveClick1");
        RemoveClick2 = state.GetFunction("RemoveClick2");
        TestOverride = state.GetFunction("TestOverride");
        AddEvent = state.GetFunction("AddEvent");
        RemoveEvent = state.GetFunction("RemoveEvent");        
    }
首先自然是创建lua虚拟机,然后调用 state.Start() 为虚拟机加载一些标准库。

然后则是使用LuaBinder.Bind(LuaState  state) 为该虚拟机中加载一些基本的class类型,就是之前在CustomSetting中添加并Warp的类型

之后的Bind()函数则是为lua虚拟机加载一些该例子特有的类型,平时我们完全可以不通过该方法添加,直接在CustomSetting中添加即可。

然后就是编译读取下面的lua脚本

            function DoClick1(go)                
                print('click1 gameObject is '..go.name)                    
            end

            function DoClick2(go)                
                print('click2 gameObject is '..go.name)                              
            end                       

            function AddClick1(listener)       --添加点击事件DoClick1
                if listener.onClick then
                    listener.onClick = listen
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值