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.
Desafío
IntermedioHaz que las flechas muevan al jugador en relación con la cámara giratoria.
- En
Update(), copiacam.forwardycam.right, conyen 0, y normalízalos. diresforwardmultiplicado por el eje sin procesar"Vertical", másrightmultiplicado por"Horizontal"; normalízalo cuando su longitud sea mayor que 1.- Cuando
dir != Vector3.zero, establecetransform.rotation = Quaternion.LookRotation(dir);. Construyemovea partir dedir * 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
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco8Controlador de personaje
CharacterController.MoveGravedad manualSaltarEmpujar objetosMuévete hacia donde mirasRepaso: doble salto3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: Corredor sin fin
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entradaPractica por tu cuenta: Playground de Unity