ue3d如何在Unity中使用事件

如何在Unity中使用事件

分类:
ue3d - 如何在Unity中使用事件

本次内容将了解如何在Unity3D中使用事件,事件在开发松耦合系统时非常有用,基于事件的系统有两个部分

  1. 发布者:负责创建和调用事件。
  2. 订阅者:负责订阅事件,当一个事件被调用时,所有订阅的方法也会被调用。

以下是本文介绍的几个内容:

C#事件

使用事件的步骤是:

  1. 定义委托
  2. 创建上述委托类型的事件变量
  3. 订阅活动
  4. 调用事件

下面是C#事件的示例,在此示例中,事件将在按下空格键时调用。

发布者

using UnityEngine;

// step 1: Define delegate
public delegate void TestDelegate(string strName);

public class CSharpEventRaiseBehaviour : MonoBehaviour
{
    // step 2: Create event 
    public event TestDelegate TestEvent;

    void Update()
    {
       if(Input.GetKeyDown(KeyCode.Space))
        {
            if(TestEvent!=null)
            {
                // Invoke event
                TestEvent("Some Value");
            }
            else
            {
                Debug.LogWarning("TestEvent is NULL");
            }
        }
    }
}

订阅者

using UnityEngine;

public class CSharpEventSubscribeBehaviour : MonoBehaviour
{
    public CSharpEventRaiseBehaviour eventRaiseBehaviour;

    void Start()
    {
        if(eventRaiseBehaviour==null)
        {
            eventRaiseBehaviour = GameObject.FindObjectOfType<CSharpEventRaiseBehaviour>();
        }
        
        // subscribe to the event
        eventRaiseBehaviour.TestEvent += EventRaiseBehaviour_TestEvent;
    }

    // event handler
    private void EventRaiseBehaviour_TestEvent(string strName)
    {
        Debug.Log("C Sharp event raised with argument: " + strName);
    }
}

最终结果

ue3d - 如何在Unity中使用事件

Unity事件

这可以在不定义委托的情况下使用,使用步骤是

  1. 创建事件类型,这个必须继承UnityEvent泛型抽象类,如果不想通过事件传递任何参数,则无需创建此自定义事件类型。
  2. 创建上述事件的变量。
  3. 使用 AddListener 方法订阅事件。
  4. 调用事件

发布

using UnityEngine;
using UnityEngine.Events;

// Create custom event when some arguments needs to be passed with it
// Skip this if argument passing is not required and use UnityEvent instead
[System.Serializable]
public class MyEvent : UnityEvent<string>
{
}

public class UnityEventRaiseBehaviour : MonoBehaviour
{
    // Define event
    public MyEvent TestEvent;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // invoke event
            TestEvent.Invoke("Some Value");
        }
    }
}

订阅者

using UnityEngine;

public class UnityEventSubscribeBehaviour : MonoBehaviour
{
    public UnityEventRaiseBehaviour eventRaiseBehaviour;

    private void Start()
    {
        if(eventRaiseBehaviour == null)
        {
            eventRaiseBehaviour = GameObject.FindObjectOfType<UnityEventRaiseBehaviour>();
        }

        if (eventRaiseBehaviour.TestEvent == null)
        {
            eventRaiseBehaviour.TestEvent = new MyEvent();
        }

        // subscribe to the event
        eventRaiseBehaviour.TestEvent.AddListener(TestEvent_Handler);
    }

    // event handler
    private void TestEvent_Handler(string argument)
    {
        Debug.Log("Unity Event called with argument: " + argument);
    }
}

最终结果

ue3d - 如何在Unity中使用事件

在运行时添加UI事件 – 按钮单击示例

还可以在运行时为UI元素添加事件处理程序,以下是为按钮单击添加事件处理程序的示例。

using UnityEngine;
using UnityEngine.UI;

public class UIEventDemo : MonoBehaviour
{
    // assign this in editor
    public Button MyButton;
    
    void Start()
    {
        // add event handler/ listener
        MyButton.onClick.AddListener(Button_Click);
    }

    // event handler
    private void Button_Click()
    {
        Debug.Log("Button Clicked");
    }
}

以上是关于在Unity 3D中使用事件的全部内容,如果你有任何反馈,请随时在本页面下方留言。

相关信息

  • 类型:知识
  • 字数:354
  • 字符:3830
  • 适用软件:Unity
  • 说明:无
  • 编号:156730

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!