
本次内容将了解如何在Unity3D中使用事件,事件在开发松耦合系统时非常有用,基于事件的系统有两个部分:
- 发布者:负责创建和调用事件。
- 订阅者:负责订阅事件,当一个事件被调用时,所有订阅的方法也会被调用。
以下是本文介绍的几个内容:
C#事件
使用事件的步骤是:
- 定义委托
- 创建上述委托类型的事件变量
- 订阅活动
- 调用事件
下面是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);
}
}
最终结果:

Unity事件
这可以在不定义委托的情况下使用,使用步骤是:
- 创建事件类型,这个必须继承UnityEvent泛型抽象类,如果不想通过事件传递任何参数,则无需创建此自定义事件类型。
- 创建上述事件的变量。
- 使用 AddListener 方法订阅事件。
- 调用事件
发布者
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);
}
}
最终结果:

在运行时添加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中使用事件的全部内容,如果你有任何反馈,请随时在本页面下方留言。