Sali sulla piattaforma
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 51 di 60.
Un CharacterController non viene trasportato da ciò su cui si trova: su una piattaforma mobile resta fermo e la piattaforma scivola via sotto di lui. Spostare il suo transform.position non serve, perché il successivo Move parte dal punto in cui la fisica lo ha visto l'ultima volta e annulla la modifica.
Quindi il giocatore aggiunge il movimento della piattaforma al proprio. OnControllerColliderHit(ControllerColliderHit hit) viene eseguito per ogni collider toccato da un Move; un contatto dal basso ha hit.normal.y vicino a 1. Un traghetto che trasporta una cassa allo stesso modo:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Sfida
MedioFai in modo che il giocatore venga trasportato dalla piattaforma mobile.
- In
Player, aggiungiprivate MovingPlatform platform;eOnControllerColliderHit: quandohit.normal.y > 0.5fe l'oggetto ha un componenteMovingPlatform, memorizzalo inplatform. - In
Update(), inserisci(move + velocity) * Time.deltaTimeinVector3 motion. Seplatform != null, aggiungiplatform.deltae impostaplatform = null. - Chiama
controller.Move(motion).
Premi «Gioca» e salta sulla piattaforma: ti trasporterà. Poi premi «Verifica».
Provalo tu
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * 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: tachimetro4Scene e livelli
Caricare una scenaRiavviare il livelloLivello successivoMantenere i dati tra le sceneRiepilogo: selezione del livello10Progetto: Platform 3D
Il percorsoPiattaforme mobili2Pulsanti 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