什么是事件订阅?
在编程中,事件订阅就像你告诉某人:“当某件事发生时,请告诉我”。当这件事发生时,那个人就会通知你,你就可以做一些相应的事情。
Lambda表达式和方法订阅的区别
Lambda表达式
playerInputActions.Player.Interaction.performed += context => OnInteractionPerformed();
这里的context => OnInteractionPerformed()
是一种简写方式,表示“当某件事(按下按键)发生时,请调用OnInteractionPerformed
方法”。虽然我们写了context
,但实际上我们没有使用它,所以它可以被省略掉。
比喻:这就像你告诉朋友:“如果你看到一只猫,就告诉我‘猫来了’”。朋友看到了猫,只是简单地告诉你‘猫来了’,并不需要具体描述猫的样子。
方法订阅
playerInputActions.Player.Interaction.performed += GetInteractionButtonDown;
这里的GetInteractionButtonDown
是一个方法,当按键被按下时,这个方法会被调用,并且会收到一个包含按键信息的context
。
比喻:这就像你告诉朋友:“如果你看到一只猫,请告诉我‘猫来了’,并告诉我猫是什么颜色的”。朋友看到猫时,会告诉你‘猫来了’,并且会说出猫的颜色(这里的颜色就是context
信息)。
为什么有时不需要参数?
当我们使用context => OnInteractionPerformed()
时,虽然写了context
,但我们实际上并不使用它。所以,这样写是一种简化,只是表示“发生了这件事”。
当我们直接使用GetInteractionButtonDown
时,这个方法需要使用到context
信息,所以它必须接受这个参数。
示例代码
使用Lambda表达式(简化的方式)
using UnityEngine;
using UnityEngine.InputSystem;
public class GameInput : MonoBehaviour
{
private PlayerInputActions playerInputActions;
private void Awake()
{
playerInputActions = new PlayerInputActions();
// 当按键被按下时,调用 OnInteractionPerformed 方法
playerInputActions.Player.Interaction.performed += context => OnInteractionPerformed();
}
private void OnEnable()
{
playerInputActions.Player.Enable();
}
private void OnDisable()
{
playerInputActions.Player.Disable();
}
private void OnInteractionPerformed()
{
Debug.Log("按键被按下了");
}
}
使用方法订阅(详细的方式)
using UnityEngine;
using UnityEngine.InputSystem;
public class GameInput : MonoBehaviour
{
private PlayerInputActions playerInputActions;
private void Awake()
{
playerInputActions = new PlayerInputActions();
// 当按键被按下时,调用 GetInteractionButtonDown 方法
playerInputActions.Player.Interaction.performed += GetInteractionButtonDown;
}
private void OnEnable()
{
playerInputActions.Player.Enable();
}
private void OnDisable()
{
playerInputActions.Player.Disable();
}
private void GetInteractionButtonDown(InputAction.CallbackContext context)
{
Debug.Log("按键被按下了");
}
}
总结
Lambda表达式:用来表示“发生了这件事”,虽然写了
context
,但并不使用它。方法订阅:直接使用一个方法,这个方法需要接收并使用事件参数
context
。