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 41 de 56.

Cuando la cámara mira al jugador desde un ángulo, las flechas deberían mover al jugador tal como lo muestra la pantalla: arriba lo aleja de la cámara y derecha lo 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 direcciones de la propia 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 personaje sigue a la cámara principal, que mira hacia 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 es mayor que 1.

challenge icon

Desafío

Intermedio

La cámara gira lentamente alrededor del jugador (CameraRig.cs, listo), así que los ejes del mundo siguen girando en pantalla. Haz que las flechas muevan al jugador en relación con la cámara en Mover.cs, donde la gravedad ya está programada. En el Inspector se establecen speed (4) y cam, el Transform de la cámara.

  • Arriba mueve al jugador alejándose de la cámara por el suelo; abajo, hacia ella; derecha e izquierda, hacia la derecha y la izquierda de la cámara: speed unidades por segundo en todas las direcciones, incluidas las diagonales, aunque la cámara mire hacia abajo al jugador.
  • Mientras camina, el jugador gira para mirar en la dirección en que se mueve. Cuando se detiene, sigue mirando en esa dirección.

Pulsa Reproducir, camina mientras la cámara gira y luego 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 mueve a lo largo de los ejes del mundo: haz que se mueva en relación con cam y mire en la dirección en la que se mueve
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Creación de juegos reales