- Home /
Input System : Character movemevnt and Jump
Hello, I'm having a problem with the new input system with Unity. The Keyboard works just fine (animation and all) but when I try to use the Gamepad (Xbox 360 controller), the character moves, more like glides while in her idle animation but won't play her walk animation. And when I press the jump button she falls through the floor and just disappears from existence. I'll provide my code and some screenshots, please I seriously need help.
Gamepad Script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Gamepad : MonoBehaviour
{
PlayerControls controls;
Vector2 move;
void Awake()
{
controls = new PlayerControls();
controls.Gameplay.Jump.performed += ctx => Jump();
controls.Gameplay.Move.performed += ctx => move = ctx.ReadValue<Vector2>();
controls.Gameplay.Move.canceled += ctx => move = Vector2.zero;
}
void Jump()
{
transform.localPosition *= 5f;
}
void Update()
{
Vector2 m = new Vector2(move.x, move.y) * Time.deltaTime;
transform.Translate(m, Space.World);
}
void OnEnable()
{
controls.Gameplay.Enable();
}
void OnDisable()
{
controls.Gameplay.Disable();
}
}
Player Movement Script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController2D : MonoBehaviour
{
private bool isGrounded;
[SerializeField]
Transform groundCheck;
[SerializeField]
Transform groundCheckL;
[SerializeField]
Transform groundCheckR;
Animator animator;
Rigidbody2D r2D;
SpriteRenderer spriteR;
[SerializeField]
public float runSpeed = 1.5f;
[SerializeField]
public float jumpSpeed =5;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
r2D = GetComponent<Rigidbody2D>();
spriteR = GetComponent<SpriteRenderer>();
}
void FixedUpdate()
{
if ((Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground"))) ||
(Physics2D.Linecast(transform.position, groundCheckL.position, 1 << LayerMask.NameToLayer("Ground")))||
(Physics2D.Linecast(transform.position, groundCheckR.position, 1 << LayerMask.NameToLayer("Ground"))))
{
isGrounded = true;
}
else
{
isGrounded = false;
animator.Play("Jump");
}
if(Input.GetKey("d")|| Input.GetKey("right"))
{
r2D.velocity = new Vector2(runSpeed, r2D.velocity.y);
if(isGrounded)
animator.Play("Walk");
spriteR.flipX = true;
}
else if (Input.GetKey("a") || Input.GetKey("left"))
{
r2D.velocity = new Vector2(-runSpeed, r2D.velocity.y);
if (isGrounded)
animator.Play("Walk");
spriteR.flipX = false;
}
else
{
if (isGrounded)
animator.Play("Idle");
r2D.velocity = new Vector2(0, r2D.velocity.y);
}
if (Input.GetKey("space")&& isGrounded)
{
r2D.velocity = new Vector2(r2D.velocity.x, jumpSpeed);
animator.Play("Jump");
}
}
}
Answer by jhubbard0221 · Jun 08, 2020 at 07:32 PM
This script should be able to handle movement and jumping with a gamepad; it's what I use for my 3D RPG. Keep in mind, I use Cinemachine's Freelook camera. If you don't use it it could mess up the way the movement script works.
If what I have here isn't enough information ,I suggest you check out this video: https://www.youtube.com/watch?v=4HpC--2iowE
Ask me more questions if you need more specifics, and I might be able to help.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class ThirdPersonMovement : MonoBehaviour
{
PlayerControls controls;
Vector3 movement;
public float movementSpeed = 7f;
Vector3 velocity;
public float gravity = -25f;
public float jumpHeight = 1.5f;
public Transform groundCheck;
public float groundDistance = 0.4f;
public LayerMask groundMask;
bool isGrounded;
public CharacterController controller;
public Transform cam;
public float turnSmoothTime = 0.07f;
float turnSmoothVelocity;
void Awake()
//Controller input roles
{
controls = new PlayerControls();
controls.Gameplay.Movement.performed += ctx => movement = ctx.ReadValue<Vector2>();
controls.Gameplay.Movement.canceled += ctx => movement = Vector3.zero;
controls.Gameplay.Jump.performed += ctx => Jump();
}
// Update is called once per frame
void Update()
{
//Ground Check
isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
if(isGrounded && velocity.y < 0)
{
velocity.y = -2f;
}
//Character Movement
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
Vector3 direction = new Vector3(horizontal, 0f, vertical).normalized;
//Character Rotation
if (direction.magnitude >= 0.1f)
{
float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;
float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref turnSmoothVelocity, turnSmoothTime);
transform.rotation = Quaternion.Euler(0f, angle, 0f);
Vector3 moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
controller.Move(moveDir.normalized * movementSpeed * Time.deltaTime);
}
//Gravity
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
}
void Jump()
{
if (isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
}
void OnEnable()
{
controls.Gameplay.Enable();
}
void OnDisable()
{
controls.Gameplay.Disable();
}
}
Hey I got this error:( error CS0246: The type or namespace name 'PlayerControls' could not be found (are you missing a using directive or an assembly reference?)
Cristiancasallas998, That's the name of his Input Action.