- Home /
Public variable not showing in inspector using new Input System
Hi! I decided to have a go with the new input system and make a simple top down 2D movement script with it. The script worked fine using the old system but now that I have converted it to the new system I have an issue. The input system needs a reference to Input mappings but when I have a public (or private, serialized) variable the field will not show up in the inspector. Here is the code I have:
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 4f;
public InputMaster controls;
private Rigidbody2D rb;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
controls.PlayerMap.Movement.performed += ctx => MovePlayer(ctx.ReadValue<Vector2>());
}
private void OnEnable()
{
controls.Enable();
}
private void OnDisable()
{
controls.Disable();
}
private void MovePlayer(Vector2 direction)
{
rb.velocity = direction.normalized * moveSpeed;
//TODO: Animate Sprite
}
}
I am getting no errors in the console and can't see anything wrong with my code. Thanks for the help!
Answer by Cronabot · Jul 17, 2020 at 08:21 PM
I had implemented the input system wrong because I was following an outdated tutorial. Whoops!
For anyone wondering, here is the working code:
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour, InputMaster.IPlayerMapActions
{
public float moveSpeed = 4f;
public InputMaster controls;
private Rigidbody2D rb;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
public void OnEnable()
{
if (controls == null)
{
controls = new InputMaster();
controls.PlayerMap.SetCallbacks(this);
}
controls.PlayerMap.Enable();
}
public void OnMovement(InputAction.CallbackContext context)
{
Vector2 direction = context.ReadValue<Vector2>();
rb.velocity = direction.normalized * moveSpeed;
//TODO: Animate Sprite
}
}
Answer by art_maressa · May 04 at 02:04 PM
I spent way too long wondering what I was doing wrong before reading the comments on the brackeys tutorial.
video reference: https://www.youtube.com/watch?v=Pzd8NhcRzVo
comment by user cbox reads:
"TIP For those doing the tutorial more recently, you can no longer drag the file into the inspector as they changed the backend. You can just do controls = new InputMaster(); in awake to create a new instance of the object."
Essentially, IF your code looks like this:
using UnityEngine.InputSystem; using UnityEngine; public class ThirdPersonMovement : MonoBehaviour { public InputMaster controls; void Awake() { controls.Player.Movement.performed += _ => Move(); controls.Player.Shoot.performed += ctx => Shoot(); } void Move() { Debug.Log("Move"); } void Shoot() { Debug.Log("Shot"); } private void OnEnable() { controls.Enable(); } private void OnDisable() { controls.Disable(); } }
Then you just need to add controls = new InputMaster(); in the awake function using UnityEngine.InputSystem; using UnityEngine; public class ThirdPersonMovement : MonoBehaviour { public InputMaster controls; void Awake() { // ADD NEW INSTANCE HERE--> controls = new InputMaster(); controls.Player.Movement.performed += _ => Move(); controls.Player.Shoot.performed += ctx => Shoot(); } void Move() { Debug.Log("Move"); } void Shoot() { Debug.Log("Shot"); } private void OnEnable() { controls.Enable(); } private void OnDisable() { controls.Disable(); } }