When I fixed the code from this post I get this error: Assets\Scripts\PlayerMovement.cs(18,9): error CS0029: Cannot implicitly convert type 'void' to 'System.Action<UnityEngine.InputSystem.InputAction.CallbackContext>' How do I fix it?
This is my code that gets errors:
controls.Gameplay.Move_Left.performed += Left();
controls.Gameplay.Move_Right.performed += Right();
and
void Left()
{
rb.AddForce(leftrightForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
void Right()
{
rb.AddForce(-leftrightForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
(There is a simalar post here but it didn’t work)
Please help, I am really stuck and need to get this done soon!
Go to this post to get my full code!
>Solution :
So you have two problems here.
- You should be passing the method itself to the event delegate, not the result of calling the method (which is
null, so there isn’t one). - You have the wrong method signature.
The error message tells you as much:
error CS0029: Cannot implicitly convert type ‘void’ to ‘System.Action<UnityEngine.InputSystem.InputAction.CallbackContext>’
It essentially says that it requires a method that takes a CallbackContext, but you’re trying to pass void. This implies 1 and 2 as mentioned above.
So to fix one, we change your code like this:
controls.Gameplay.Move_Left.performed += Left;
controls.Gameplay.Move_Right.performed += Right;
And to fix 2, we need to match the System.Action<UnityEngine.InputSystem.InputAction.CallbackContext> signature, which looks like this:
public delegate void Action<in T>(T obj);
Meaning we need a method that doesn’t return anything (void) and accepts a T (in this case CalllbackContext). Fixing your methods to look like this, we get the following:
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);
}
And now your code is fixed.
Note that I don’t use Unity, but understood this information from the error message, so it really does pay to read them carefully.