Muoviti dove guardi
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 42 di 60.
Quando la telecamera guarda il giocatore da un angolo, le frecce dovrebbero muovere il giocatore come mostra lo schermo: su lo fa allontanare dalla telecamera, destra lo fa camminare verso destra rispetto alla telecamera. Gli assi del mondo fanno questo solo quando la telecamera guarda lungo +z. Quindi costruisci il movimento usando le direzioni della telecamera stessa, cam.forward e cam.right.
Prima bisogna correggerle. Una telecamera che guarda il giocatore dall'alto ha un forward che punta verso il terreno, quindi imposta il suo y a 0 per mantenere solo la componente parallela al terreno. Quello che rimane è più corto di 1, circa 0,87 per una telecamera inclinata verso il basso di 30 gradi, e il giocatore camminerebbe più lentamente, quindi normalizzalo. Questo personaggio segue la telecamera principale, che guarda un angolo del livello:
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(); // i movimenti diagonali non sono più veloci
controller.Move(move * speed * Time.deltaTime);Camera.main è la telecamera contrassegnata con MainCamera. Le due direzioni vengono lette a ogni fotogramma, così i comandi restano corretti quando la telecamera gira. Su e destra insieme sommano due vettori unitari ad angolo retto, che hanno una lunghezza di circa 1,41, quindi il movimento viene normalizzato quando la sua lunghezza supera 1.
Sfida
MedioFai muovere il giocatore con le frecce rispetto alla telecamera che ruota.
- In
Update(), copiacam.forwardecam.right, conyimpostato a 0 e normalizzati. dirèforwardmoltiplicato per l'asse grezzo"Vertical"piùrightmoltiplicato per"Horizontal"; normalizzalo quando la sua lunghezza è maggiore di 1.- Quando
dir != Vector3.zero, impostatransform.rotation = Quaternion.LookRotation(dir);. Creamovea partire dadir * speed.
Premi «Gioca»: premendo su, il giocatore si allontana dalla telecamera, in qualunque direzione sia rivolta. Poi premi «Verifica».
Provalo tu
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;
// Si muove lungo gli assi del mondo: fallo muovere rispetto a cam e rivolgere nella direzione in cui si muove
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}
}
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro2Pulsanti e schermate
Pulsanti e onClickLambdaCollegare nell'InspectorPannelli attivi e disattiviBarre della saluteRiepilogo: negozio degli upgrade5Salvare con PlayerPrefs
Salvare un numeroCaricare con un valore predefinitoPunteggio massimoSalvare le impostazioniRiepilogo: monete in banca8Controller del personaggio
CharacterController.MoveGravità manualeSaltoSpingere gli oggettiMuoviti dove guardiRiepilogo: doppio salto3Il gestore del gioco
Uno script gestisce il giocoIl SingletonStati di giocoSelezionare lo statoRiepilogo: gestore del round6Progetto: Runner infinito
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di inputEsercitati da solo: Playground Unity