OneBigLoser
OneBigLoser
发布于 2024-06-17 / 9 阅读
0
0

Lambda表达式和方法订阅的区别

什么是事件订阅?

在编程中,事件订阅就像你告诉某人:“当某件事发生时,请告诉我”。当这件事发生时,那个人就会通知你,你就可以做一些相应的事情。

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


评论