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.
- Buat Proyek Baru: Buka Unity Hub, klik "New Project", pilih template "2D Core", beri nama proyek Anda (misalnya, "MyFirstPlatformer"), dan pilih lokasi penyimpanan.
- 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.
- Import Sprite: Bawa sprite tile Anda ke dalam folder
Sprites. Pastikan pengaturanSprite Modedi Inspector adalahMultiplejika Anda memiliki sprite sheet, lalu gunakanSprite Editoruntuk memotongnya menjadi tile individual. SetelPixels Per Unitagar sesuai dengan skala permainan Anda (misalnya, 16 atau 32). - 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
Spriteske dalamTile Palette.
- Buka jendela
- Buat Tilemap GameObject:
- Di jendela
Hierarchy, klik kanan >2D Object>Tilemap>Rectangular. Ini akan membuatGridobject denganTilemapsebagai child-nya. - Pilih
Tilemapobject, lalu gunakanBrush Tool(TekanBatau pilih dari toolbar) diTile Paletteuntuk mulai menggambar level Anda.
- Di jendela
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, centangFreeze Rotation Zagar karakter tidak berputar saat bertabrakan.
- Atur
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
- Buat objek kosong di
Hierarchy, beri namaPlayer. - Tambahkan komponen
SpriteRendererdan drag sprite pemain Anda. - Tambahkan komponen
Rigidbody2DdanBoxCollider2D. - Seret objek
PlayerdariHierarchyke dalam folderPrefabsuntuk 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
- Buat sebuah GameObject kosong sebagai anak dari
Playerobject, beri namaGroundCheck. Posisikan objek ini tepat di bawah kaki karakter. - Pada prefab
Player, pada komponenPlayerController:- Drag objek
GroundCheckke slotGround Check. - Atur
Ground Check Radius(nilai kecil seperti 0.1f biasanya cukup). - PENTING: Untuk
Ground Layer, Anda perlu membuat Layer baru. PilihPlayerobject, di Inspector cari dropdownLayer, klikAdd Layer..., lalu di salah satu slot User Layer yang kosong, ketikkanGround. Kembali kePlayerobject dan set Layer-nya menjadiGround. Sekarang, pada slotGround LayerdiPlayerController, pilihGround.
- Drag objek
- Pastikan
Tilemaplevel Anda berada di Layer yang sama dengan yang Anda atur diGround Layerplayer (misalnya,Ground). Anda bisa mengatur Layer untukTilemapGameObject.
Tip Pemula yang Jarang Diketahui: RequireComponent dan OnDrawGizmosSelected
[RequireComponent(typeof(Rigidbody2D))]: Atribut ini memastikan bahwa GameObject yang memiliki skrip ini secara otomatis akan memiliki komponenRigidbody2DdanBoxCollider2D. Ini mencegah error jika Anda lupa menambahkannya secara manual.OnDrawGizmosSelected(): Fungsi ini memungkinkan Anda menggambar visualisasi bantu diScene Viewsaat objek terpilih. Sangat berguna untuk melihat jangkauangroundChecktanpa harus menjalankan game.
Animasi Karakter
Animasi membuat karakter Anda terasa hidup.
- Buat Animator Controller: Di folder
Animations, klik kanan >Create>Animator Controller. Beri nama (misalnya,PlayerAnimator). - Buka Jendela Animator: Buka jendela
Animator(Window > Animation > Animator). - Atur Parameter: Di jendela
Animator, klik tabParameters. Tambahkan parameter tipeFloatbernamaSpeeddan tipeBoolbernamaIsGrounded. - Buat State Animasi:
- Drag sprite animasi Anda (idle, run, jump) ke jendela
Animator. Setiap sprite animasi akan menjadiAnimation Clip. - Klik kanan pada clip
Idle>Set as Layer Default State. - Buat transisi: Klik kanan pada
Idle>Make Transition> arahkan keRun. Klik kanan padaRun>Make Transition> arahkan keIdle. Lakukan hal yang sama untukJump.
- Drag sprite animasi Anda (idle, run, jump) ke jendela
- Konfigurasi Transisi:
- Pilih transisi
Idle->Run. Di Inspector:- Hapus
Has Exit Time. - Tambahkan kondisi: Klik
+, pilihSpeed, setGreaterke nilai kecil (misalnya,0.1).
- Hapus
- Pilih transisi
Run->Idle. Di Inspector:- Hapus
Has Exit Time. - Tambahkan kondisi: Klik
+, pilihSpeed, setLesske nilai kecil (misalnya,0.1).
- Hapus
- Pilih transisi
Any State->Jump. Di Inspector:- Hapus
Has Exit Time. - Tambahkan kondisi: Klik
+, pilihIsGrounded, setFalse.
- Hapus
- Pilih transisi
Jump->Idle(atauRunjika Anda ingin melanjutkan lari setelah mendarat). Di Inspector:- Hapus
Has Exit Time. - Tambahkan kondisi: Klik
+, pilihIsGrounded, setTrue.
- Hapus
- Pilih transisi
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, seretPlayerAnimatordari folderAnimationske slotControllerpada komponenAnimator.
Mekanik Tambahan (Opsional, tapi Sangat Direkomendasikan)
Wall Jump
Fitur ini membutuhkan deteksi dinding.
- Tambahkan Komponen:
PlayermembutuhkanBoxCollider2Dtambahan atauEdgeCollider2Ddi sisi karakter untuk mendeteksi dinding. Atau, bisa juga menggunakan deteksi raycast. - 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 variabelcanDoubleJump = false;. Saat pemain melompat pertama kali, setcanDoubleJump = true;. Saat melompat kedua kali, pastikanisGroundedfalse tapicanDoubleJumptrue, lalu setcanDoubleJump = false;.
Collectibles (Koin, Power-up)
-
Buat Prefab Collectible: Gunakan objek dengan
SpriteRenderer,CircleCollider2D(aturIs Triggermenjadi true), dan skripCollectible.cs. -
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); } } } -
Penting: Set Tag pada prefab
PlayerAnda menjadiPlayer. Anda bisa menambah tag baru melaluiAdd Tag...di Inspector pada objekPlayer.
Kamera Mengikuti Pemain (Cinemachine)
Cinemachine adalah paket Unity yang sangat kuat untuk mengelola kamera.
- Instal Cinemachine: Buka
Window>Package Manager. PilihUnity Registrydi dropdown atas. CariCinemachinedan klikInstall. - Buat Virtual Camera: Di jendela
Hierarchy, klik kanan >Cinemachine>2D Camera. Ini akan membuatCM vcam1danCinemachineBraindi kamera utama Anda. - Konfigurasi Virtual Camera:
- Pilih
CM vcam1. - Di Inspector, pada bagian
Follow, drag objekPlayerAnda. - Pada bagian
Look At, Anda juga bisa drag objekPlayer. - Sesuaikan
Damping(misalnya,X=1,Y=1) untuk gerakan kamera yang lebih halus. - Gunakan
Dead ZoneatauScreen Confineruntuk membatasi gerakan kamera.
- Pilih
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
InstantiatedanDestroyberulang kali. - State Machine untuk Karakter: Untuk karakter dengan banyak perilaku (idle, walk, run, jump, attack, hurt, death), pertimbangkan untuk mengimplementasikan
State Machineuntuk mengelola transisi antar state dengan lebih rapi. - Gunakan
Scriptable Objects: Untuk menyimpan data seperti statistik musuh, konfigurasi senjata, atau item,Scriptable Objectsadalah cara yang elegan untuk mengelola data game di luar scene. - Manajemen Scene: Gunakan
SceneManageruntuk memuat level berikutnya, layar menu, dll. - Optimasi Sprites: Gunakan
Sprite Atlasuntuk menggabungkan banyak sprite menjadi satu tekstur, mengurangi draw calls dan meningkatkan performa. - Audio: Jangan lupakan efek suara dan musik latar! Tambahkan
AudioSourceke objek yang relevan dan gunakanAudioClipuntuk 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!
Berikan Rating
Komentar (0)
Silakan login untuk memberikan komentar.
Login SekarangBelum ada komentar. Jadilah yang pertama!
Kata Kunci
Pembaca (2)