Menu
CoddyTech

Jedź na platformie

Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 51 z 60.

CharacterController nie jest przenoszony przez obiekt, na którym stoi: na ruchomej platformie pozostaje w miejscu, a platforma przesuwa się pod nim. Zmiana jego transform.position nie pomaga, ponieważ następne Move zaczyna od miejsca, w którym fizyka widziała go ostatnio, i cofa tę zmianę.

Dlatego gracz dodaje ruch platformy do własnego ruchu. OnControllerColliderHit(ControllerColliderHit hit) uruchamia się dla każdego elementu collider, którego dotyka Move; trafienie od spodu ma wartość hit.normal.y bliską 1. Prom, który przenosi skrzynię w ten sam sposób:

private Ferry ferry;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
    {
        ferry = f;
    }
}
challenge icon

Wyzwanie

Średni

Spraw, by postać jechała na ruchomej platformie.

  1. W Player dodaj private MovingPlatform platform; oraz OnControllerColliderHit: gdy hit.normal.y > 0.5f i obiekt ma komponent MovingPlatform, przypisz go do platform.
  2. W Update() umieść (move + velocity) * Time.deltaTime w Vector3 motion. Jeśli platform != null, dodaj platform.delta i ustaw platform = null.
  3. Wywołaj controller.Move(motion).

Naciśnij „Graj” i wskocz na platformę: poniesie cię. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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);
    }
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity