Assets\Scripts\PlayerMovement.cs(18,9):错误 CS0029:无法将类型 'void' 隐式转换为 'System.Action...'

Assets\Scripts\PlayerMovement.cs(18,9): error CS0029: Cannot implicitly convert type 'void' to 'System.Action...'

当我修复 this post 中的代码时,出现此错误:Assets\Scripts\PlayerMovement.cs(18,9): error CS0029: Cannot implicitly convert type 'void' to 'System.Action<UnityEngine.InputSystem.InputAction.CallbackContext>' 我该如何修复它?

这是我的错误代码:

        controls.Gameplay.Move_Left.performed += Left();

        controls.Gameplay.Move_Right.performed += Right();

    void Left()
    {
        rb.AddForce(leftrightForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    }

    void Right()
    {
        rb.AddForce(-leftrightForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
    }

(有一个类似的post 但是没用)

请帮忙,我真的被困住了,需要尽快完成! 前往 this post 获取我的完整代码!

所以你这里有两个问题。

  1. 您应该将方法本身传递给事件委托,而不是调用方法的结果(null,所以没有)。
  2. 你的方法签名有误。

错误消息告诉你的是:

error CS0029: Cannot implicitly convert type 'void' to 'System.Action<UnityEngine.InputSystem.InputAction.CallbackContext>'

它本质上是说它需要一个接受 CallbackContext 的方法,但你试图传递 void。这意味着如上所述的 1 和 2。

因此,为了解决一个问题,我们将您的代码更改为:

controls.Gameplay.Move_Left.performed += Left;
controls.Gameplay.Move_Right.performed += Right;

要修复 2,我们需要匹配 System.Action<UnityEngine.InputSystem.InputAction.CallbackContext> 签名,如下所示:

public delegate void Action<in T>(T obj); 

意味着我们需要一个不return任何东西(void)并接受T(在本例中为CalllbackContext)的方法。将您的方法固定为如下所示,我们得到以下内容:

void Left(UnityEngine.InputSystem.InputAction.CallbackContext context)
{
    rb.AddForce(leftrightForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}

void Right(UnityEngine.InputSystem.InputAction.CallbackContext context)
{
    rb.AddForce(-leftrightForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}

现在您的代码已修复。

请注意,我不使用 Unity,但从错误消息中了解到此信息,因此仔细阅读它们确实值得。

在这个简单的解决方案中,只需丢弃上下文并调用 Left()Right():

controls.Gameplay.Move_Left.performed += _ => Left();

controls.Gameplay.Move_Right.performed += _ => Right();