Modul
Modul
Pendahuluan
Unity adalah cross-platform game engine dimana Unity adalah berfungsi sebagai
aplikasi "editor" untuk pengembangan game (Semacam halnya Photoshop adalah
aplikasi editor untuk manipulasi gambar).
Dalam Unity, dikenal namanya "Unity Project". Unity project secara umunya dibedakan
menjadi 2 yaitu Project 3D dan 2D. Dalam modul ini kita akan lebih lanjut membahas
membuat game dalam Unity Project 2D.
Sumber: ([Link]
Sumber: ([Link]
B. Download Assets
Assets Sprite untuk modul ini dapat di download di
[Link]
drive_link
C. Setting Up Project
1. Buka Unity Hub yang telah di download.
2. Pilih New pada pojok kanan atas untuk membuat Project baru.
3. Pilih Template 2D untuk membuat game 2D dan isi Project Name untuk Nama
Project Game yang ingin dibuat dan Location untuk lokasi project yang akan
ditempatkan.
4. Tekan Create dan menunggu loading dari Unity untuk membuat Project Game
2D baru.
D. Pengenalan Layout Unity
Scene View
● Sceneview adalah tempat dimana kita berinteraksi dengan world atau dunia
virtual yang telah kita buat. Di dalam Sceneview kita dapat pilih, memanipulasi,
menggerakkan (dan lain sebagainya) Camera, Lighting, dan GameObject lain
yang berada di dalam Scene tersebut.
● Didalam satu project game Unity bisa terdapat beberapa Scene. Biasanya jika
dalam project game tersebut terdapat sistem Tahapan Level maka 1 level
tersebut direpesentasikan dengan 1 Scene. Jika kita ingin membuat Level baru
dengan environment dan object yang mungkin berbeda, maka kita akan
membuat scene baru. Scene baru juga bisa dibuat untuk membuat main menu,
Score Detail Scene dan lain sebagainya.
Game View
● GameView adalah bentuk rendered dari scene yang telah dibangun dari perspektif
camera. Secara singkatnya GameView berfungsi untuk preview bagaimana
nantinya game kita jika dimainkan. Dengan GameView, kita bisa test memainkan
game yang kita buat sebelum diBuild menjadi game utuh. Untuk
menjalankan/test Game melalui GameView kita bisa menggunakan tombol play
berikut:
Project Window
Hierarchy
Inspector
● Inspector befungsi untuk mengatur properties dan pengaturan untuk hampir
semua yang ada di Unity Editor. Seperti GameObject, Unity Component, Assets,
Materials, dan lain sebagainya.
● GameObject adalah base class dari semua entitas yang berada dalam suatu
Scene. Secara umumnya entitas yang berada dalam Scene seperti Camera,
Lighting, Player, dan lain-lain base nya adalah GameObject. Dalam contoh
Lighting/Light Object merupakan GameObject dengan menambahkan Light
Component ke GameObject.
● Component adalah behaviour dari GameObject. Component yang terdapat di
GameObject bisa dilihat di Inspector Window. Transform yang mengatur posisi,
scale, dan rotasi suatu object merupakan salah satu Component Object.
Toolbar
●
Account Drop-down untuk mengakses Unity Accounts milik kalian.
●
Tombol Unity Cloud untuk membuka Unity Service window.
●
Undo History untuk melihat, mengulang, dan membatalkan aksi yang telah kalian
lakukan pada Editor.
●
Tombol Search akan membuka Search window yang digunakan pencarian yang
lebih advance pada Editor.
●
Layer Drop-down berguna untuk mengontrol penempatan GammeObejct pada
SceneViem.
●
Layout Drop-down berguna menyimpan dan mengedit Layout dari Editor kita
sesuai dari prefensi masing-masing.
E. Import Assets
Membuat Player
● Untuk membuat object player, seperti yang dijelaskan di atas pasti berasal dari
GameObject dasar. Nantinya GameObject yang dibuat menjadi Player akan
diberi beberapa component yang dibutuhkan sehingga object Player dapat
dimainkan. Component yang umum untuk membangun suatu player biasanya
adalah RigidBody,Collider,Script Movement, dan lain sebagainya (tergantung
bagaimana player mau dibuat). Component yang nanti kita akan gunakan akan
dijelaskan lebih lanjut.
● Buat GameObject kosong (Empty) dengan cara GameObject > Create Empty.
● Klik pada sprite tersebut lalu pada Inspector ubah Pixels Per Unit menjadi 32 lalu
Apply.
● Drag Sprite tersebut menuju field Sprite pada component SpriteRenderer yang
ada pada GameObject Graphic.
● Jika berhasil, kita dapat melihat Player pada Scene View. Pilih Player lalu coba
pindahkan posisinya dengan menggunakan axis transform.
● Transform disini dapat diatur melalui Inspector Window(melalui Component
Transport) atau bisa langsung dipindahkan memakai Transport Axis (bisa
langsung menggunakan mouse untuk drag dan transform object yang diselect).
● Pada Inspector ubah Sprite Mode menjadi Multiple, Pixels Per Unit menjadi 32,
Mesh Type menjadi Full Rect lalu Apply.
● Coba cari kotak dengan nama forest_tile_57 dan drag and drop ke Game Object
Environment pada Hierarchy dan ubah namanya menjadi nama lain agar mudah
dikenali.
● Dengan cara yang sama coba cari forest_tile_44 dan coba hias level sedemikian
rupa agar indah dan cantik.
Membuat Level
● Pada seluruh sprite pada Project Window, ubah Pixels Per Unit nya menjadi 32.
Bisa dengan cara select menggunakan shift click pada sprite yang diinginkan.
● Pada inspector ubah Pixels Per Unit nya menjadi 32, lalu Apply. Lakukan pada
semua sprite yang ada (Bullet, Environment, Mushroom, Player dan UI).
● Dengan cara drag and drop dari Project Window ke Graphic dan jadikan sprite
tersebut sebagai child dari Environment, hias Level mu sesuai keinginan!
● Terkadang urutan tampilan sprite tidak benar, bisa diatur pada Order in Layer
pada setiap Sprite Renderer.
● Sprite Layer Order adalah suatu fitur yang digunakan untuk mengatur urutan
render dari suatu Sprite Renderer. Layer Order dengan nilai terbesar akan
berada pada posisi paling depan, sedangkan nilai terkecil akan berada pada
posisi paling bawah.
Menambahkan Physics
● Physics 2D adalah bagaimana mekanis fisika di game kita bekerja (dalam kasus
ini fisika 2 dimensi nya bagaimana). Physiscs di Unity bisa meliputi
Gravity,Velocity,Speed Rotation dan banyak lagi lainnya yang bisa kita atur
melalui Global Setting untuk Physics 2D.
Sumber: ([Link])
● Pada player menambahkan Rigidbody2D
● Pada Environment tambahkan Box Collider2D pada tanah yang dapat dipijak
Player dan sesuaikan ukuran collidernya
Membuat Prefab untuk Player
● Dalam suatu Project di Unity kita bisa menggunakan suatu object dalam
beberapa Scene (Karena biasanya setiap Scene memiliki object yang
berbeda-beda antara 1 Scene dengan Scene yang lain). Jadi jika kita ingin
menggunakan object tidak hanya di dalam satu Scene saja, kita dapat membuat
object tersebut menjadi Prefab.
● Pada Project Window, click kanan lalu Create > Folder untuk membuat folder
baru pada Assets lalu beri nama Prefabs.
● Buka Folder Prefabs tersebut, lalu pada Hierachy pilih Player dan drag pad
Project Assets untuk membuat prefab Player.
Test Play pada Game
● Edit mode adalah disaat kita dapat mengedit semua yang ada dalam Scene dan
perubnahan tersebut bersifat permanent/tersimpan sehingga apabila beralih ke
mode lain (Play Mode) perubahan yang kita lakukan tersebut tersimpan.
● Game mode adalah saat kita menjalankan play dan kita dapat berinteraksi dengan
game view. Saat berada di Game Mode kita tetap dapat melakukan perubahan di
scene view. Namun, perubahan yang kita lalukan hanya bersifat temporary
sehingga saat kuita kembalikan ke edit mode, perubahan yag kita lalukan akan
hilang. Game Mode dapat diaktifkan dengan menekan tombol play lalu tekan
tombol stop untuk kembali ke Edit mode.
● Lakukan test Play dengan menekan tombol Play
● Drag Script PlayerController dan drag pada gameobject Player pada Hierarchy.
Atau bisa juga dengan klik Player dulu, lalu drag script PlayerController ke
Inspector.
● Jika kita menggunakan Engine Unity maka setiap script yang ingin kita buat dan
terapkan dalam engine harus menggunakan bahasa pemrograman C#. Script ini
dapat kita terapkan ke object yang kita inginkan sebagai salah satu component
GameObject.
● Klik dua kali script PlayerController dan masukkan Code Player berikut untuk
Code Input dan Jalan
using [Link];
using [Link];
using UnityEngine;
[Header("Properties")]
[SerializeField] private SpriteRenderer graphic;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
private Rigidbody2D rb2;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
}
void Update()
{
MovementController();
}
void MovementController()
{
float x = [Link]("Horizontal");
[Link] = direction;
● Coba Play dan test jalan dengan menggunakan Arrow Key kiri dan kanan.
Gimana, Keren kan !?
Membuat Fitur Player Menembak
● Buat GameObject baru dan beri nama Bullet lalu tambahkan child empty beri
nama Graphic
● Pada assets cari sprite Bullet dan ubah Pixel Per Unit menjadi 32 lalu Apply.
● Pada Graphic tambahkan component Sprite Renderer dan pada field sprite pilih
sprite Bullet dan ubah scale transform menjadi (0.4, 0.4, 0.4)
● Pada GameObject Bullet tambahkan Rigidbody2D dan Circle Collider2D. Pada
Rigidbody2D ubah Body Type menjadi Kinematik dan centang contraint Freeze
Rotation Z. Pada Circle Collider2D sesuaikan ukuran dan letak circle collider
dengan sprite bullet dan centang Is Trigger.
● IsTrigger adalah collider yang dapat menjalankan script saat Collider tersebut
menyentuh Trigger, Saat di Trigger, dan saat Exit dari object Trigger. IsTrigger di
Script dapat dapat diTrigger dengan fungsi OnTriggerEnter,OnTriggerStay,dan
OnTriggerExit.
● Buat Script untuk bullet dengan nama Bullet dan simpan pada folder Scripts. Lalu
tambahkan component script Bullet ini pada GameObject Bullet.
● Membuat prefab GameObject Bullet dan simpan prefab Bullet pada folder
Prefabs. Setelah itu hapus GameObject Bullet dari Hierarchy.
using UnityEngine;
using [Link];
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
}
void Update()
{
[Link] = [Link] * speed;
dieTime -= [Link];
if (dieTime < 0)
{
Destroy(gameObject);
}
}
using [Link];
using [Link];
using UnityEngine;
[Header("Properties")]
[SerializeField] private SpriteRenderer graphic;
[Header("Status")]
public float health = 100;
public float attack = 5;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private float shootingTimeMax = 1.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private float bulletSpeed = 10;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
shootingTime = shootingTimeMax;
healthMax = health;
}
void Update()
{
MovementController();
ShootController();
void MovementController()
{
float x = [Link]("Horizontal");
[Link] = direction;
void ShootController()
{
isShooting = [Link](KeyCode.Z);
if (isShooting)
{
shootingTime -= [Link];
} else
{
shootingTime = shootingTimeMax;
}
void Shoot()
{
int direction = ([Link] == false ? 1 : -1);
if (bullet)
{
[Link](new Vector2(direction, 0),"Enemy", bulletSpeed,
attack);
}
}
}
Membuat Enemy
● Buat GameObject baru dan beri nama Mushroom lalu tambahkan child empty
beri nama Graphic
● Pada assets cari masuk ke Assets/Sprites/Mushroom dan ubah semua Pixel Per
Unit dari sprites tersebut menjadi 32 lalu Apply.
● Pada Graphic tambahkan component Sprite Renderer dan pada field sprite pilih
sprite mushroom_0 sebagai contoh.
● Pada GameObject Mushroom tambahkan Rigidbody2D dan Box Collider2D.
Pada Rigidbody2D centang contraint Freeze Rotation Z. Pada Box Collider2D
sesuaikan ukuran dan letak box collider dengan sprite mushroom.
● Sebelum membuat code untuk Enemy. Buat tag untuk Player, Bullet dan Enemy
dengan cara Klik Untagged lalu Add Tag.
● Jangan lupa untuk mengganti tag Mushroom ke tag Enemy
● Tambahkan juga tag Bullet pada Bullet dan tag Player pada Player
● Tag adalah representasi Object dalam bentuk "kata" yang dapat dikustomisasi.
Misal dalam satu scene kita mempunyai 2 Objek Balok yang sama. Tag dapat
membedakan GameObject yang sama tersebut jika memiliki purpose yang
berbeda-beda. Tag sangat penting untuk mengindentifikasi object game didalam
script.
● Tag dari tiap object pasti layernya diset default. Oleh karena itu player yang
sudah kita buat layernya sudah diset ke default.
● Buat Script baru dan beri nama EnemyController.
using [Link];
using [Link];
using UnityEngine;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
● Berikut adalah code script EnemyMushroom yang merupakan child class dari
EnemyController.
using [Link];
using [Link];
using UnityEngine;
public class EnemyMushroom : EnemyController
{
[Header("Mushroom")]
[SerializeField] SpriteRenderer graphic;
if (attackTime < 0)
{
Shoot();
attackTime = attackTimeMax;
}
attackTime -= [Link];
}
}
}
void Shoot()
{
int direction = ([Link] == false ? 1 : -1);
if (direction < 0)
{
shootOffsetDirection.x *= -1;
}
● Karena mushroom menyerang dengan cara shooting bullet juga maka kita
lakukan duplicate pada prefab Bullet dan ganti namanya menjadi EnemyBullet
lalu ubah warnanya menjadi merah.
● Pada BulletEnemy ubah TargetTag menjadi "Player". Ini akan membuat bullet
hanya dapat mengenai collider gameobject yang memiliki tag "Player". Seperti
halnya bullet milik player hanya dapat mengenai collider gameobject yang
memiliki tag "Enemy". Property TargetTag ini akan digunakan pada script - script
yang akan datang.
using [Link];
using [Link];
using UnityEngine;
[Header("Properties")]
[SerializeField] private SpriteRenderer graphic;
[Header("Status")]
public float health = 100;
public float attack = 5;
public bool canBeMoved = true;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private float jumpForce = 5.0f;
[SerializeField] private float shootingTimeMax = 1.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private float bulletSpeed = 10;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
shootingTime = shootingTimeMax;
healthMax = health;
}
void Update()
{
if (canBeMoved)
{
MovementController();
JumpController();
ShootController();
}
}
void MovementController()
{
float x = [Link]("Horizontal");
Vector2 direction = [Link];
direction.x = x * moveSpeed;
[Link] = direction;
void JumpController()
{
RaycastHit2D ray = [Link]([Link], [Link],
10, [Link]("Obstacle"));
if ([Link]([Link]))
{
Jump();
}
}
void Jump()
{
if (isGrounded)
{
[Link]([Link] * jumpForce, [Link]);
}
}
void ShootController()
{
isShooting = [Link](KeyCode.Z);
if (isShooting)
{
shootingTime -= [Link];
}
else
{
shootingTime = shootingTimeMax;
}
void Shoot()
{
int direction = ([Link] == false ? 1 : -1);
if (bullet)
{
[Link](new Vector2(direction, 0), "Enemy", bulletSpeed,
attack);
}
}
}
● Ray dapat dimisalkan sebagai cahaya yang ditembakkan ke arah tertentu untuk
mendapatkan Raycast Hit. Dalam Unity Ray dapat digunakan sebagai pengukur
jarak dari posisi Ray ditembakkan ke arah yang dituju. Ray akan berhenti ketika
melewati jarak yang diinginkan atau menabrak suatu Collider tertentu.
● Raycast Hit merupakan hasil dari Ray yang ditembakkan. Terdapat banyak
property pada RaycastHit. Contohnya adalah posisi berhenti, jarak hit dan
banyak lainnya.
● Layer merupakan suatu golongan yang dapat digunakan untuk mengelompokkan
suatu game object pada scene. Namun fungsi layer tidak hanya terbatas untuk
pengelompokan saja. Terdapat fungsi penting, salah satunya ada pada Camera,
kita dapat mengatur layer mana saja yang dapat dirender oleh camra tersebut.
● Layer Mask merupakan suatu layer yang digunakan untuk masking collider. Salah
satu penggunaannya adalah saat melakukan Raycast dari titik tertentu, kita
dapat mencegah ray itu hanya dapat menabrak collider yang berada pada layer
"Obstacle" misalnya sehingga Raycast tidak terhenti pada collider Player.
● Coba Play Test lalu tekan Up Arrow untuk loncat dengan Player.
● ICE BREAKING : Coba edit Jump Force menjadi 20 untuk lompatan super atau
ganti Min Ground Distance menjadi 5 agar bisa jump on air.
using UnityEngine;
using [Link];
void Update()
{
if (target)
{
if (isFollowing)
{
targetPos = [Link] + targetOffset;
}
[Link] = newPos;
}
}
}
● Attribute Range merupakan salah satu attribute yang dapat mengubah field
menjadi Range dari suatu variable. Contohnya adalah menggunakan Range dari
0 sampai 1 sehingga nilai variable tersebut dapat diatur dari inspector dari 0
hingga 1.
● Lerp atau Linear Interpolation merupakan satu metode yang digunakan untuk
melakukan specify nilai tertentu. Misal terdapat suatu nilai dari 0 hingga 100,
dengan menggunakan Lerp dan ratio 0.5 maka nilai tersebut akan bernilai 50.
● Tambahkan component script CameraFollow pada Game Object Main Camera
● Assign Player pada field Target dan isi field yang lain sesuai kebutuhan
H. Membuat GameMaster yang mengontrol sebagian besar
Game
Membuat GameManager
● SceneManagement adalah salah satu library/module dalam script Unity yang berisi
berbagai fungsi untuk manage para scenes yang sudah kita buat di unity.
Bagaimana kita mengatur perpindahan dari scene A ke scene B, misal dari
scene Main menu ke Scene Level 1 atau sebaliknya dan berbagai fungsi lain.
● ActiveScene adalah Scene yang sedang running/active saat game berjalan.
● LoadScene berfungsi untuk memuat scene yang akan diakses
selanjutnya/berpindah ke scene yang dipilih.
● buildIndex: Setiap Scene pasti mempunyai index nya sendiri (diatur saat akan
build game). Sehingga jika ingin memanggil suatu Scene tinggal memanggil
index dari scene tersebut. Contoh
:[Link]([Link]().buildIndex + 1);
berarti kita mengakses Scene yang index nya lebih 1 dari Active Scene yang
sedang berjalan.
● Kita akan mengamalkan Singleton Pattern pada GameManager. Singleton
Pattern merupakan suatu metode menyimpan Instance dari class tersebut pada
suatu static property pada class itu sendiri. Hal ini digunakan untuk menghindar
dari referensi object yang berlebihan atau tidak cocok untuk direferensikan.
● Berikut adalah code untuk Script GameManager.
using [Link];
using [Link];
using UnityEngine;
using [Link];
Membuat ScoreManager
● Sama seperti GameManager, ScoreManager juga akan mengamalkan Singleton
Pattern.
● Berikut merupakan code untuk Script ScoreManager.
using UnityEngine;
using [Link];
void Awake()
{
Instance = this;
}
targetEnemyProgress = [Link];
currentEnemyProgress = 0;
}
using [Link];
using [Link];
using UnityEngine;
[Header("Properties")]
[SerializeField] private SpriteRenderer graphic;
[Header("Status")]
public float health = 100;
public float attack = 5;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private float jumpForce = 5.0f;
[SerializeField] private float shootingTimeMax = 1.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private float bulletSpeed = 10;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
shootingTime = shootingTimeMax;
healthMax = health;
}
void Update()
{
if (canBeMoved)
{
MovementController();
JumpController();
ShootController();
}
FallDie();
}
void MovementController()
{
float x = [Link]("Horizontal");
[Link] = direction;
void JumpController()
{
RaycastHit2D ray = [Link]([Link], [Link],
10, [Link]("Obstacle"));
if ([Link]([Link]))
{
Jump();
}
}
void Jump()
{
if (isGrounded)
{
[Link]([Link] * jumpForce, [Link]);
}
}
void ShootController()
{
isShooting = [Link](KeyCode.Z);
if (isShooting)
{
shootingTime -= [Link];
} else
{
shootingTime = shootingTimeMax;
}
void Shoot()
{
int direction = ([Link] == false ? 1 : -1);
if (bullet)
{
[Link](new Vector2(direction, 0),"Enemy", bulletSpeed,
attack);
}
}
void FallDie()
{
if ([Link].y < -20)
{
Die();
}
}
void Die()
{
[Link] = false;
canBeMoved = false;
[Link]();
}
private void OnCollisionEnter2D(Collision2D collision)
{
if ([Link] == "Enemy")
{
float damage =
[Link]<EnemyController>().GetAttackDamage();
DamagedBy(damage);
}
}
Membuat UI
● UI atau kepanjangannya adalah User Interface adalah salah satu komponen
dalam game yang sangat penting. UI berfungsi sebagai sistem komponen visual
yang berfungsi menjembatani user/player dengan game yang kita buat.
Bagaimana player dari game kita berinteraksi dengan game, informasi penting
dari game yang ditampilkan ke player, status dari game kita (Game Over dan
sejenisnya) termasuk fungsi dari User Interface. UI dapat meliputi tampilan HUD
dalam game, tombol-tombol, hingga tampilan pengaturan game.
● Buat GameObject Canvas untuk UI
● Canvas adalah tempat dimana semua yang berhubungan dengan komponen UI
dalam game ditaruh dan diatur placementnya. Tampilan canvas bisa diatur
melalui Scene View.
● Select GameObject Canvas dan ubah konfigurasi component Canvas dan
Canvas Scaler sebagai berikut.
● Canvas Scaler adalah Component dari UI yang berfungsi mengatur overall scale
dan pixel density dari semua element UI yang berada di dalam Canvas. Oleh
karena itu, saat mengubah/mengatur di Canvas Scaler, semua elemen UI yang
berada di Canvas yang telah dipilih akan terpengaruh (dari segi ukuran (scale
dan pixel)).
● Klik kanan lagi pada Healthbar, lalu pilih UI > Image. Lakukan sebanyak 3 kali
karena masing - masing untuk Healthbar Bg, Healthbar Border, Healthbar
sebelumnya.
● Sorting Order: Sorting order sistemnya seperti layer. object yang berada di
bawah object lain (di panel Hierarchy) akan ditampilkan lebih depan. Contoh:
Dapat dilihat dalam hierarchy object MainMenu dibawah Panel sehingga Object
MainMenu berada di depan panel hitam. Coba kita balik urutannya:
Bisa kita lihat saat order nya dibalik object panel akan membelakangi object main
menu.
● Untuk masing - masing Image UI tersebut, assign sprite yang sesuai. Sesuaikan
konfigurasinya seperti berikut agar healthbar terlihat rapi dan bagus.
● Berikut adalah hasil sementara dari Healthbar UI.
Membuat Score UI
● Pada Hierarchy, klik kanan pada Canvas lalu Create Empty. Beri nama child
tersebut menjadi EnemyProgress
● Klik kanan lagi pada EnemyProgress, lalu pilih UI > Text. Beri nama Text tersebut
menjadi ProgressText. UI Text ini untuk melakukan track pada score Player.
● UI Text adalah komponen UI yang menampilkan text pada tampilan layar player.
● Pada Component Text, ubah Text menjadi "4 of 10" sebagai contoh. Lalu ubah
juga Font Size, Horizontal Overflow dan Vertical Overflow nya.
● Klik kanan lagi pada EnemyProgress, lalu pilih UI > Image. Beri nama Image
tersebut menjadi ProgressCover. Image UI ini digunakan untuk hiasan score
saja.
Membuat UIManager
● Agar UI dapat berubah seiring dengan Game dimainkan maka perlu sebuah
script untuk mengatur UI tersebut.
● Buat script baru pada folder Scripts dan beri nama menjadi UIManager.
using [Link];
using [Link];
using UnityEngine;
using [Link];
using TMPro;
void Update()
{
if (enemyProgressText)
{
[Link] = [Link] + " of "
+ [Link];
}
if (playerHealthBar)
{
Vector2 size = [Link];
size.x = [Link] / [Link] * playerHealthBarFullX;
[Link] = size;
}
● Elemen UI yang berupa text dapat diubah melalui script/code. contoh nya adalah
script berikut: [Link] = [Link] +
" of " + [Link];. Nantinya UI Text yang ingin
diubah akan diattach ke Component script yang sudah terpasang di
GameMaster.
● Pada EnemyController panggil method DefeatEnemy() pada ScoreManager agar
progress dapat bertambah ketika Enemy menjalankan method Die().
using [Link];
using [Link];
using UnityEngine;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
void Update()
{
Movement();
FallDie();
}
void FallDie()
{
if ([Link].y < -20)
{
Die();
}
}
void Die()
{
Destroy(gameObject);
[Link]();
}
public float GetAttackDamage()
{
return attack;
}
using [Link];
using [Link];
using UnityEngine;
[Header("Properties")]
[SerializeField] private SpriteRenderer graphic;
[Header("Status")]
public float health = 100;
public float attack = 5;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private float jumpForce = 5.0f;
[SerializeField] private float shootingTimeMax = 1.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private float bulletSpeed = 10;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
shootingTime = shootingTimeMax;
healthMax = health;
}
void Update()
{
if (canBeMoved)
{
MovementController();
JumpController();
ShootController();
}
FallDie();
if (moveLeft)
{
//float x = [Link]("Horizontal");
[Link] = direction;
if (moveRight)
{
//float x = [Link]("Horizontal");
[Link] = direction;
//sprite dibalik ketika arahnya ke kiri
if (direction.x < 0)
{
[Link] = true;
}
else if (direction.x > 0)
{
[Link] = false;
}
}
void MovementController()
{
float x = [Link]("Horizontal");
[Link] = direction;
void JumpController()
{
RaycastHit2D ray = [Link]([Link], [Link],
10, [Link]("Obstacle"));
if ([Link]([Link]))
{
Jump();
}
}
void ShootController()
{
isShooting = [Link](KeyCode.Z);
if (isShooting)
{
shootingTime -= [Link];
}
else
{
shootingTime = shootingTimeMax;
}
if (bullet)
{
[Link](new Vector2(direction, 0), "Enemy", bulletSpeed,
attack);
}
}
public void DamagedBy(float damage)
{
health -= damage;
if (health <= 0)
{
health = 0;
Die();
}
}
void FallDie()
{
if ([Link].y < -20)
{
Die();
}
}
void Die()
{
[Link] = false;
canBeMoved = false;
//[Link]
[Link]();
}
● Build Index: adalah index dari tiap scene yang akan dibuild. Index scene dimulai
dari '0' hingga banyak scene-1. Urutan Build Index berdasarkan penempatan
scene pada Build Settings (Urutan dari atas ke bawah).
Membuat Scene Baru
● Pada Project Window folder Scenes rename Scene sekarang menjadi "Level 1"
● Kemudian, lelakukan Duplicate Scene dari Scene Level 1 dengan Ctrl + D lalu
ubah namanya menjadi Level 2. Hal ini dapat diulangi untuk membuat level -
level selanjutnya.
Pengenalan Platform
● Game yang ingin dibuild dapat dibuild ke versi berbagai platform. Misal kita
rancang game kita untuk dimainkan di android, maka kita akan set platform build
nya ke android. Begitu pula untuk yang lainnya.
● Pilih lokasi build, disarankan folder kosong. Beri nama game dengan kata yang
kamu sukai.
● Tunggu hingga proses build selesai. Lalu coba Play Executable. Dalam modul ini
nama game adalah Unlucid. Run [Link] untuk membuka game.
L. Selesai !!
● Ubah Samples Rate menjadi 10 dan sesuaikan time-nya dengan gambar diatas.
● Lakukan hal yang sama pada PlayerJumpUp, PlayerJumpDown dan PlayerRun.
● Untuk berpindah Transition diperlukan parameter yang dapat mengatur jalannya
animasi. Misal dari Idle ke Run hanya dapat dilakukan ketika parameter
IsRunning bernilai true.
● Pada PlayerAnimator, tambahkan parameter bertipe boolean dan beri nama
isGrounded. Lalu parameter velocityX dan velocityY yang bertipe integer.
using [Link];
using [Link];
using UnityEngine;
[Header("Status")]
public float health = 100;
public float attack = 5;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private float jumpForce = 5.0f;
[SerializeField] private float shootingTimeMax = 1.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private float bulletSpeed = 10;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
shootingTime = shootingTimeMax;
healthMax = health;
}
void Update()
{
if (canBeMoved)
{
MovementController();
JumpController();
ShootController();
AnimationController();
}
FallDie();
}
void MovementController()
{
float x = [Link]("Horizontal");
[Link] = direction;
void JumpController()
{
RaycastHit2D ray = [Link]([Link], [Link],
10, [Link]("Obstacle"));
if ([Link]([Link]))
{
Jump();
}
}
void Jump()
{
if (isGrounded)
{
[Link]([Link] * jumpForce, [Link]);
}
}
void ShootController()
{
isShooting = [Link](KeyCode.Z);
if (isShooting)
{
shootingTime -= [Link];
} else
{
shootingTime = shootingTimeMax;
}
void Shoot()
{
int direction = ([Link] == false ? 1 : -1);
if (bullet)
{
[Link](new Vector2(direction, 0),"Enemy", bulletSpeed,
attack);
}
}
void FallDie()
{
if ([Link].y < -20)
{
Die();
}
}
void Die()
{
[Link] = false;
canBeMoved = false;
[Link]();
}
void AnimationController()
{
velocityX = (int)[Link]([Link].x, -1, 1);
velocityY = (int)[Link]([Link].y, -1, 1);
[Link]("isGrounded", isGrounded);
[Link]("velocityX", velocityX);
[Link]("velocityY", velocityY);
}
● Ubah Samples Rate menjadi 10 dan sesuaikan seperti pada gambar diatas.
● Pada Prefab Mushroom simpan perubahan agar seluruh Mushroom memiliki
Animator yang sama.
● Coba Play Game dan amati animasi baru pada Enemy Mushroom.
N. Menambahkan UI untuk mobile
pertama, download asset untuk UI mobile dan Audio (Assets UI mobile & Audio)
tambahkan assets image ke dalam gameobject yang sudah dibuat dengan cara drag &
drop ke kolom source image, assets image bisa di akses di dalam folder /Assets UI
mobile & Audio/SpriteUI
agar tombol UI mobile bisa di tekan, ubah script [Link] menjadi seperti
berikut :
using [Link];
using [Link];
using UnityEngine;
[Header("Properties")]
[SerializeField] private SpriteRenderer graphic;
[Header("Status")]
public float health = 100;
public float attack = 5;
public bool canBeMoved = true;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private float jumpForce = 5.0f;
[SerializeField] private float shootingTimeMax = 1.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private float bulletSpeed = 10;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
healthMax = health;
}
void Update()
{
if (canBeMoved)
{
MovementController();
JumpController();
ShootController();
AnimationController();
}
FallDie();
}
void MovementController()
{
float x = [Link]([Link]("Horizontal"));
if(x != 0){
trigMove = true;
moving(x);
}
else if(trigMove) {
trigMove = false;
moving(0);
}
}
[Link] = direction;
void JumpController()
{
RaycastHit2D ray = [Link]([Link], [Link],
10, [Link]("Obstacle"));
void Jump()
{
if (isGrounded)
{
[Link]([Link] * jumpForce, [Link]);
}
}
void ShootController()
{
isShooting = [Link](KeyCode.Z);
if (isShooting)
{
shootingTime -= [Link];
if(trigShot) {
Shoot();
trigShot = false;
}
} else
{
shootingTime = shootingTimeMax;
trigShot = true;
}
void Shoot()
{
int direction = ([Link] == false ? 1 : -1);
if (bullet)
{
[Link](new Vector2(direction, 0),"Enemy", bulletSpeed,
attack);
}
}
void FallDie()
{
if ([Link].y < -20)
{
Die();
}
}
void Die()
{
[Link] = false;
canBeMoved = false;
[Link]();
}
void AnimationController()
{
velocityX = (int)[Link]([Link].x, -1, 1);
velocityY = (int)[Link]([Link].y, -1, 1);
[Link]("isGrounded", isGrounded);
[Link]("velocityX", velocityX);
[Link]("velocityY", velocityY);
}
dan buat script baru juga dengan nama [Link], untuk kodenya sebagai
berikut :
using [Link];
using [Link];
using UnityEngine;
using [Link];
pressed=true;
}
using [Link];
using [Link];
using UnityEngine;
[Header("Properties")]
[SerializeField] private SpriteRenderer graphic;
[Header("Status")]
public float health = 100;
public float attack = 5;
[Header("Configuration")]
[SerializeField] private float moveSpeed = 2.5f;
[SerializeField] private float jumpForce = 5.0f;
[SerializeField] private float shootingTimeMax = 1.0f;
[SerializeField] private GameObject bulletPrefab;
[SerializeField] private float bulletSpeed = 10;
[Header("SFV")]
private AudioSource playerAudio;
public AudioClip playerJump;
public AudioClip playerShoot;
public AudioClip playerMove;
public AudioClip playerHit;
void Awake()
{
Instance = this;
}
void Start()
{
rb2 = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
playerAudio = GetComponent<AudioSource>();
shootingTime = shootingTimeMax;
healthMax = health;
}
void Update()
{
if (canBeMoved)
{
MovementController();
JumpController();
ShootController();
AnimationController();
}
FallDie();
}
void MovementController()
{
float x = [Link]([Link]("Horizontal"));
if(x != 0){
trigMove = true;
moving(x);
}
else if(trigMove) {
trigMove = false;
moving(0);
}
}
[Link] = direction;
void JumpController()
{
RaycastHit2D ray = [Link]([Link], [Link],
10, [Link]("Obstacle"));
if ([Link]([Link]) || [Link](KeyCode.W))
{
Jump();
}
}
void Jump()
{
if (isGrounded)
{
[Link]([Link] * jumpForce, [Link]);
[Link](playerJump, 1.0f);
}
}
void ShootController()
{
isShooting = [Link](KeyCode.Z);
if (isShooting)
{
shootingTime -= [Link];
if(trigShot) {
Shoot();
trigShot = false;
}
} else
{
shootingTime = shootingTimeMax;
trigShot = true;
}
void Shoot()
{
[Link](playerShoot, 1.0f);
int direction = ([Link] == false ? 1 : -1);
if (bullet)
{
[Link](new Vector2(direction, 0),"Enemy", bulletSpeed,
attack);
}
}
health -= damage;
if (health <= 0)
{
health = 0;
Die();
}
}
void FallDie()
{
if ([Link].y < -20)
{
Die();
}
}
void Die()
{
[Link] = false;
canBeMoved = false;
[Link]();
}
void AnimationController()
{
velocityX = (int)[Link]([Link].x, -1, 1);
velocityY = (int)[Link]([Link].y, -1, 1);
[Link]("isGrounded", isGrounded);
[Link]("velocityX", velocityX);
[Link]("velocityY", velocityY);
}
tambahkan AudioClip yang ada di folder /Assets UI mobile & Audio/Audio, tambahkan
gun, hit-wav, dan jump-wav