Unity Game Engine

Panduan Lengkap Membuat Platformer 2D Pertama Anda di Unity

Belajar Unity: Buat Platformer 2D Pertamamu

PPLG

PPLG

Penulis

04 May 2026
6 x dilihat

Membuat game platformer 2D sendiri di Unity bisa menjadi pengalaman yang sangat memuaskan, terutama bagi para pengembang pemula. Artikel ini akan memandu Anda melalui setiap langkah krusial, mulai dari setup dasar hingga implementasi mekanik gameplay yang kompleks. Kita akan membahas konsep-konsep inti, memberikan contoh kode yang jelas, dan menyajikan tips praktis yang akan mempercepat kurva belajar Anda.

Mengapa Platformer 2D?

Platformer 2D adalah genre klasik yang menawan. Kesederhanaan visualnya seringkali menyembunyikan kedalaman gameplay yang bisa sangat menantang dan menyenangkan. Genre ini juga merupakan tempat yang sangat baik untuk memulai belajar game development karena mekanik dasarnya, seperti pergerakan karakter, lompatan, dan deteksi tabrakan, adalah fondasi bagi banyak genre game lainnya.

Persiapan Awal di Unity

Sebelum kita mulai coding, mari siapkan proyek Unity kita.

  1. Buat Proyek Baru: Buka Unity Hub, klik "New Project", pilih template "2D Core", beri nama proyek Anda (misalnya, "MyFirstPlatformer"), dan pilih lokasi penyimpanan.
  2. Struktur Folder: Sangat penting untuk menjaga proyek Anda tetap terorganisir. Buat folder-folder berikut di dalam Assets:
    • Scripts: Untuk semua skrip C#.
    • Sprites: Untuk aset gambar karakter, latar belakang, tilemap, dll.
    • Prefabs: Untuk objek game yang dapat digunakan kembali (misalnya, karakter pemain, musuh).
    • Scenes: Untuk menyimpan scene game Anda.
    • Animations: Untuk menyimpan animasi karakter.
    • Materials: Untuk material shader (jika diperlukan).

Membangun Level dengan Tilemap

Unity menyediakan sistem Tilemap yang sangat efisien untuk membangun level 2D.

  1. Import Sprite: Bawa sprite tile Anda ke dalam folder Sprites. Pastikan pengaturan Sprite Mode di Inspector adalah Multiple jika Anda memiliki sprite sheet, lalu gunakan Sprite Editor untuk memotongnya menjadi tile individual. Setel Pixels Per Unit agar sesuai dengan skala permainan Anda (misalnya, 16 atau 32).
  2. Buat Tile Palette:
    • Buka jendela Tile Palette (Window > 2D > Tile Palette).
    • Klik "Create New Palette", beri nama, dan simpan.
    • Seret sprite tile Anda dari folder Sprites ke dalam Tile Palette.
  3. Buat Tilemap GameObject:
    • Di jendela Hierarchy, klik kanan > 2D Object > Tilemap > Rectangular. Ini akan membuat Grid object dengan Tilemap sebagai child-nya.
    • Pilih Tilemap object, lalu gunakan Brush Tool (Tekan B atau pilih dari toolbar) di Tile Palette untuk mulai menggambar level Anda.

Membuat Karakter Pemain

Karakter pemain adalah inti dari platformer. Kita perlu memberinya kemampuan bergerak dan melompat.

Komponen Penting

Setiap objek karakter pemain di Unity memerlukan beberapa komponen kunci:

  • SpriteRenderer: Untuk menampilkan sprite karakter.
  • Rigidbody2D: Memberikan fisika pada objek. Penting untuk gravitasi dan respons terhadap gaya.
    • Atur Gravity Scale (misalnya, 2 atau 3) untuk membuat gravitasi terasa lebih kuat.
    • Di Constraints, centang Freeze Rotation Z agar karakter tidak berputar saat bertabrakan.
  • BoxCollider2D / CircleCollider2D: Mendefinisikan bentuk fisik objek untuk deteksi tabrakan.
    • Sesuaikan ukuran collider agar pas dengan sprite karakter.
  • Animator: Untuk mengelola animasi (idle, run, jump, dll.).
  • PlayerController (Script Kustom): Script C# yang akan kita buat untuk mengendalikan pergerakan.

Membuat Prefab Pemain

  1. Buat objek kosong di Hierarchy, beri nama Player.
  2. Tambahkan komponen SpriteRenderer dan drag sprite pemain Anda.
  3. Tambahkan komponen Rigidbody2D dan BoxCollider2D.
  4. Seret objek Player dari Hierarchy ke dalam folder Prefabs untuk menjadikannya prefab.

Skrip PlayerController.cs

Buat skrip C# baru di folder Scripts, beri nama PlayerController.cs, dan lampirkan ke prefab Player.

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(BoxCollider2D))]
public class PlayerController : MonoBehaviour
{
    [Header("Movement")]
    [SerializeField] private float moveSpeed = 5f;
    [SerializeField] private float jumpForce = 10f;

    [Header("Ground Check")]
    [SerializeField] private Transform groundCheck; // GameObject kosong di bawah kaki pemain
    [SerializeField] private float groundCheckRadius = 0.1f;
    [SerializeField] private LayerMask groundLayer; // Layer yang dianggap sebagai tanah

    private Rigidbody2D rb;
    private bool isGrounded;
    private float horizontalInput;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // Input Gerakan Horizontal
        horizontalInput = Input.GetAxisRaw("Horizontal"); // Mendapatkan input -1 (kiri) atau 1 (kanan)

        // Check Apakah Karakter di Tanah
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);

        // Input Lompat
        if (Input.GetButtonDown("Jump") && isGrounded) // "Jump" biasanya tombol Spasi
        {
            Jump();
        }
    }

    void FixedUpdate()
    {
        // Menerapkan Gerakan Horizontal
        Move(horizontalInput);
    }

    void Move(float direction)
    {
        // Mengatur kecepatan horizontal Rigidbody2D
        rb.velocity = new Vector2(direction * moveSpeed, rb.velocity.y);

        // Opsional: Membalik Sprite berdasarkan arah gerakan
        if (direction > 0)
        {
            transform.localScale = new Vector3(1, 1, 1);
        }
        else if (direction < 0)
        {
            transform.localScale = new Vector3(-1, 1, 1);
        }
    }

    void Jump()
    {
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
    }

    // Gizmos untuk visualisasi Ground Check di Scene View
    void OnDrawGizmosSelected()
    {
        if (groundCheck != null)
        {
            Gizmos.color = Color.red;
            Gizmos.DrawWireSphere(groundCheck.position, groundCheckRadius);
        }
    }
}

Menyiapkan Karakter di Unity Editor

  1. Buat sebuah GameObject kosong sebagai anak dari Player object, beri nama GroundCheck. Posisikan objek ini tepat di bawah kaki karakter.
  2. Pada prefab Player, pada komponen PlayerController:
    • Drag objek GroundCheck ke slot Ground Check.
    • Atur Ground Check Radius (nilai kecil seperti 0.1f biasanya cukup).
    • PENTING: Untuk Ground Layer, Anda perlu membuat Layer baru. Pilih Player object, di Inspector cari dropdown Layer, klik Add Layer..., lalu di salah satu slot User Layer yang kosong, ketikkan Ground. Kembali ke Player object dan set Layer-nya menjadi Ground. Sekarang, pada slot Ground Layer di PlayerController, pilih Ground.
  3. Pastikan Tilemap level Anda berada di Layer yang sama dengan yang Anda atur di Ground Layer player (misalnya, Ground). Anda bisa mengatur Layer untuk Tilemap GameObject.

Tip Pemula yang Jarang Diketahui: RequireComponent dan OnDrawGizmosSelected

  • [RequireComponent(typeof(Rigidbody2D))]: Atribut ini memastikan bahwa GameObject yang memiliki skrip ini secara otomatis akan memiliki komponen Rigidbody2D dan BoxCollider2D. Ini mencegah error jika Anda lupa menambahkannya secara manual.
  • OnDrawGizmosSelected(): Fungsi ini memungkinkan Anda menggambar visualisasi bantu di Scene View saat objek terpilih. Sangat berguna untuk melihat jangkauan groundCheck tanpa harus menjalankan game.

Animasi Karakter

Animasi membuat karakter Anda terasa hidup.

  1. Buat Animator Controller: Di folder Animations, klik kanan > Create > Animator Controller. Beri nama (misalnya, PlayerAnimator).
  2. Buka Jendela Animator: Buka jendela Animator (Window > Animation > Animator).
  3. Atur Parameter: Di jendela Animator, klik tab Parameters. Tambahkan parameter tipe Float bernama Speed dan tipe Bool bernama IsGrounded.
  4. Buat State Animasi:
    • Drag sprite animasi Anda (idle, run, jump) ke jendela Animator. Setiap sprite animasi akan menjadi Animation Clip.
    • Klik kanan pada clip Idle > Set as Layer Default State.
    • Buat transisi: Klik kanan pada Idle > Make Transition > arahkan ke Run. Klik kanan pada Run > Make Transition > arahkan ke Idle. Lakukan hal yang sama untuk Jump.
  5. Konfigurasi Transisi:
    • Pilih transisi Idle -> Run. Di Inspector:
      • Hapus Has Exit Time.
      • Tambahkan kondisi: Klik +, pilih Speed, set Greater ke nilai kecil (misalnya, 0.1).
    • Pilih transisi Run -> Idle. Di Inspector:
      • Hapus Has Exit Time.
      • Tambahkan kondisi: Klik +, pilih Speed, set Less ke nilai kecil (misalnya, 0.1).
    • Pilih transisi Any State -> Jump. Di Inspector:
      • Hapus Has Exit Time.
      • Tambahkan kondisi: Klik +, pilih IsGrounded, set False.
    • Pilih transisi Jump -> Idle (atau Run jika Anda ingin melanjutkan lari setelah mendarat). Di Inspector:
      • Hapus Has Exit Time.
      • Tambahkan kondisi: Klik +, pilih IsGrounded, set True.

Memperbarui Skrip PlayerController.cs untuk Animasi

Tambahkan baris berikut ke skrip PlayerController.cs:

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(BoxCollider2D))]
public class PlayerController : MonoBehaviour
{
    // ... (variabel sebelumnya tetap sama) ...

    private Rigidbody2D rb;
    private Animator animator; // Tambahkan variabel Animator
    private bool isGrounded;
    private float horizontalInput;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>(); // Ambil komponen Animator
    }

    void Update()
    {
        horizontalInput = Input.GetAxisRaw("Horizontal");

        isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);

        // Mengirim nilai ke Animator
        animator.SetFloat("Speed", Mathf.Abs(horizontalInput)); // Gunakan Mathf.Abs karena kita hanya peduli kecepatan, bukan arah untuk animasi run
        animator.SetBool("IsGrounded", isGrounded);

        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            Jump();
        }
    }

    void FixedUpdate()
    {
        Move(horizontalInput);
    }

    void Move(float direction)
    {
        rb.velocity = new Vector2(direction * moveSpeed, rb.velocity.y);

        // Membalik Sprite
        if (direction > 0)
        {
            transform.localScale = new Vector3(1, 1, 1);
            // Pastikan animator membaca dari sprite yang benar jika menggunakan sprite flip
        }
        else if (direction < 0)
        {
            transform.localScale = new Vector3(-1, 1, 1);
            // Pastikan animator membaca dari sprite yang benar jika menggunakan sprite flip
        }
    }

    void Jump()
    {
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
    }

    // ... (OnDrawGizmosSelected tetap sama) ...
}

Mengatur Animator Controller di Inspector

  • Pada prefab Player, seret PlayerAnimator dari folder Animations ke slot Controller pada komponen Animator.

Mekanik Tambahan (Opsional, tapi Sangat Direkomendasikan)

Wall Jump

Fitur ini membutuhkan deteksi dinding.

  1. Tambahkan Komponen: Player membutuhkan BoxCollider2D tambahan atau EdgeCollider2D di sisi karakter untuk mendeteksi dinding. Atau, bisa juga menggunakan deteksi raycast.
  2. Skrip Tambahan: Perlu logika untuk mendeteksi apakah pemain menyentuh dinding dan mengizinkan lompatan ke arah yang berlawanan.

Double Jump

Mirip dengan lompat biasa, tapi mengizinkan lompatan kedua saat di udara.

  • Dalam PlayerController.cs: Tambahkan variabel canDoubleJump = false;. Saat pemain melompat pertama kali, set canDoubleJump = true;. Saat melompat kedua kali, pastikan isGrounded false tapi canDoubleJump true, lalu set canDoubleJump = false;.

Collectibles (Koin, Power-up)

  1. Buat Prefab Collectible: Gunakan objek dengan SpriteRenderer, CircleCollider2D (atur Is Trigger menjadi true), dan skrip Collectible.cs.

  2. Skrip Collectible.cs:

    using UnityEngine;
    
    public class Collectible : MonoBehaviour
    {
        [Tooltip("Nilai yang diberikan oleh collectible (misal: koin = 10)")]
        [SerializeField] private int value = 10;
    
        void OnTriggerEnter2D(Collider2D other)
        {
            // Cek apakah yang menabrak adalah pemain
            if (other.CompareTag("Player"))
            {
                // Tambahkan logika untuk memberi skor/efek ke pemain
                Debug.Log("Collected: " + value);
    
                // Hapus collectible dari scene
                Destroy(gameObject);
            }
        }
    }
    
  3. Penting: Set Tag pada prefab Player Anda menjadi Player. Anda bisa menambah tag baru melalui Add Tag... di Inspector pada objek Player.

Kamera Mengikuti Pemain (Cinemachine)

Cinemachine adalah paket Unity yang sangat kuat untuk mengelola kamera.

  1. Instal Cinemachine: Buka Window > Package Manager. Pilih Unity Registry di dropdown atas. Cari Cinemachine dan klik Install.
  2. Buat Virtual Camera: Di jendela Hierarchy, klik kanan > Cinemachine > 2D Camera. Ini akan membuat CM vcam1 dan CinemachineBrain di kamera utama Anda.
  3. Konfigurasi Virtual Camera:
    • Pilih CM vcam1.
    • Di Inspector, pada bagian Follow, drag objek Player Anda.
    • Pada bagian Look At, Anda juga bisa drag objek Player.
    • Sesuaikan Damping (misalnya, X=1, Y=1) untuk gerakan kamera yang lebih halus.
    • Gunakan Dead Zone atau Screen Confiner untuk membatasi gerakan kamera.

Tips Praktis untuk Meningkatkan Kualitas

  • Input System Baru: Untuk proyek yang lebih besar, pertimbangkan menggunakan Input System baru dari Unity (cari di Package Manager). Ini lebih fleksibel dan mendukung berbagai macam input device.
  • Pooling Objek: Jika Anda memiliki banyak objek yang sering muncul dan hilang (misalnya, peluru, musuh), gunakan teknik pooling objek untuk performa yang lebih baik daripada Instantiate dan Destroy berulang kali.
  • State Machine untuk Karakter: Untuk karakter dengan banyak perilaku (idle, walk, run, jump, attack, hurt, death), pertimbangkan untuk mengimplementasikan State Machine untuk mengelola transisi antar state dengan lebih rapi.
  • Gunakan Scriptable Objects: Untuk menyimpan data seperti statistik musuh, konfigurasi senjata, atau item, Scriptable Objects adalah cara yang elegan untuk mengelola data game di luar scene.
  • Manajemen Scene: Gunakan SceneManager untuk memuat level berikutnya, layar menu, dll.
  • Optimasi Sprites: Gunakan Sprite Atlas untuk menggabungkan banyak sprite menjadi satu tekstur, mengurangi draw calls dan meningkatkan performa.
  • Audio: Jangan lupakan efek suara dan musik latar! Tambahkan AudioSource ke objek yang relevan dan gunakan AudioClip untuk suara.

Kesimpulan

Membuat game platformer 2D pertama Anda adalah perjalanan yang menantang namun sangat bermanfaat. Dengan memahami konsep-konsep inti seperti fisika 2D, kontrol karakter, sistem tilemap, dan animasi, Anda telah membangun fondasi yang kuat. Ingatlah untuk terus bereksperimen, membaca dokumentasi Unity, dan tidak takut untuk mencoba hal-hal baru. Komunitas Unity sangat besar dan suportif, jadi jangan ragu untuk mencari bantuan jika Anda menemui kebuntuan. Selamat berkreasi dan semoga sukses dalam petualangan game development Anda!

0.0

Berikan Rating

Komentar (0)

Silakan login untuk memberikan komentar.

Login Sekarang

Belum ada komentar. Jadilah yang pertama!