Súbete a la plataforma
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 51 de 60.
Un CharacterController no es transportado por aquello sobre lo que se encuentra: en una plataforma móvil permanece en su sitio y la plataforma se desliza debajo de él. Cambiar su transform.position no ayuda, porque el siguiente Move parte del lugar donde la física lo vio por última vez y deshace el cambio.
Así que el jugador suma el movimiento de la plataforma al suyo. OnControllerColliderHit(ControllerColliderHit hit) se ejecuta por cada collider que toca un Move; un impacto desde abajo tiene hit.normal.y cerca de 1. Un ferry que transporta una caja de la misma manera:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Desafío
IntermedioHaz que el jugador viaje en la plataforma móvil.
- En
Player, añadeprivate MovingPlatform platform;yOnControllerColliderHit: cuandohit.normal.y > 0.5fy el objeto tenga unMovingPlatform, guárdalo enplatform. - En
Update(), coloca(move + velocity) * Time.deltaTimeenVector3 motion. Siplatform != null, añadeplatform.deltay asignaplatform = null. - Llama a
controller.Move(motion).
Pulsa «Jugar» y salta a la plataforma: te transporta. Después, pulsa «Comprobar».
Pruébalo tú mismo
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);
}
}
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ímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: Plataformas 3D
El recorridoPlataformas móviles2Botones 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 banco3El 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