Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Tile-Based Games
Gamedevelopment

Game 'Sokoban' Unity 2D Tile-Based

by
Difficulty:BeginnerLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Aditia Dwiperdana (you can also view the original English article)

Final product image
What You'll Be Creating

Pada tutorial ini kita akan mempelajari sebuah pendekatan untuk membuat sokoban atau game mendorong peti menggunakan logika berbasis petak dan array 2 dimensi untuk menyimpan data level. Kita akan menggunakan Unity dengan C# sebagai bahasa scripting. Silakan unduh file yang disediakan dengan tutorial ini untuk mengikuti bersama.

1. Permainan Sokoban

Mungkin ada beberapa yang berlum pernah memainkan suatu versi dari game mSokoban. Versi aslinya mungkin lebih tua dari sebagian dari kamu. Lihatlah halaman wiki untuk detail lebih lanjut. Pada dasarnya, kita memiliki karakter atau elemen yang diatur oleh pemain yang harus mendorong peti atau elemen sejenis menuju petak tujuan.

Level terdiri dari kotak atau grid persegi berisi petak di mana sebuah petak bisa dilewati pemain atau tidak. Kita bisa berjalan pada petak walkable dan mendorong peti ke atasnya. Petak walkable khusus akan ditandai sebagai petak tujuan, di mana peti harus berada untuk menyelesaikan level. Karakter biasanya dikontrol dengan keyboard.Begitu semua peti mendapat petak tujuan, level akan selesai.

Pengembangan berbasis petak berarti game kita terdiri dari sejumlah petak yang disebar dengan cara tertentu. Elemen data level akan merepresentasikan bagaimana petak akan disusun pada level kita. Pada kasus ini kita akan menggunakan pertak persegi. Kamu bisa membaca lebih lanjut tentang game berbasis petak di sini di Envato Tuts+.

2. Menyiapkan Proyek Unity

Kita lihat b agaimana kita mengatur proyek Unity untuk tutorial ini.

Art

Untuk proyek tutorial ini, kita tidak akan menggunakan aset art eksternal, tapi kita akan gunakan primitif sprite yang dibuat dengan Unity 2017.1. Gambar di bawah memperlihatkan bagaimana kita membuat berbagai bentuk berbeda dalam unity.

How to create sprites within United 20171

Kita akan menggunakan sprit Square untuk melambangkan sebuah petak dalam level sokoban kita. Kita akan gunakan sprite Triangle untuk melambangkan karakter, dan sprite Circle untuk sebuah peti, atau dalam kasus ini, sebuah bola. Petak tanah yang normal berwarna putih, sedangkan petak tujuan memiliki warna lain agar lebih mencolok.

Data Level

Kita akan merepresentasikan data level dalam bentuk array dua dimensi yang menyediakan korelasi antara logika dan elemen visual. Kita menggunakan file teks sederhana untuk menyimpan data level, yang membuat lebih mudah untuk mengubah level di luar Unity atau mengubah level hanya dengan mengubah file yang ditentukan. Folder Resources memiliki file teks level, yang berisi level default kita.

Level memiliki tujuh kolom dan lima baris. Sebuah nilai 1 berarti kita memiliki petak tanah di posisi tersebut. Nilai -1 berarti petak tersebut tidak bisa dilewati, dan 0 berarti petak tersebut adalah tujuan pemain. Nilai 2 melambangkan pahlawan kita, dan 3 melambangkan bola yang bisa didorong. Hanya dengan melihat level data, kita bisa memvisualisasikan akan terlihat seperti apa level kita.

3. Membuat Level Permainan Sokoban

Agar lebih sederhana, kita hanya memiliki sebuah file Sokoban.cs untuk project ini dan ditempelkan pada kamera scene. Pastikan file tersebut tetap terbuka di editor saat kamu mengikuti sisa tutorial ini.

Data Level Spesial

Level data direpresentasikan dengan array 2D tidak hanya digunakan untuk membuat grid awal namun juga digunakan sepanjang game untuk mencatat perubahan level dan kemajuan permainan. Ini artinya nilai awal tidak cukup untuk merepresentasikan sebagian kondisi level saat permainan berjalan.

Setiap nilai mewakili kondisi petak yang bersangkutan pada level. Kita perlu menyimpan nilai untuk melambangkan sebuah bola pada petak tujuan dan karakter pada petak tujuan, yang bernilai -3 dan -2. Nilai-nilai ini bisa bernilai apa saja yang kamu tentukan di skrip permainan, tidak harus bernilai sama dengan contoh yang kita gunakan di tutorial ini.

Mengolah File Teks Level

Langkah pertama adalah untuk menyimpan level data ke array 2D dari file teks eksternal. Kita gunakan metode ParseLevel untuk membuka nilai string dan memecahnya untuk mengisi array 3D levelData.

Saat mengolah, kita tentukan juga jumlah baris dan kolom yang diisi oleh level kita dengan levelData.

Menggambar Level

Setelah mendapat data level, kita bisa menggambar level pada layar. Kita gunakan metode CreateLevel untuk itu.

Untuk level kita, tileSize bernilai 50, yang merupakan panjang sisi petak di grid level kita. Kita memproses array 2D dan menentukan nilai yang disimpan pada setiap i dan j dari array. Jika sebuah nilai bukan invalidTile (-1) lalu kita bisa membuat sebuah GameObject bernama tile. Kita pasangkan SpriteRenderer pada tile dan beri tugas pada Sprite atau Color, tergangung pad anilai di array index.

Sembari menempatkan hero atau ball, tapi kita perlu menyiapkan petak ground dan membuat file-file beirkut. Saat karakter dan bola perlu menimpa petak tanah, kita memberi SpriteRenderer mereka sortingOrder yang lebih besar. Semua petak diberikan nilai localScale dari tileSize, jadi mereka berukuran 50x50 pada scene kita.

Kita menyimpan jumlah bola pada scene dengan variabel ballCount, dan perlu ada nilai yang sama atau lebih besar untuk petak tujuan pada level agar level bisa diselesaikan. Keajaiban terjadi pada satu baris kode di mana kit amenentukan posisi setiap petak menggunakan metode GetScreenPointFromLevelIdices(int row, int col).

Posisi dunia dari sebuah petak ditentukan dengan mengalikan indeks level dengan nilai tileSize. Variabel middleOffset digunakan untuk mentusun level di tengah layar. Perhatikan bahwa nilai row dikalikan dengan nilai negatif untuk mendukung sumbu y yang terbalik di Unity.

4. Logika Sokoban

Sekarang kita sudah bisa menampilkan level, kita lanjutkan dengan logika game. Kita perlu mendeteksi input tombol dari pemain dan menggerakkan hero berdasarkan input tersebut. Penekanan tombol menentukan arah gerakan, dan hero perlu digerakkan ke arah tersebut. Ada banyak skenario untuk dipertimbangkan setelah kita menentukan arah gerakan. Misalnya petak di sebelah hero pada suatu arah adalah tileK.

  • Adakah petak pada scene dengan posisi tersebut, atau berada di luar grid?
  • Apakah tileK sebuah petak yang bisa dilewati?
  • Apakah tileK sedang diisi oleh sebuah bola?

Jika posisi tileK di luar grid, kita tidak perlu melakukan apa-apa. Jika tileK valid dan bisa dilewati, maka kita perlu memindahkan hero ke posisi tersebut dan memperbarui array levelData. Jika tileK memiliki sebuah bole, maka kita perlu pertimbangkan tetangga berikutnya pada arah yang sama, misalnya tileL.

  • Apakah rileL ada di luar grid?
  • Apakah tileL adalah sebuah petak yang bisa dilewati?
  • Apakah tileL sedang berisi bola?

Hanya pada kasus di mana tileL adalah petak yang bisa dilewati, dan sedang kosong, tempat kita perlu memindahkan hero dan bola dari tileK ke tileK dan tileL. Setelah gerakan sukses, kita perlu perbaui array levelData.

Fungsi Pendukung

Logika di atas berarti kita perlu tahu petak mana hero berada. Kita juga perlu tentukan apakah sebuah petak memiliki bola dan perlu diberi akses terhadap bola tersebut.

Untuk memfasilitasi ini, kita menggunakan Dictionary bernama occupants yang menyimpan GameObject sebagai kunci dan indeks array disimpan sebagai nilai Vector2. Pada metode CreateLevel, kita mengisi occupants saat membuat hero atau bola. Setelah dictionary terisi, kita bisa gunakan GetOccupantAtPosition untuk mendapatkan GameObject pada suatu indeks array.

Metode IsOccupied menentukan apakah nilai levelData pada suatu indeks merepresentasikan sebuah bola.

Kita juga perlu memeriksa apakah suatu posisi berada di dalam grid dan apakah bisa dilewati pemain. Metode IsValidPosition memeriksa indeks level dalam parameter untuk menentukan apakah ada di dalam dimensi level kita. Metode itu juga memeriksa apakah kita memiliki invalidTile sebagai indeks pada levelData.

Menerima User Input

Pada metode Update pada skrip permainan kita memeriksa event KeyUp dan membandingkannya dengan array userInputKeys. Setelah arah gerak ditentukan, kita panggil metode TryMoveHero dengan arah sebagai parameternya.

Metode TryMoveHero adalah di mana logika permainan utama kita diimplmentasi. Pelajari metode berikut dengan baik untuk melihat bagaimana logika permainan diimplementasi.

Untuk mendapat posisi berikutnya berdasarkan suatu arah dari suatu posisi, kita g unakan metode GetNextPositionAlong. Isinya hanyalah menambah atau mengurangi indeks sesuai dengan arah.

Sebelum menggerakkan pemain atau bola, kita iperlu membersihkan posisi yang mereka isi pada array levelData. Hal ini dilakukan dengan metode RemoveOccupant.

Jika kita menemukan heroTile atau ballTile pada indeks tersebut, kita perlu mengubahnya jadi groundTile. Jika kita menemukan heroOnDestinationTile atau ballOnDestinationTile maka kita perlu mengubahnya menjadi destinationTile.

Penyelesaian Level

Sebuah level selesai ketika semua bola berada di tujuan.

A Completed Level

Setelah setiap gerakan sukses, kita panggil metode CheckCompletion untuk memeriksa apakah level selesai. Kita proses array levelData dan menghitung jumlah ballOnDestinationTile. Jika nilainya sams dengan jumlah bola pada ballCount, level ini selesai.

Kesimpulan

Ini adalah implementasi yang sederhana dan efisien untuk logika sokoban. Kamu bisa membuat level kamu sendiri dengan mengubah file teks atau membuat file baru dan mengubah variabel levelName untuk mengarah ke file teks baru.

Implementasi ini menggunakan keyboard untuk mengatur gerakan pemain. Saya menantang kamu untuk coba dan ubahu kontrol pemain jadi menggunakan ketuk layar agar kita bisa mendukung perangkat berbasis sentuh. Ini mungkin akan melibatkan path finding 2D jika kamu ingin mengetuk sebuah petak dan pemain bergerak ke sana.

Akan ada tutorial lanjutan dimana kita mencoba proyek ini bisa digunakan untuk membuat versi isometric dan heksagonal dari sokoban dengan perubahan yang minimal.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.