【unity】【Code】【Event事件】通用代码库(三)——Unity事件与委托

通用代码库
基于Unity 5.6.0f

使用SendMessage不仅效率低下,还容易因为string出错。
所以当需要传递多消息时,最好使用unity里的event系统。

例子如下:

事件发送部分
EventDispatcher.cs

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

public class EventDispatcher : MonoBehaviour
{


    /// <summary>
    /// Event——ImgActive
    /// </summary>

    //关键字delegate,声明委托方法<方法名>([参数])
    public delegate void SetImgActive(bool a);               

    //声明事件SetImgActive方法setActiveTrue
    public event SetImgActive setActiveTrue; 

    public void Begin()//调用begin方法触发事件
    {
        if (setActiveTrue != null)
        {
            setActiveTrue(true);//方法传递参数 true

        }
    }


    public event SetImgActive setActiveFalse;
    public void End()
    {
        if (setActiveFalse != null)
        {
            setActiveFalse(false);
        }
    }

}

事件监听部分
EventListening.cs

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

public class EventListening : MonoBehaviour
{
    public EventDispatcher evt;
    public GameObject img;

    private void OnEnable()
    {
        evt.setActiveTrue += DosetActiveTrue;//+=重载创建
        evt.setActiveFalse += DosetActiveFalse;
    }

    private void OnDisable()
    {
        evt.setActiveTrue -= DosetActiveTrue;//-=
        evt.setActiveFalse -= DosetActiveFalse;
    }

    public void DosetActiveTrue(bool a)
    {
        img.SetActive(a);//do something
    }

    public void DosetActiveFalse(bool b)
    {
        img.SetActive(b);
    }
}
<think>好的,我现在需要在Unity 6的Inspector中为对象或组件添加按钮事件的处理逻辑。根据用户提供的引用内容,有几个方法可以实现这个功能。让我先理清楚每个引用的内容,再结合Unity的一般操作步骤来整理答案。 首先,引用[1]提到了使用EasyButtons这个库,通过属性来快速添加按钮到Inspector。这个方法的步骤可能是在方法上添加特定的属性标签,然后Inspector中就会显示按钮。但用户提到的是Unity 6,可能需要确认这个库是否兼容新版本。不过如果用户愿意使用第方工具,这可能是个快速的方法。 引用[2]则涉及为UI按钮添加OnMouseEnter事件,使用的是UnityEventSystems接口,比如IPointerEnterHandler。但这里更多是关于UI事件的响应,比如鼠标进入时的处理,可能和直接添加按钮到Inspector中的功能不太一样。不过这里提到了如何通过脚本实现事件处理,可能对理解Unity事件系统有帮助。 引用[3]提到了使用Odin插件的Button属性,这显然需要安装Odin插件。这是一个付费插件,但确实能方便地添加按钮。不过如果用户没有安装Odin,可能需要其他方法。 现在用户的问题是,在Unity 6的Inspector中添加按钮事件处理逻辑。通常,Unity原生的方法有两种:通过自定义编辑器脚本或者使用SerializedObject的特性。 首先,原生的方法。Unity允许在自定义组件中,通过添加公共方法并在方法上使用[ContextMenu]属性,这样在Inspector的组件右上角会出现一个菜单选项,可以手动点击执行。但这种方法可能不如按钮直接方便。 另一种方法是使用Unity的[SerializeField]结合UnityEvent,创建一个UnityEvent字段,然后在Inspector中绑定事件。不过这可能更适合在运行时动态绑定事件,而不是在编辑模式下直接调用方法。 然后,用户提到的引用[1]中的EasyButtons和引用[3]中的Odin插件,都是第方解决方案,可以更方便地添加按钮。但需要安装相应的插件或库。 所以,可能的步骤是: 1. 原生方法:使用[ContextMenu]属性,或者在自定义编辑器脚本中创建按钮。 2. 第方库:比如EasyButtons或Odin插件,通过在方法上添加属性标签自动生成按钮。 但用户可能更希望用Unity自带的方法,避免依赖第方插件。因此,我需要详细说明原生实现的方式,例如编写一个编辑器脚本,扩展组件的Inspector界面,添加按钮。 具体步骤可能如下: 1. 创建自定义的MonoBehaviour脚本,包含需要调用的公共方法。 2. 创建一个编辑器脚本(放在Editor文件夹下),使用CustomEditor属性关联到该组件。 3. 在编辑器脚本中重写OnInspectorGUI方法,添加按钮,并调用目标方法。 例如: ```csharp using UnityEngine; using UnityEditor; public class MyComponent : MonoBehaviour { public void MyMethod() { Debug.Log("方法被调用"); } } [CustomEditor(typeof(MyComponent))] public class MyComponentEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); if (GUILayout.Button("执行方法")) { ((MyComponent)target).MyMethod(); } } } ``` 这样,当在Inspector中查看MyComponent组件时,会显示一个按钮,点击即可调用MyMethod方法。 另外,使用[ContextMenu("按钮名称")]属性可以直接在组件的上下文菜单中添加选项,但需要用户点击组件右上角的齿轮图标选择,不够直观。 如果用户想用更简便的方式,可能需要使用第方工具,如引用[1]的EasyButtons或者引用[3]的Odin插件。例如,使用EasyButtons的话,只需要在方法前添加[Button]属性,无需编写编辑器脚本。 但根据用户给出的引用,引用[3]中的Odin插件的代码示例确实很方便,但前提是已经安装了Odin。而引用[1]的EasyButtons可能是一个开源库,用户需要导入到项目中。 所以,在回答中应该涵盖原生方法和第方方法,并分别说明步骤和注意事项。同时,需要确保代码示例正确,比如在编辑器脚本中必须放在Editor文件夹下,且使用正确的命名空间。 最后,生成相关问题,需要围绕Unity Inspector按钮的实现方法、原生方工具比较、不同事件处理方式等来提问。</think>在Unity 6的Inspector中添加按钮事件处理逻辑可通过以下方法实现: --- ### **方法一:原生实现(无需插件)** 1. **创建自定义组件脚本** ```csharp using UnityEngine; public class CustomButton : MonoBehaviour { public void OnClickButton() { Debug.Log("按钮事件触发!"); } } ``` 2. **编写编辑器扩展脚本(需放在`Editor`文件夹下)** ```csharp using UnityEditor; using UnityEngine; [CustomEditor(typeof(CustomButton))] public class CustomButtonEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); if (GUILayout.Button("执行事件")) { ((CustomButton)target).OnClickButton(); } } } ``` - 效果:在Inspector中会显示一个按钮,点击直接调用方法[^3]。 --- ### **方法二:使用第方插件** #### **1. EasyButtons(开源方案)** - **步骤**: 1. 导入[EasyButtons库](https://gitcode.com/gh_mirrors/ea/EasyButtons)。 2. 在方法上添加`[Button]`属性: ```csharp using UnityEngine; using EasyButtons; public class Demo : MonoBehaviour { [Button] public void TestMethod() { Debug.Log("通过EasyButtons触发"); } } ``` 3. Inspector中自动生成按钮[^1]。 #### **2. Odin插件(付费方案)** - **步骤**: ```csharp using Sirenix.OdinInspector; using UnityEngine; public class OdinDemo : MonoBehaviour { [Button("点击触发")] public void CustomMethod() { Debug.Log("Odin按钮触发"); } } ``` - 效果:直接在Inspector中显示带样式的按钮。 --- ### **方法:通过UnityEvent绑定** 1. **定义UnityEvent字段** ```csharp using UnityEngine; using UnityEngine.Events; public class EventButton : MonoBehaviour { public UnityEvent OnClick; } ``` 2. **在Inspector中手动绑定事件** - 将目标脚本拖入事件槽,选择对应方法。 --- ### **对比分析** | 方法 | 优点 | 缺点 | |-------------------|-----------------------------|-----------------------------| | 原生编辑器扩展 | 无需依赖第方库,兼容性好 | 需编写额外编辑器脚本 | | EasyButtons | 快速实现,代码简洁 | 需导入外部库 | | Odin插件 | 功能强大,支持参数方法 | 需付费购买 | | UnityEvent绑定 | 可视化配置,适合运行时动态绑定 | 需手动操作,非编辑时触发 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值