Menu
CoddyTech

Muévete hacia donde miras

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 42 de 60.

Cuando la cámara mira al jugador desde un ángulo, las flechas deberían mover al jugador según lo que muestra la pantalla: arriba se aleja de la cámara, a la derecha se mueve hacia la derecha de la cámara. Los ejes del mundo solo hacen eso cuando la cámara mira a lo largo de +z. Así que construye el movimiento a partir de las propias direcciones de la cámara, cam.forward y cam.right.

Primero hay que ajustarlas. Una cámara que mira hacia abajo al jugador tiene un forward que apunta al suelo, así que establece su y en 0 para conservar solo la parte paralela al suelo. Lo que queda es más corto que 1, aproximadamente 0.87 para una cámara inclinada 30 grados hacia abajo, y el jugador caminaría más despacio, así que normalízalo. Este controlador sigue la cámara principal, que mira hacia abajo a una esquina del nivel:

Transform cam = Camera.main.transform;

Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();

Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize();   // las diagonales no son más rápidas
controller.Move(move * speed * Time.deltaTime);

Camera.main es la cámara etiquetada como MainCamera. Las dos direcciones se leen en cada fotograma, así que los controles siguen siendo correctos cuando la cámara gira. Arriba y derecha juntos suman dos vectores unitarios en ángulo recto, cuya longitud es aproximadamente 1.41, así que el movimiento se normaliza cuando su longitud es mayor que 1.

challenge icon

Desafío

Intermedio

Haz que las flechas muevan al jugador en relación con la cámara giratoria.

  1. En Update(), copia cam.forward y cam.right, con y en 0, y normalízalos.
  2. dir es forward multiplicado por el eje sin procesar "Vertical", más right multiplicado por "Horizontal"; normalízalo cuando su longitud sea mayor que 1.
  3. Cuando dir != Vector3.zero, establece transform.rotation = Quaternion.LookRotation(dir);. Construye move a partir de dir * speed.

Pulsa «Jugar»: al pulsar arriba, el jugador se aleja de la cámara, mire hacia donde mire. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class Mover : MonoBehaviour
{
    public float speed = 4f;
    public float gravity = -15f;
    public Transform cam;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        // Se desplaza según los ejes del mundo: haz que se desplace en relación con cam y mire en la dirección en la que se desplaza
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity