Menu
CoddyTech

Naik Platform

Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 51 dari 60.

CharacterController tidak ikut terbawa oleh pijakan tempatnya berdiri: di atas platform bergerak, CharacterController tetap di tempat dan platform bergeser menjauh di bawahnya. Mengubah transform.position tidak membantu, karena pemanggilan Move berikutnya dimulai dari posisi yang terakhir kali diketahui fisika dan membatalkan perubahan tersebut.

Jadi, pemain menambahkan gerakan platform ke gerakannya sendiri. OnControllerColliderHit(ControllerColliderHit hit) berjalan untuk setiap collider yang disentuh oleh Move; benturan dari bawah memiliki hit.normal.y yang mendekati 1. Feri yang membawa peti dengan cara yang sama:

private Ferry ferry;

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

Tantangan

Sedang

Buat pemain menumpang di platform yang bergerak.

  1. Di Player, tambahkan private MovingPlatform platform; dan OnControllerColliderHit: saat hit.normal.y > 0.5f dan objek memiliki MovingPlatform, simpan objek itu di platform.
  2. Di Update(), masukkan (move + velocity) * Time.deltaTime ke Vector3 motion. Jika platform != null, tambahkan platform.delta dan tetapkan platform = null.
  3. Panggil controller.Move(motion).

Tekan tombol “Main” dan lompat ke platform: platform itu akan membawamu. Lalu tekan tombol “Periksa”.

Coba sendiri

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

Semua pelajaran di Membangun Game Sungguhan

Latihan sendiri: Playground Unity