Modul Game Unity
Modul Game Unity
Genre
Pengenalan Academy
Melalui Dicoding Academy ini, peserta akan dikenalkan pada berbagai
materi, mulai dari hal sederhana seperti proses instalasi peranti lunak
(software) hingga membuat proyek game Pukul Bola. Tujuannya, agar
peserta siap untuk membuat dan meluncurkan produk game-nya sendiri.
OS:
GPU:
Hardware:
Praktik: Unduh Unity
Unity menawarkan 3 pilihan yaitu Unity Personal (Free), Unity Plus, dan
Unity Pro atau kunjungi: https://store.unity.com/
Praktik: Install Unity
4. Setelah itu, tentukan lokasi download dan lokasi install. Jika ingin
menyimpan installer yang telah diunduh, Anda dapat pilih Download
to. Kemudian jika ingin memiliki beberapa versi Unity, Anda dapat
menulis misal C:\Program Files\Unity2018. Klik Next untuk
melanjutkan instalasi.
5. Konfigurasi Unity sudah selesai dan Unity Anda telah siap digunakan.
Klik Start Using Unity untuk membuka Unity.
Pengenalan Interface Unity
Berikut ini adalah tampilan Interface pada Unity, antara lain terdapat
Toolbar, Scene View, Hierarchy Window, Inspector Window, dan Project
Window.
Toolbar
Scene Window
Game View
Game View digunakan untuk melihat hasil akhir dari Game yang nantinya
akan ditampilan ke hadapan user.
Inspector Window
Project Window
Console Window
Pertanyaan:
Dari Gambar ini:
Pernyataan:
A. Tool yang digunakan untuk mengatur nilai Transfrom (Posisi, Rotasi dan
Skala)
Jawaban Anda
1G, 2D, 3F, 4A
KIRIM JAWABAN
Basic Scripting
Kita akan membuat C# Script sederhana dengan menampilkan sebuah
Log di jendela Console.
Mode : 2D
Klik Create project
Praktik: Membuat Script
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan1:MonoBehaviour{
6.
7. // Use this for initialization
8. voidStart(){
9.
10. }
11.
12. // Update is called once per frame
13. voidUpdate(){
14.
15. }
16. }
Secara default, pada script yang baru dibuat akan ditampilkan 2 buah
prosedur, yaitu:
Start()
Prosedur ini akan dipanggil satu kali di awal, pada saat script
pertama kali di-enable. Prosedur ini sesuai untuk inisialisasi.
Update()
Prosedur ini dipanggil pada setiap frame, apabila script di-enable.
Prosedur ini sesuai untuk bagian script yang dieksekusi berulang-
ulang.
Untuk daftar prosedur dan fungsi lengkap yang ada pada kelas
MonoBehaviour, silakan lihat pada
link: https://docs.unity3d.com/ScriptReference/MonoBehaviour.ht
ml.
4. Menambahkan/mengubah code di Script Latihan1.cs
1. Debug.Log("Hello Dicoding!");
Simpan perubahan pada script dengan tekan Ctrl+S
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan1:MonoBehaviour
6. {
7.
8. // Use this for initialization
9. voidStart()
10. {
11. Debug.Log("Hello Dicoding!");
12. }
13.
14. // Update is called once per frame
15. voidUpdate()
16. {
17.
18. }
19. }
20.
Pembahasan Code:
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
1. publicclassLatihan1
Nama kelas dari sebuah script. Nama Kelas harus sama dengan
nama file C# Script di folder Assets.
1. voidStart()
Fungsi di atas hanya dijalankan satu kali dan diawal saat program
dijalankan
1. Debug.Log("Hello Dicoding!");
1. voidUpdate()
Praktik: Menjalankan Script
Quiz Mini:
1. Awake() dan Start()
2. Update(), FixedUpdate(), dan LateUpdate()
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihanAwake:MonoBehaviour{
6. voidAwake(){
7. Debug.Log("Awake Dipanggil");
8. }
9. }
Pembahasan kode:
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
1. public class LatihanAwake:MonoBehaviour
Nama kelas dari script. Nama kelas harus sama dengan berkas (file)
script yang dibuat.
1. void Awake()
1. Debug.Log("Awake Dipanggil");
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. public class LatihanStart:MonoBehaviour{
6. void Start(){
7. Debug.Log("Start Dipanggil");
8. }
9. }
Pembahasan kode:
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
1. public class LatihanStart:MonoBehaviour
1. void Start()
1. Debug.Log("Start Dipanggil");
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. public class Latihan1:MonoBehaviour{
6. //fungsi Awake
7. void Awake(){
8. Debug.Log("Awake dipanggil");
9. }
10.
11. //fungsi Start
12. void Start(){
13. Debug.Log("Start dipanggil");
14. }
15. }
Update
Update akan aktif jika MonoBehaviour diaktifkan. Update akan terpanggil
sesudah Start dipanggil. Update adalah fungsi yang paling sering
digunakan untuk menerapkan script game. Namun, tidak semua
MonoBehaviour membutuhkan script Update. Biasanya kita
membuat method baru untuk mendeklarasikan sebuah fungsi.
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. public class LatihanUpdate:MonoBehaviour{
6. void Update(){
7. Debug.Log("Waktu untuk Update :"+Time.deltaTime);
8. }
9. }
Pembahasan kode:
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
3 baris kode di atas adalah Library bawaan saat script dibuat. Kita dapat
memberi Library tambahan seperti scene, UI dan lainnya.
1. public class LatihanUpdate:MonoBehaviour
1. void Update()
FixedUpdate
FixedUpdate biasanya digunakan sebagai gantinya Update ketika
bertemu dengan Rigidbody. Misalnya saat menambahkan physic ke
benda.
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. public class LatihanFixedUpdate:MonoBehaviour{
6. void FixedUpdate(){
7. Debug.Log("Waktu untuk FixedUpdate :"+Time.deltaTime);
8. }
9. }
Pembahasan kode:
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
1. voidFixedUpdate()
LateUpdate
LateUpdate dipanggil setelah semua fungsi Update dipanggil. Ia berguna
untuk memberi log console eksekusi script. Contohnya, Camera
Follow harus selalu diimplementasikan di LateUpdate karena melacak
objek yang mungkin telah bergerak di dalam Update.
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. public class LatihanLateUpdate:MonoBehaviour{
6. void LateUpdate(){
7. Debug.Log("Waktu untuk LateUpdate :"+Time.deltaTime);
8. }
9. }
Pembahasan kode:
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
1. public class LatihanLateUpdate:MonoBehaviour
Nama kelas dari script. Nama kelas harus sama dengan
berkas script yang dibuat.
1. void LateUpdate()
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. public class Latihan1:MonoBehaviour{
6. void FixedUpdate(){
7. Debug.Log("Waktu untuk FixedUpdate :"+Time.deltaTime);
8. }
9.
10. void Update(){
11. Debug.Log("Waktu untuk Update :"+Time.deltaTime);
12. }
13.
14. void LateUpdate(){
15. Debug.Log("Waktu untuk LateUpdate :"+Time.deltaTime);
16. }
17. }
Jika Anda ingin menggunakan Editor yang lebih terdepan, Anda dapat
menggunakan Visual Studio. Tetapi jika ingin yang lebih ringan, Anda
dapat menggunakan Notepad++ . Pemilihan itu tergantung kenyamanan
Anda dalam menulis kode dan spesifikasi komputer Anda.
(Opsional) Praktik: Mengubah Editor Script Unity
1. Klik Menu Edit > Preferences...
MonoDevelop
Variable
Sebuah variable dapat menyimpan satu dari dua tipe nilai, yaitu value
type dan references type.
Values Type adalah dasar dari tipe data primitive seperti char, int, dan
float, serta tipe user-defined yang dideklarasikan dengan struct.
Reference Type adalah kumpulan class atau data kompleks yang
dibangun dari tipe data primitive.
Modifier Access
Public
Variable yang dapat dipanggil/diakses dari kelas lain
Misal:
Global Variable
Variable yang dapat digunakan atau dipanggil oleh semua fungsi atau
method
Misal:
1. publicclassContoh:MonoBehaviour{
2. string nama ="Dico";// Global Variable
3.
4. voidStart(){
5. Debug.Log("My Name: "+nama);// Kamu dapat panggil disini
6. }
7.
8. voidUpdate(){
9. Debug.Log("My Name: "+nama);// Kamu dapat panggil disini
10. }
11. }
Local Variable
Variable yang hanya dipanggil pada method atau fungsi yang dimana
variable tersebut di deklarasikan.
Misal:
1. publicclassContoh:MonoBehaviour{
2.
3. voidStart(){
4. string nama ="Dico";// Local Variable
5. Debug.Log("My Name: "+nama);// Kamu dapat panggil disini
6. }
7.
8. voidUpdate(){
9. // Kamu tidak dapat panggil disini
10. }
11. }
Constant Variable
Variable yang memiliki nilai tetap dan tidak dapat diubah.
Misal:
1. publicclassContoh:MonoBehaviour{
2. conststring ID ="1234";// Constant Variable
3. }
Static Variable
Variable yang dapat langsung dipanggil oleh kelas lain tanpa harus
membuat object dari kelas itu sendiri.
Misal:
Kelas yang terdapat variable static
1. publicclassData{
2. publicstaticstring ID ="1234";// Static Variable
3. }
4. publicclassContoh:MonoBehaviour{
5.
6. voidStart(){
7. Debug.Log("ID: "+Data.ID);// Kamu dapat panggil disini
8. }
9. }
Misal: playerController, enemyZombie.
Tetapi hal diatas tidak berlaku pada variable Konstanta. Untuk Variable
Konstanta memiliki aturan sebagai berikut:
Sehingga script pada Latihan 1 tidak dijalankan dan Main Camera akan
menjalankan script Latihan 2
Praktik: Variable unity
1. Buka Script Latihan2.cs
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan2:MonoBehaviour
6. {
7.
8. int nilaiA =5;
9. int nilaiB =9;
10.
11. // Use this for initialization
12. voidStart()
13. {
14. int totall = nilaiA + nilaiB;
15. Debug.Log("Total "+ totall);
16. }
17.
18. // Update is called once per frame
19. voidUpdate()
20. {
21.
22. }
23. }
Pada console menunjukkan informasi bahwa nilai total dari nilai A dan nilai
B adalah 14.
Kita dapat mengubah nilai variable NilaiA dan NilaiB lewat jendela
Inspector dan tanpa harus mengubah nilai variable tersebut di script.
Caranya kita menggunakan variable public untuk memunculkan field di
Inspector. Detailnya sebagai berikut:
1. Buka script Latihan2.cs
Ubahlah pada code
Menjadi
3. publicint nilaiA;
4. publicint nilaiB;
Kemudian simpan perubahan dengan tekan Ctrl+S
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan2:MonoBehaviour
6. {
7.
8. publicint nilaiA;
9. publicint nilaiB;
10.
11. // Use this for initialization
12. voidStart()
13. {
14. int totall = nilaiA + nilaiB;
15. Debug.Log("Total "+ totall);
16. }
17.
18. // Update is called once per frame
19. voidUpdate()
20. {
21.
22. }
23. }
1. Buka Script Latihan2.cs
1. [Range(1,5)]
2. publicint nilaiC;
Ubah code yang terdapat di dalam function Start()
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan2:MonoBehaviour
6. {
7.
8. publicint nilaiA;
9. publicint nilaiB;
10. [Range(1,5)]
11. publicint nilaiC;
12.
13. // Use this for initialization
14. voidStart()
15. {
16. int totall =(nilaiA + nilaiB)* nilaiC;
17. Debug.Log("Total "+ totall);
18. }
19.
20. // Update is called once per frame
21. voidUpdate()
22. {
23.
24. }
25. }
Pada field NilaiC, hanya dapat diisi dari nilai 1 sampai nilai 5. Anda dapat
mengganti nilai dengan menggeserkan slider atau langsung memasukkan
nilai kedalam field.
Anda dapat simpan yang telah Anda kerjakan di atas dengan klik
menu File > Save Scenes atau tekan Ctrl+S.
1. Tambahkan();
Jika Nama fungsi lebih dari 2 kata maka kata kedua menggunakan huruf
besar
Misal:
1. SamaDengan();
Praktik: Function
1. Buka Script Latihan3.cs
1. intJumlah(int a,int b)
2. {
3. return a + b;
4. }
1. int c =Jumlah(60,40);
2. Debug.Log("Hasil Jumlah a dan b adalah "+ c);
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan3:MonoBehaviour
6. {
7.
8. // Use this for initialization
9. voidStart()
10. {
11. int c =Jumlah(60,40);
12. Debug.Log("Hasil Jumlah a dan b adalah "+ c);
13. }
14.
15. // Update is called once per frame
16. voidUpdate()
17. {
18.
19. }
20.
21. intJumlah(int a,int b)
22. {
23. return a + b;
24. }
25. }
1. Ketik “/” sebanyak 3 kali diatas fungsi Jumlah() kemudian akan muncul
template comment seperti di bawah ini:
Comment ini akan sangat membantu jika kode yang kita tulis kompleks
yang karenanya kita biasa memerlukan catatan di fungsi tersebut.
Selanjutnya akan membahas tentang Class and Object
Supaya script di submodul ini lebih rapi, buat dan kumpulkan scripts ke
dalam 1 Folder
1. usingUnityEngine;
2. publicclassKarakter{
3.
4.
5. }
Setiap script C#, pada bagian atas selalu diawali dengan nama Class.
Penggunaan access control class tersebut menggunakan public class
supaya ia dapat dipanggil di class lain untuk dijadikan sebagai object.
Selanjutnya, kita menghilangkan turunan dari MonoBehavior. Kenapa?
Karena pada Class ini tidak membutuhkan fungsi yang terdapat di dalam
MonoBehavior.
1. privatestring name;
2. privateint health;
3. privateint damage;
4.
5. publicstringName
6. {
7. get
8. {
9. return name;
10. }
11. set
12. {
13. name =value;
14. }
15. }
16.
17. publicintHealth
18. {
19. get
20. {
21. return health;
22. }
23. set
24. {
25. health =value;
26. }
27. }
28.
29. publicintDamage
30. {
31. get
32. {
33. return damage;
34. }
35. set
36. {
37. damage =value;
38. }
39. }
1. publicvoidMoveLeft()
2. {
3. Debug.Log("Gerak ke kiri");
4. }
5. publicvoidMoveRight()
6. {
7. Debug.Log("Gerak ke kekanan");
8. }
9. publicvoidJump()
10. {
11. Debug.Log("Loncat");
12. }
13. publicvoidAttack()
14. {
15. Debug.Log("Serang");
16. }
1. usingUnityEngine;
2. publicclassKarakter
3. {
4. privatestring name;
5. privateint health;
6. privateint damage;
7.
8. publicstringName
9. {
10. get
11. {
12. return name;
13. }
14. set
15. {
16. name =value;
17. }
18. }
19.
20. publicintHealth
21. {
22. get
23. {
24. return health;
25. }
26. set
27. {
28. health =value;
29. }
30. }
31.
32. publicintDamage
33. {
34. get
35. {
36. return damage;
37. }
38. set
39. {
40. damage =value;
41. }
42. }
43.
44. publicvoidMoveLeft()
45. {
46. Debug.Log("Gerak ke kiri");
47. }
48. publicvoidMoveRight()
49. {
50. Debug.Log("Gerak ke kekanan");
51. }
52. publicvoidJump()
53. {
54. Debug.Log("Loncat");
55. }
56. publicvoidAttack()
57. {
58. Debug.Log("Serang");
59. }
60. }
Ayo kita membuat kelas baru yang nantinya akan memanggil class
Karakter sebagai object.
1. Karakter player1;
Menginisialisasi player1 didalam function Start()
1. player1 =newKarakter();
2. player1.Name="Dico";
3. player1.Health=100;
4. player1.Damage=30;
5. //Menampilkan hasil dari inisialisasi attribute
6. Debug.Log("Name: "+player1.Name+", Health: "+player1.Health+",
Damage: "+player1.Damage);
7. //Memanggil method dari salah satu method di class Karakter.
8. player1.Jump();
Simpan perubahan script dengan tekan Ctrl+S
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan4:MonoBehaviour
6. {
7. Karakter player1;
8. // Use this for initialization
9. voidStart()
10. {
11. player1 =newKarakter();
12. player1.Name="Dico";
13. player1.Health=100;
14. player1.Damage=30;
15. //Menampilkan hasil dari inisialisasi attribute
16. Debug.Log("Name: "+ player1.Name+", Health: "+ player1.Health+",
Damage: "+ player1.Damage);
17. //Memanggil method dari salah satu method di class Karakter.
18. player1.Jump();
19. }
20.
21. // Update is called once per frame
22. voidUpdate()
23. {
24.
25. }
26. }
Inheritance
Inheritance atau warisan adalah konsep Pemrograman Berorientasi
Objek (OOP) yang digunakan untuk mengakses dan menggunakan
kembali sifat atau metode satu kelas dari kelas lainnya.
Ketika membuat kelas baru di Unity, maka secara otomatis kelas tersebut
merupakan turunan dari MonoBehaviour sebagai default-nya. Di dalam
kelas turunan ini kita bisa mengakses banyak fungsi seperti Update(),
Start(), dan fungsi lain yang dimiliki oleh Class Monobehaviour.
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassKosongan:MonoBehaviour
6. {
7. // Use this for initialization
8. voidStart()
9. {
10.
11. }
12.
13. // Update is called once per frame
14. voidUpdate()
15. {
16.
17. }
18. }
Berikut ini adalah contoh turunan pada variable dari base kelas (kelas
dasar) ke kelas yang lain
Kemudian ada 3 access modifier untuk menentukan apa saja function
yang dapat diturunkan atau tidak dengan sebagai berikut:
Praktik: Membuat Kelas Base
1. publicvoidMakan(){
2. Debug.Log("Perlu Makan");
3. }
4. publicvoidTidur(){
5. Debug.Log("Perlu Tidur");
6. }
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassManusia:MonoBehaviour
6. {
7. publicvoidMakan()
8. {
9. Debug.Log("Perlu Makan");
10. }
11. publicvoidTidur()
12. {
13. Debug.Log("Perlu Tidur");
14. }
15. }
1. publicclassPrajurit:Manusia
Tambahkan method ini di dalam kelas Prajurit
1. voidMenyerang(){
2. Debug.Log("Menyerang");
3. }
Tambahkan kode ini di dalam method Start()
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassPrajurit:Manusia
6. {
7. voidStart()
8. {
9. Debug.Log("Seorang Prajurit dapat : ");
10. Makan();
11. Tidur();
12. Menyerang();
13. }
14.
15. voidUpdate()
16. {
17.
18. }
19.
20. voidMenyerang()
21. {
22. Debug.Log("Menyerang");
23. }
24. }
Array
Jika Anda terbiasa menggunakan bahasa Java, mungkin akan sedikit
bingung dengan penulisan Array di C#. Perbedaannya Anda dapat pelajari
di pembahasan ini.
Dengan menyimpan tipe data integer dengan 5 data yaitu 50, 20, 30, 10,
dan 40. Data tersebut dapat diakses oleh nomor index misal untuk
mendapatkan nilai data 10 pada index 3 maka dapat ditulis myArray[3].
Sedangkan beberapa latihan tentang array seperti berikut:
Multi-Dimensional Arrays
Berikut ini contoh array dengan 2 Dimensi. Untuk array 2 dimensi untuk
mendapatkan sebuah nilai, maka diperlukan 2 buah nilai misal Baris ke 4
dan Kolom ke 3.
Misal:
Jagged Arrays
Bisa dikatakan array di dalam array
Misal:
https://docs.unity3d.com/ScriptReference/Array.html
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan6:MonoBehaviour
6. {
7. int[] intArray;// Deklarasi Array
8. // Use this for initialization
9. voidStart()
10. {
11. intArray =newint[4];// Inisialisasi Array
12. intArray[0]=10;// Memasukkan nilai Array
13. intArray[1]=20;
14. intArray[2]=30;
15. intArray[3]=40;
16. Debug.Log("Menampilkan Seluruh Array");
17. foreach(int a in intArray)
18. {
19. Debug.Log(a);
20. }
21. Debug.Log("Nilai Index ke 2 adalah "+ intArray[2]);
22. }
23.
24. // Update is called once per frame
25. voidUpdate()
26. {
27.
28. }
29. }
1. int[] intArray;
menjadi
1. publicint[] intArray;
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4.
5. publicclassLatihan6:MonoBehaviour
6. {
7.
8. publicint[] intArray;// Deklarasi Array
9.
10. // Use this for initialization
11. voidStart()
12. {
13. Debug.Log("Menampilkan Seluruh Array");
14. foreach(int a in intArray)
15. {
16. Debug.Log(a);
17. }
18. Debug.Log("Nilai Index ke 2 adalah "+ intArray[2]);
19. }
20.
21. // Update is called once per frame
22. voidUpdate()
23. {
24.
25. }
26. }
Jawaban Anda
3, 4, 5
1, 4, 5
2, 4, 5
1, 2, 5
1, 3, 4
1. Buka Unity
2. Klik New
4. Centang/pilih 2D
Memasukkan Assets
Membuat Area Game
Membuat Paddle (Pemukul)
Membuat Bola
Menambahkan Audio
Membuat Score
Membuat Halaman Game Over dan Halaman Menu
Memasukkan Aset
Menyiapkan Assets
Lingkaran
Nama : Lingkaran.png
Ukuran : 64x64 pixel
Warna : Putih
Keterangan : Lingkaran penuh dengan warna putih
Persegi
Nama : Persegi.png
Ukuran : 64x64 pixel
Warna : Putih
Keterangan : Blok penuh dengan warna putihGambar ini akan
digunakan sebagai Paddle dan WallAnda dapat membuat sendiri, Tool free
yang dapat Anda gunakan:
https://www.getpaint.net/
Anda dapat Unduh kedua gambar disiniUnduh Aset Game Pukul Bola
Praktik: Membuat Folder
Anda juga dapat mengganti nama folder dengan klik kali pada nama
folder maka tunggu beberapa saat kemudian muncul edit teks pada nama
folder atau Anda juga dapat dengan klik Folder kemudian tekan F12 pada
keyboard.
1. Masuk kedalam folder Images yang telah dibuat dengan klik 2 kali.
Kemudian klik kanan > Import New Asset…
Scene yang pertama kali dibuat ini belum tersimpan. Untuk menyimpan
Scene, ikuti langkah-langkah berikut:
Membuat Background
Selanjutnya kita akan membuat Tepi dan Garis Pembatas Tengah sebagai
area game. Langkah pertama kita akan membuat Tepi Atas terlebih
dahulu dengan langkah-langkah sebagai berikut:
TepiBawah
TepiKanan
TepiKiri
BatasTengah
Sekarang Anda sudah selesai membuat Area Game dan siap untuk
digunakan.
Di submodul ini kita akan membuat Paddle yang bergerak ke atas dan ke
bawah dengan menekan tombol keyboard.
1. Masukkan Persegi ke Scene, Kemudian ubah
Nama Persegi menjadi Pemukul1
4. Karena Paddle merupakan objek yang tidak dapat ditembus oleh objek
lain maka tambahkan Komponen Collision dengan cara Klik Add
Component > Physics 2D > Box Collider 2D
Objek paddle sudah siap. Selanjutnya Membuat pemukul (Paddle)
bergerak.
1. Buka InputManager (Klik Edit > Project Settings > Input). Karena
kita akan menambahkan varian input baru, edit
field Size pada Axes dari 18 menjadi 20
Setelah diubah sizenya maka muncul 2 tambahan baru dengan
nama Cancel.
2. Untuk dua varian input terbawah, ikuti setting pada screenshot berikut
Tips: di versi Unity yang terbaru, jika Anda mengedit yang sudah ada
misal Vertical maka akan muncul error.
Dari sini, kita memiliki 2 varian customized input
Vertical 1
Ini akan digunakan untuk menggerakkan Pemukul dari player 1. Pemukul
dari player 1 akan digerakkan ke bawah (negative button) dengan
tombol s dan bergerak ke atas (positive button) dengan tombol w.
Vertical 2
Ini akan digunakan untuk menggerakkan Pemukul dari player 2. Pemukul
dari player 2 akan bergerak ke bawah (negative button) dengan
tombol (down) dan bergerak ke atas (positive button) dengan
tombol ↑ (up).
kecepatan pergerakan Paddle/Pemukul
varian input mana yang mengatur paddle tersebut: Vertical
1 atau Vertical 2
perubahan posisi pada sumbu Y sesuai dengan tombol yang ditekan
using UnityEngine;
public class PaddleController : MonoBehaviour {
public float kecepatan;
public string axis;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
float gerak = Input.GetAxis(axis) * kecepatan * Time.deltaTime;
transform.Translate(0, gerak, 0);
}
}
Pembahasan
Apabila nilai yang diinputkan melebihi batas atas maka nilai inputan
menjadi 0 berarti GameObject pemukul tidak bergerak
Apabila nilai yang diinputkan kurang dari batas bawah maka nilai inputan
menjadi 0 berarti GameObject pemukul tidak bergerak
Apabila pemukul berada dalam batas bawah dan batas atas maka
pemukul bebas untuk berpindah ke mana pun.
using UnityEngine;
public class PaddleController : MonoBehaviour
{
public float batasAtas;
public float batasBawah;
public float kecepatan;
public string axis;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
float gerak = Input.GetAxis (axis) * kecepatan * Time.deltaTime;
float nextPos = transform.position.y + gerak;
if (nextPos > batasAtas) {
gerak = 0;
}
if (nextPos < batasBawah) {
gerak = 0;
}
transform.Translate (0, gerak, 0);
}
}
3. Kemudian isikan kedua nilai tersebut pada filed Batas Atas dan Batas
Bawah.
Ketika dijalankan sebagai berikut:
Membuat Bola
Di submodul ini, kita akan menerapkan 2D Physics ke Bola, antara lain
sebagai berikut:
Pertama, kita membuat objek Bola terlebih dahulu dengan cara sebagai
berikut:
Arah dan besaran Force (tekanan)
Massa bola
Force dalam Unity ditambahkan pada Rigidbody 2D. Dalam tutorial ini,
kita mencoba menambahkan Force sebagai pergerakan Bola pertama kali.
Berikut ini langkah-langkahnya.
1. publicint force;
2. Rigidbody2D rigid;
1. rigid =GetComponent<Rigidbody2D>();
2. Vector2 arah =newVector2(2,0).normalized;
3. rigid.AddForce(arah * force );
Simpan dengan tekan Ctrl+S
1. usingUnityEngine;
2. publicclassBallController:MonoBehaviour
3. {
4. publicint force;
5. Rigidbody2D rigid;
6. // Use this for initialization
7. voidStart()
8. {
9. rigid =GetComponent<Rigidbody2D>();
10. Vector2 arah =newVector2(2,0).normalized;
11. rigid.AddForce(arah * force);
12. }
13. // Update is called once per frame
14. voidUpdate()
15. {
16. }
17. }
Pembahasan
1. publicint force;
1. Rigidbody2D rigid;
1. rigid =GetComponent<Rigidbody2D>();
1. rigid.AddForce(arah * force);
Saat bola menyentuh tepi kanan dan tepi kiri, bola kembali ke posisi start.
Jika bola mati di sebelah kanan maka bola akan mengarah ke kanan.
Begitupun sebaliknya, jika bola mati di sebelah kiri maka bola akan
mengarah ke kiri. Langkah-langkahnya sebagai berikut:
1. Buka Script BolaController.cs dengan klik 2 kali. Lalu tambahkan code
sebagai berikut:
1. voidResetBall()
2. {
3. transform.localPosition =newVector2(0,0);
4. rigid.velocity =newVector2(0,0);
5. }
Tambahkan function OnCollisionEnter2D di class BolaController
1. privatevoidOnCollisionEnter2D(Collision2D coll)
2. {
3. if(coll.gameObject.name =="TepiKanan"){
4. ResetBall();
5. Vector2 arah =newVector2(2,0).normalized;
6. rigid.AddForce(arah * force);
7. }
8. if(coll.gameObject.name =="TepiKiri"){
9. ResetBall();
10. Vector2 arah =newVector2(-2,0).normalized;
11. rigid.AddForce(arah * force);
12. }
13. }
1. usingUnityEngine;
2. publicclassBallController:MonoBehaviour
3. {
4. publicint force;
5. Rigidbody2D rigid;
6. // Use this for initialization
7. voidStart()
8. {
9. rigid =GetComponent<Rigidbody2D>();
10. Vector2 arah =newVector2(2,0).normalized;
11. rigid.AddForce(arah * force);
12. }
13. // Update is called once per frame
14. voidUpdate()
15. {
16. }
17. privatevoidOnCollisionEnter2D(Collision2D coll)
18. {
19. if(coll.gameObject.name =="TepiKanan"){
20. ResetBall();
21. Vector2 arah =newVector2(2,0).normalized;
22. rigid.AddForce(arah * force);
23. }
24. if(coll.gameObject.name =="TepiKiri"){
25. ResetBall();
26. Vector2 arah =newVector2(-2,0).normalized;
27. rigid.AddForce(arah * force);
28. }
29. }
30. voidResetBall()
31. {
32. transform.localPosition =newVector2(0,0);
33. rigid.velocity =newVector2(0,0);
34. }
35. }
Pembahasan
1. voidResetBall()
1. transform.localPosition =newVector2(0,0);
1. rigid.velocity =newVector2(0,0);
1. privatevoidOnCollisionEnter2D(Collision2D coll)
1. if(coll.gameObject.name =="TepiKanan")
1. ResetBall();
Misalnya bola mengenai ujung atas Paddle yang di mana posisi y pada
bola sebesar 5 dan posisi Y pada paddle sebesar 1, maka dari kedua nilai
tersebut terdapat perbedaan 5 - 1 = 4 (lebih besar nilai 0 maka bola
dipantul keatas). Sedangkan jika posisi Y pada bola tepat dengan posisi
Paddle yaitu sama-sama 1 maka nilai selisih yang didapat adalah 0 (bola
akan dipantulkan lurus).
1. usingUnityEngine;
2. publicclassBallController:MonoBehaviour{
3. publicint force;
4. Rigidbody2D rigid;
5. // Use this for initialization
6. voidStart(){
7. rigid =GetComponent<Rigidbody2D>();
8. Vector2 arah =newVector2(2,0).normalized;
9. rigid.AddForce(arah * force);
10. }
11. // Update is called once per frame
12. voidUpdate(){
13. }
14. privatevoidOnCollisionEnter2D(Collision2D coll)
15. {
16. if(coll.gameObject.name =="TepiKanan")
17. {
18. ResetBall();
19. Vector2 arah =newVector2(2,0).normalized;
20. rigid.AddForce(arah * force);
21. }
22. if(coll.gameObject.name =="TepiKiri")
23. {
24. ResetBall();
25. Vector2 arah =newVector2(-2,0).normalized;
26. rigid.AddForce(arah * force);
27. }
28. if(coll.gameObject.name =="Pemukul1"|| coll.gameObject.name
=="Pemukul2")
29. {
30. float sudut =(transform.position.y - coll.transform.position.y)*5f;
31. Vector2 arah =newVector2(rigid.velocity.x, sudut).normalized;
32. rigid.velocity =newVector2(0,0);
33. rigid.AddForce(arah * force *2);
34. }
35. }
36. voidResetBall()
37. {
38. transform.localPosition =newVector2(0,0);
39. rigid.velocity =newVector2(0,0);
40. }
41. }
Pembahasan
1. if(coll.gameObject.name =="Pemukul1"||
coll.gameObject.name =="Pemukul2")
1. rigid.velocity =newVector2(0,0);
Membuat Skor
Setelah gameplay sederhana dapat dimainkan, selanjutnya membuat
Skor. Di bagian ini, selain menghitung berapa skor yang diperoleh, kita
juga mempelajari tentang UI, mengatur UI, dan implementasi Font.
Pastikan style font sesuai dengan style game Anda. Karena game pukul
bola lebih terlihat game klasik maka kita menggunakan font pixel.
Sekarang Anda sudah memiliki font yang siap digunakan untuk UI Text
Praktik 6.2: Membuat UI Skor
1. Tambahkan Teks baru dengan klik kanan pada Scene Main kemudian
pilih GameObject > UI > Text dan ubah nama
GameObject Text menjadi Score1.
1. int scoreP1;
2. int scoreP2;
Tambahkan inisialisasi variable score di function Start()
1. scoreP1 =0;
2. scoreP2 =0;
Simpan perubahan dengan tekan Ctrl+S
penambahan scoreP1 dan scoreP2
1. scoreP1 +=1;
Tambahkan code ini ketika bola menyentuh Tepi Kiri
1. scoreP2 +=1;
Simpan perubahan dengan tekan Ctrl+S
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4. publicclassBallController:MonoBehaviour
5. {
6. publicint force;
7. Rigidbody2D rigid;
8. int scoreP1;
9. int scoreP2;
10. // Use this for initialization
11. voidStart()
12. {
13. rigid =GetComponent<Rigidbody2D>();
14. Vector2 arah =newVector2(2,0).normalized;
15. rigid.AddForce(arah * force);
16. scoreP1 =0;
17. scoreP2 =0;
18. }
19. // Update is called once per frame
20. voidUpdate()
21. {
22. }
23. privatevoidOnCollisionEnter2D(Collision2D coll)
24. {
25. if(coll.gameObject.name =="TepiKanan"){
26. scoreP1 +=1;
27. ResetBall();
28. Vector2 arah =newVector2(2,0).normalized;
29. rigid.AddForce(arah * force);
30. }
31. if(coll.gameObject.name =="TepiKiri"){
32. scoreP2 +=1;
33. ResetBall();
34. Vector2 arah =newVector2(-2,0).normalized;
35. rigid.AddForce(arah * force);
36. }
37. if(coll.gameObject.name =="Pemukul1"|| coll.gameObject.name
=="Pemukul2"){
38. float sudut =(transform.position.y - coll.transform.position.y)*5f;
39. Vector2 arah =newVector2(rigid.velocity.x, sudut).normalized;
40. rigid.velocity =newVector2(0,0);
41. rigid.AddForce(arah * force *2);
42. }
43. }
44. voidResetBall()
45. {
46. transform.localPosition =newVector2(0,0);
47. rigid.velocity =newVector2(0,0);
48. }
49. }
Setelah menambahkan text (Score1 dan Score2 pada Canvas), kita perlu
menampilkan score yang diperhitungan ke layar. Penambahan score
diatur dalam Script BallController.cs. Oleh karena itu, penulisan skor juga
akan ditangani dalam script ini. Langkah-langkahnya sebagai berikut:
1. usingUnityEngine.UI;
Tambahkan Variable di dalam class BallController
1. Text scoreUIP1;
2. Text scoreUIP2;
Tambahkan Inisialisasi variable scoreUIP1 dan scrore UIP2
1. scoreUIP1 =GameObject.Find("Score1").GetComponent<Text>();
2. scoreUIP2 =GameObject.Find("Score2").GetComponent<Text>();
Tambahkan function di dalam class BallController
1. voidTampilkanScore()
2. {
3. Debug.Log("Score P1: "+ scoreP1 +" Score P2: "+ scoreP2);
4. scoreUIP1.text = scoreP1 +"";
5. scoreUIP2.text = scoreP2 +"";
6. }
Tambahkan code ini ketika penambahkan scoreP1 dan scoreP2
1. TampilkanScore();
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4. usingUnityEngine.UI;
5. publicclassBallController:MonoBehaviour
6. {
7. publicint force;
8. Rigidbody2D rigid;
9. int scoreP1;
10. int scoreP2;
11. Text scoreUIP1;
12. Text scoreUIP2;
13. // Use this for initialization
14. voidStart()
15. {
16. rigid =GetComponent<Rigidbody2D>();
17. Vector2 arah =newVector2(2,0).normalized;
18. rigid.AddForce(arah * force);
19. scoreP1 =0;
20. scoreP2 =0;
21. scoreUIP1 =GameObject.Find("Score1").GetComponent<Text>();
22. scoreUIP2 =GameObject.Find("Score2").GetComponent<Text>();
23. }
24. // Update is called once per frame
25. voidUpdate()
26. {
27. }
28. privatevoidOnCollisionEnter2D(Collision2D coll)
29. {
30. if(coll.gameObject.name =="TepiKanan"){
31. scoreP1 +=1;
32. TampilkanScore();
33. ResetBall();
34. Vector2 arah =newVector2(2,0).normalized;
35. rigid.AddForce(arah * force);
36. }
37. if(coll.gameObject.name =="TepiKiri"){
38. scoreP2 +=1;
39. TampilkanScore();
40. ResetBall();
41. Vector2 arah =newVector2(-2,0).normalized;
42. rigid.AddForce(arah * force);
43. }
44. if(coll.gameObject.name =="Pemukul1"|| coll.gameObject.name
=="Pemukul2"){
45. float sudut =(transform.position.y - coll.transform.position.y)*5f;
46. Vector2 arah =newVector2(rigid.velocity.x, sudut).normalized;
47. rigid.velocity =newVector2(0,0);
48. rigid.AddForce(arah * force *2);
49. }
50. }
51. voidResetBall()
52. {
53. transform.localPosition =newVector2(0,0);
54. rigid.velocity =newVector2(0,0);
55. }
56. voidTampilkanScore()
57. {
58. Debug.Log("Score P1: "+ scoreP1 +" Score P2: "+ scoreP2);
59. scoreUIP1.text = scoreP1 +"";
60. scoreUIP2.text = scoreP2 +"";
61. }
62. }
Pembahasan
using UnityEngine.UI;
Text scoreUIP1;
Text scoreUIP2;
scoreUIP1 = GameObject.Find("Score1").GetComponent<Text>();
scoreUIP2 = GameObject.Find("Score2").GetComponent<Text>();
void TampilkanScore() {
1. Tambahkan UI Panel pada Canvas dengan cara Klik Kanan pada Canvas
kemudian pilih UI > Panel. Ubah Nama
dari Panel menjadi PanelSelesai.
Jangan lupa untuk mengatur posisi dan width dan height pada Rect
Transform
Button 1
o Nama Object: BtnMenu
o Width: > 271
o Height: > 92
o Source Image: Persegi
o Normal Color: Putih
o Pressed Color: Oranye
Text pada Botton 1
o Text: Kembali Ke Main Manu
o Font: joystix monospace
o Font Size: 26
o Alignment: Center-Center
o Color: Hitam
Button 2
o Nama Object: BtnUlangi
o Width: > 271
o Height: > 92
o Source Image: Persegi
o Normal Color: Putih
o Pressed Color: Oranye
Text pada Botton 2
o Text: Ulangi Permainan
o Font: joystix monospace
o Font Size: 26
o Alignment: Center-Center
o Color: Hitam
Tampilan Score
1. GameObject panelSelesai;
2. Text txPemenang;
Tambahkan inisialisasi variable panelSelesai tersebut di function
Start()
1. panelSelesai =GameObject.Find("PanelSelesai");
2. panelSelesai.SetActive(false);
Tambahkan kode ini setelah menampilkan skor saat bola
menyentuh tepi kanan
1. if(scoreP1 ==5){
2. panelSelesai.SetActive(true);
3. txPemenang
=GameObject.Find("Pemenang").GetComponent<Text>();
4. txPemenang.text ="Player Biru Pemenang!";
5. Destroy(gameObject);
6. return;
7. }
Tambahkan code ini setelah menampilkan score ketika bola
menyentuh tepi kiri
1. if(scoreP2 ==5){
2. panelSelesai.SetActive(true);
3. txPemenang
=GameObject.Find("Pemenang").GetComponent<Text>();
4. txPemenang.text ="Player Merah Pemenang!";
5. Destroy(gameObject);
6. return;
7. }
Simpan dengan tekan Ctrl+S
1. usingSystem.Collections;
2. usingSystem.Collections.Generic;
3. usingUnityEngine;
4. usingUnityEngine.UI;
5.
6.
7. publicclassBallController:MonoBehaviour
8. {
9.
10.
11. publicint force;
12. Rigidbody2D rigid;
13.
14.
15. int scoreP1;
16. int scoreP2;
17.
18.
19. Text scoreUIP1;
20. Text scoreUIP2;
21.
22.
23. GameObject panelSelesai;
24. Text txPemenang;
25.
26.
27. // Use this for initialization
28. voidStart()
29. {
30. rigid =GetComponent<Rigidbody2D>();
31. Vector2 arah =newVector2(2,0).normalized;
32. rigid.AddForce(arah * force);
33.
34.
35. scoreP1 =0;
36. scoreP2 =0;
37.
38.
39. scoreUIP1 =GameObject.Find("Score1").GetComponent<Text>();
40. scoreUIP2 =GameObject.Find("Score2").GetComponent<Text>();
41.
42.
43. panelSelesai =GameObject.Find("PanelSelesai");
44. panelSelesai.SetActive(false);
45. }
46.
47.
48. // Update is called once per frame
49. voidUpdate()
50. {
51.
52.
53. }
54.
55.
56. privatevoidOnCollisionEnter2D(Collision2D coll)
57. {
58. if(coll.gameObject.name =="TepiKanan"){
59. scoreP1 +=1;
60. TampilkanScore();
61. if(scoreP1 ==5){
62. panelSelesai.SetActive(true);
63. txPemenang
=GameObject.Find("Pemenang").GetComponent<Text>();
64. txPemenang.text ="Player Biru Pemenang!";
65. Destroy(gameObject);
66. return;
67. }
68. ResetBall();
69. Vector2 arah =newVector2(2,0).normalized;
70. rigid.AddForce(arah * force);
71. }
72.
73.
74. if(coll.gameObject.name =="TepiKiri"){
75. scoreP2 +=1;
76. TampilkanScore();
77. if(scoreP2 ==5){
78. panelSelesai.SetActive(true);
79. txPemenang
=GameObject.Find("Pemenang").GetComponent<Text>();
80. txPemenang.text ="Player Merah Pemenang!";
81. Destroy(gameObject);
82. return;
83. }
84. ResetBall();
85. Vector2 arah =newVector2(-2,0).normalized;
86. rigid.AddForce(arah * force);
87. }
88.
89.
90. if(coll.gameObject.name =="Pemukul1"|| coll.gameObject.name
=="Pemukul2"){
91. float sudut =(transform.position.y - coll.transform.position.y)*5f;
92. Vector2 arah =newVector2(rigid.velocity.x, sudut).normalized;
93. rigid.velocity =newVector2(0,0);
94. rigid.AddForce(arah * force *2);
95. }
96.
97.
98. }
99.
100.
101. voidResetBall()
102. {
103. transform.localPosition =newVector2(0,0);
104. rigid.velocity =newVector2(0,0);
105. }
106.
107.
108. voidTampilkanScore()
109. {
110. Debug.Log("Score P1: "+ scoreP1 +" Score P2: "+ scoreP2);
111. scoreUIP1.text = scoreP1 +"";
112. scoreUIP2.text = scoreP2 +"";
113. }
114. }
Pembahasan
1. GameObject panelSelesai;
2. Text txPemenang;
1. panelSelesai =GameObject.Find("PanelSelesai");
2. panelSelesai.SetActive(false);
1. panelSelesai.SetActive(true);
1. txPemenang
=GameObject.Find("Pemenang").GetComponent<Text>();
1. Destroy(gameObject);
Hilangkan Bola
1. Return;
Text 1
o Nama Object: Judul
o Text: Pukul Bola
o Font: joystix monospace
o Font size: 96
o Alignment: Center - Center
o Color: Putih
Button 1
o Nama Object: btnMulai
o Width: > 400
o Height: > 150
o Source Image: Persegi
o Normal Color: Putih
o Pressed Color: Oranye
Text pada Botton 1
o Text: Mulai!
o Font: joystix monospace
o Font Size: 60
o Alignment: Center-Center
o Color: Hitam
1. usingUnityEngine.SceneManagement;
Tambahkan variable di dalam class HalamanManager
1. publicbool isEscapeToExit;
Tambahkan 2 function kedalam class HalamanManager
1. publicvoidMulaiPermainan()
2. {
3. SceneManager.LoadScene("Main");
4. }
5. publicvoidKembaliKeMenu()
6. {
7. SceneManager.LoadScene("Menu");
8. }
Tambahkan code ini di dalam function Update
1. if(Input.GetKeyUp(KeyCode.Escape)){
2. if(isEscapeToExit){
3. Application.Quit();
4. }else{
5. KembaliKeMenu();
6. }
7. }
1. usingUnityEngine;
2. usingUnityEngine.SceneManagement;
3. publicclassHalamanManager:MonoBehaviour
4. {
5. publicbool isEscapeToExit;
6. // Use this for initialization
7. voidStart()
8. {
9. }
10. // Update is called once per frame
11. voidUpdate()
12. {
13. if(Input.GetKeyUp(KeyCode.Escape)){
14. if(isEscapeToExit){
15. Application.Quit();
16. }else{
17. KembaliKeMenu();
18. }
19. }
20. }
21. publicvoidMulaiPermainan()
22. {
23. SceneManager.LoadScene("Main");
24. }
25. publicvoidKembaliKeMenu()
26. {
27. SceneManager.LoadScene("Menu");
28. }
29. }
Pembahasan
1. usingUnityEngine.SceneManagement;
1. publicbool isEscapeToExit;
1. publicvoidMulaiPermainan(){
2. SceneManager.LoadScene("Main");
3. }
1. if(Input.GetKeyUp(KeyCode.Escape))
2. {
3. if(isEscapeToExit)
4. {
5. Application.Quit();
6. }
7. else
8. {
9. KembaliKeMenu();
10. }
11. }
Scene yang telah dibuat, tidak dapat langsung diakses. Kita sudah
memiliki 2 Scene. Kedua scene tersebutt harus dimasukkan terlebih
dahulu ke Scenes In Build.
Setelah script sudah dibuat dan scene sudah siap, selanjutnya hubungkan
script yang telah dibuat ke Button (btnMulai). Langkah-langkahnya antara
lain:
1. Klik btnMulai, kemudian pada komponen Button di panel Inspector.
Klik icon + pada On Click().
Ketika mejalankan dari scene menu, kemudian klik tombol mulai maka
akan membuka halaman permainan pada scene Main.
4. Terapkan juga function pada button di halaman selesai
Sekarang Game Anda sudah selesai dan dapat dimainkan dengan baik.
Menambahkan Audio
Menuju bagian akhir dari modul ini, kali ini kita akan belajar
menambahkan audio agar game yang dibuat lebih hidup. Dalam tutorial
ini, audio akan digunakan sebagai:
Background music
Sound effect ketika bola terpantul
Audio Listener
Audio Source
Audio Clip
Audio Clip berisi data audio yang akan digunakan oleh Audio Source.
Format audio yang ada dalam Unity yaitu: .aif, .wav, .mp3, and .ogg.
3. Selanjutnya, agar sound effect dapat diputar pada waktu yang sesuai,
buka script BolaController.cs lalu tambahkan potongan kode berikut.
1. AudioSource audio;
2. publicAudioClip hitSound;
Pada prosedur Start(), tambahkan:
1. audio =GetComponent<AudioSource>();
1. audio.PlayOneShot(hitSound);
Simpan perubahan dengan tekan Ctrl+S
1. usingUnityEngine;
2. usingUnityEngine.UI;
3. publicclassBallController:MonoBehaviour
4. {
5. publicint force;
6. Rigidbody2D rigid;
7. int scoreP1;
8. int scoreP2;
9. Text scoreUIP1;
10. Text scoreUIP2;
11. GameObject panelSelesai;
12. Text txPemenang;
13. AudioSource audio;
14. publicAudioClip hitSound;
15. // Use this for initialization
16. voidStart()
17. {
18. rigid =GetComponent<Rigidbody2D>();
19. Vector2 arah =newVector2(2,0).normalized;
20. rigid.AddForce(arah * force);
21. scoreP1 =0;
22. scoreP2 =0;
23. scoreUIP1 =GameObject.Find("Score1").GetComponent<Text>();
24. scoreUIP2 =GameObject.Find("Score2").GetComponent<Text>();
25. panelSelesai =GameObject.Find("PanelSelesai");
26. panelSelesai.SetActive(false);
27. audio =GetComponent<AudioSource>();
28. }
29. // Update is called once per frame
30. voidUpdate()
31. {
32. }
33. privatevoidOnCollisionEnter2D(Collision2D coll)
34. {
35. audio.PlayOneShot(hitSound);
36. if(coll.gameObject.name =="TepiKanan"){
37. scoreP1 +=1;
38. TampilkanScore();
39. if(scoreP1 ==5){
40. panelSelesai.SetActive(true);
41. txPemenang =GameObject.Find("Pemenang").GetComponent<Text>();
42. txPemenang.text ="Player Biru Pemenang!";
43. Destroy(gameObject);
44. return;
45. }
46. ResetBall();
47. Vector2 arah =newVector2(2,0).normalized;
48. rigid.AddForce(arah * force);
49. }
50. if(coll.gameObject.name =="TepiKiri"){
51. scoreP2 +=1;
52. TampilkanScore();
53. if(scoreP2 ==5){
54. panelSelesai.SetActive(true);
55. txPemenang =GameObject.Find("Pemenang").GetComponent<Text>();
56. txPemenang.text ="Player Merah Pemenang!";
57. Destroy(gameObject);
58. return;
59. }
60. ResetBall();
61. Vector2 arah =newVector2(-2,0).normalized;
62. rigid.AddForce(arah * force);
63. }
64. if(coll.gameObject.name =="Pemukul1"|| coll.gameObject.name
=="Pemukul2"){
65. float sudut =(transform.position.y - coll.transform.position.y)*5f;
66. Vector2 arah =newVector2(rigid.velocity.x, sudut).normalized;
67. rigid.velocity =newVector2(0,0);
68. rigid.AddForce(arah * force *2);
69. }
70. }
71. voidResetBall()
72. {
73. transform.localPosition =newVector2(0,0);
74. rigid.velocity =newVector2(0,0);
75. }
76. voidTampilkanScore()
77. {
78. Debug.Log("Score P1: "+ scoreP1 +" Score P2: "+ scoreP2);
79. scoreUIP1.text = scoreP1 +"";
80. scoreUIP2.text = scoreP2 +"";
81. }
82. }
Pembahasan:
1. AudioSource audio;
1. publicAudioClip hitSound;
1. audio.PlayOneShot(hitSound);
Menjalankan sebuah audio
Submission
Selamat, Anda telah menyelesaikan materi dalam kelas Belajar Membuat
Game Untuk Pemula. Untuk lulus dan mendapatkan sertifikat dari
Akademi ini, Anda harus mengumpulkan Tugas Akhir berupa game yang
Anda buat sendiri.
Game tersebut dibuat dengan memanfaatkan materi pada modul yang
telah Anda pelajari sebelumnya. Atau, Anda juga dapat
mengembangkannya menjadi lebih menarik.
Resources Asset 2D
http://www.gameart2d.com/freebies.html
https://kenney.nl/assets