Menu
CoddyTech

Lintasan

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

Bab ini membahas pembuatan platformer 3D. Kamu berlari dan melompat melintasi platform yang melayang, menaiki platform yang meluncur, menyentuh titik periksa agar saat terjatuh kamu tidak kembali ke awal, mengumpulkan permata yang jumlahnya ditampilkan di layar, mencapai garis finis untuk masuk ke level berikutnya, lalu mencoba mengalahkan waktu terbaikmu. Game ini terdiri dari lima skrip yang sudah ada di proyek sejak awal: Player, MovingPlatform, Checkpoint, Gem, dan FinishLine. Empat skrip terakhir masih kosong untuk saat ini, dan setiap pelajaran mengisi salah satunya. Pemain menggunakan CharacterController yang dikendalikan dengan aksi Input System, dan kamera menjadi anaknya, jadi kamera mengikuti pemain tanpa skrip.

CharacterController bergerak dengan dua cara. Move(motion) menggerakkannya sejauh jarak tertentu dan tidak menambahkan apa pun, jadi gravitasi, lompatan, dan Time.deltaTime harus ditangani oleh skrip, seperti di bab Character Controller. SimpleMove(speed) menerima kecepatan dalam satuan per detik, mengalikannya dengan waktu frame itu sendiri, lalu menambahkan gravitasi. Fungsi ini mengabaikan nilai y yang kamu berikan, jadi karakter yang digerakkan dengannya akan jatuh dari tepian, tetapi tidak akan pernah bisa melompat. Anjing gembala dalam game menggiring dari sudut pandang atas ini tidak perlu melompat, jadi SimpleMove dan aksi Move menjadi seluruh isi skripnya:

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

Pemain platformer harus bisa melompat, jadi ia menyimpan kecepatan vertikalnya sendiri dan bergerak dengan Move, serta membaca aksi Move dan Jump, bukan class Input. Unity menyarankan satu pemanggilan Move atau SimpleMove per frame: gerakan berjalan dan jatuh digabung dalam pemanggilan yang sama, lalu isGrounded menggambarkan seluruh gerakan itu.

challenge icon

Tantangan

Sedang

Buat pemain berjalan, melompat, dan jatuh.

  1. Di Start(), temukan Move dan Jump dengan InputSystem.actions.FindAction.
  2. Di Update(), berjalan dengan kecepatan speed: x dari Move mengikuti x, y-nya mengikuti z.
  3. Tambahkan gravity * Time.deltaTime ke velocity.y, gunakan -2f saat berada di tanah dan jatuh. Saat berada di tanah, melompat akan menetapkan nilainya menjadi Mathf.Sqrt(jumpHeight * -2f * gravity).
  4. Panggil controller.Move((move + velocity) * Time.deltaTime) satu kali.

Tekan tombol “Main”: lompat ke platform pertama. 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 Vector3 velocity;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // bergerak dengan aksi Move, melompat dengan aksi Jump, lalu jatuh karena gravitasi
    }
}

Semua pelajaran di Membangun Game Sungguhan

Latihan sendiri: Playground Unity