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 获取我的完整代码!
所以你这里有两个问题。
- 您应该将方法本身传递给事件委托,而不是调用方法的结果(
null
,所以没有)。
- 你的方法签名有误。
错误消息告诉你的是:
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();
当我修复 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 获取我的完整代码!
所以你这里有两个问题。
- 您应该将方法本身传递给事件委托,而不是调用方法的结果(
null
,所以没有)。 - 你的方法签名有误。
错误消息告诉你的是:
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();