Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Fai muovere il giocatore con le frecce rispetto alla telecamera che ruota.

  1. In Update(), copia cam.forward e cam.right, con y impostato a 0 e normalizzati.
  2. dir è forward moltiplicato per l'asse grezzo "Vertical" più right moltiplicato per "Horizontal"; normalizzalo quando la sua lunghezza è maggiore di 1.
  3. Quando dir != Vector3.zero, imposta transform.rotation = Quaternion.LookRotation(dir);. Crea move a partire da dir * 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

Esercitati da solo: Playground Unity