Me gustaría preguntar si hay una forma de desactivar el movimiento diagonal en Unity 2D. La cuestión es que cuando presiono 'W' + 'D' (tecla de movimiento) al mismo tiempo, el personaje comienza a moverse en diagonal. Entonces, en lugar de que el personaje se mueva en diagonal cuando se combinan los botones, quiero que vaya completamente recto si presiono 'd' o cualquier otra tecla para moverme, incluso si todavía estoy presionando el otro botón al mismo tiempo. Por así decir priorizar la función del último botón que presioné.
Aquí hay un video corto para explicar más mi problema.
Y aquí está el código para el movimiento de mi personaje.
using System.Collections; using System.Collections.Generic; using UnityEngine; public class keycontrol : MonoBehaviour { public float moveSpeed = 0f; public Rigidbody2D rb2d; Vector2 movement; public Animator animator; // Update is called once per frame void Update() { movement.x = Input.GetAxisRaw("Horizontal"); movement.y = Input.GetAxisRaw("Vertical"); animator.SetFloat("walk_right", movement.x); animator.SetFloat("walk_left", -movement.x); animator.SetFloat("walk_down", -movement.y); animator.SetFloat("walk_up", movement.y); } void FixedUpdate() { rb2d.MovePosition(rb2d.position + movement * moveSpeed * Time.fixedDeltaTime); if(Input.GetKey("left shift")) { moveSpeed = 200 * Time.deltaTime; animator.speed = 1.5f; } else { moveSpeed = 110 * Time.deltaTime; animator.speed = 1f; } } }
Una forma sencilla de hacer esto es priorizar un eje sobre el otro y simplemente envolver el otro control en una condición.
movement.x = Input.GetAxisRaw("Horizontal"); if (movement.x != 0) { movement.y = Input.GetAxisRaw("Vertical"); }
Sin embargo, esto puede fallar, porque dependiendo de su entrada, el eje puede devolver valores cercanos a cero al usar un controlador. En este caso, podría obtener ambos valores y buscar el más grande.
movement.x = Input.GetAxisRaw("Horizontal"); movement.y = Input.GetAxisRaw("Vertical"); if (Mathf.Abs(movement.x) > Mathf.Abs(movement.y)) { movement.y = 0; } else { movement.x = 0; }
Compartiendo como respuesta ya que no puedo comentar en esta publicación, debe consultar la nueva unidad del sistema de entrada lanzada recientemente: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/QuickStartGuide. html
Brinda un mejor control sobre las entradas, como los sistemas de eventos, para que pueda bloquear el movimiento hasta que se suelte la primera tecla.
Puede manejar el movimiento solo en uno de los ejes manejados cada oportunidad en el código, busque el borrador a continuación:
bool isXMoving; bool isYMoving; // Update is called once per frame void Update() { if (Input.GetAxisRaw("Horizontal") != 0f && !isYMoving) { movement.x = Input.GetAxisRaw("Horizontal"); movement.y = 0; isXMoving = true; isYMoving = false; } if (Input.GetAxisRaw("Horizontal") != 0f && !isXMoving) { movement.y = Input.GetAxisRaw("Vertical"); movement.x = 0; isYMoving = true; isXMoving = false; } Debug.Log($"X: {movement.x} Y: {movement.y}"); //check animator.SetFloat("walk_right", movement.x); animator.SetFloat("walk_left", -movement.x); animator.SetFloat("walk_down", -movement.y); animator.SetFloat("walk_up", movement.y); }