Anda di halaman 1dari 31

Modul 9

Scripting (Hard)

Pada modul ini kita akan mempelajari tentang cara menggerakkan objek baik
itu player ataupun camera, dan juga kita akan mempelajari tentang audio lagi
tetapi tentang 3D Audio, dan juga bagaimana cara pindah dari satu scene ke
scene lainnya, dan yang terakhir adalah bagaimana cara kita menyimpan data.
Modul ini akan cukup banyak, ya karena ini sudah mulai memasuki bagian
yang agak hard. Silakan ikuti secara perlahan dan santai.

A. Cara Mendapatkan Input dari Keyboard dan Mouse


Pertama-tama untuk permulaan di modul ini, mari kita buat terlebih
dahulu sebuah objek capsule yang akan menjadi pemain kita nanti. Ikuti
langkah-langkah di bawah agar paham.
1. Buat player kita, dengan klik kanan hirarki > 3D Object > Capsule. Lalu
buat juga balok/cube sebagai tangannya. Beri nama Capsule sebagai
Player dan balok sebagai Hands. Atur ukurannya agar pas. Hasilnya akan
menjadi seperti di bawah.
2. Buat Hands menjadi child dari Player.

3. Agar pemain kita warnanya tidak sama dengan Plane, maka buatlah
material bernama PlayerSkinMat. Dan ubahlah warnanya menjadi
warna kulit yang kalian sukai. Jika sudah drag and drop ke Player dan
Hands.

4. Selanjutnya buatlah Script “PlayerController”. Jika sudah drag and drop


ke Player. Kemudian bukalah scriptnya dan edit menjadi seperti ini.

using UnityEngine;
public class PlayerController : MonoBehaviour
{
// Update is called once per frame
void Update()
{
// Get Keyboard Input
if (Input.GetKey(KeyCode.A))
Debug.Log("A");
if (Input.GetKey(KeyCode.W))
Debug.Log("W");
if (Input.GetKey(KeyCode.S))
Debug.Log("S");
if (Input.GetKey(KeyCode.D))
Debug.Log("D");
}
}
5. Jangan lupa save scriptnya. Lalu silakan play scenenya. Dan coba tekan
keyboard huruf A, W, S, D.
Penjelasan Kode

if (Input.GetKey(KeyCode.A))
Debug.Log("A");
Jika kita memberikan input, sudah pasti pada saat game berjalan dia
harus menerimanya maka dari itu kodenya di tulis di method Update.
Untuk mendapatkan input gunakan syntax Input, dan ada berbagai
macam jenis Input. Ada GetKey, GetKey Up dan Down untuk keyboard,
dan ada juga GetButton, dan lain-lain. Maka ketika KeyCode A ditekan
maka Console akan mengirimkan pesan juga.

B. Cara Menggerakkan Pemain


Setelah mengetahui cara mendapatkan Input dari Keyboard, selanjutnya
kita akan membuat cara menggerakkan pemain. Caranya ada terbagi 2,
yaitu cara yang pemula dan cara yang advance. Ikuti saja langkah-langkah
di bawah ini agar paham.
Level Beginner

1. Pertama kita akan mencoba cara yang mudah dulu. Pertama, kalian bisa
hapus kode di PlayerController yang kalian barusan tambahkan tadi.
2. Lalu kembali ke Unity dan tambahkan Rigidbody pada Player agar
pemain kita mempunyai fisik. Kemudian di bagian Constraints > Freeze
Rotation > Centang X, Y, Z

3. Kembali ke scriptnya dan edit menjadi seperti ini.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour


{
// Deklarasi variabel
private float speed = 5f;

// Start is called before the first frame update


void Start()
{

// Update is called once per frame


void Update()
{

// FixedUpdate is for physic things


private void FixedUpdate()
{
// Berpindah ke Kiri
if (Input.GetKey(KeyCode.A))
{
transform.position = new
Vector3(transform.position.x - 0.3f, transform.position.y,
transform.position.z);
}

// Berpindah ke Depan
if (Input.GetKey(KeyCode.W))
{
transform.position = new
Vector3(transform.position.x, transform.position.y,
transform.position.z + 0.3f);
}

// Berpindah ke Belakang
if (Input.GetKey(KeyCode.S))
{
transform.position = new
Vector3(transform.position.x, transform.position.y,
transform.position.z - 0.3f);
}

// Berpindah ke Kanan
if (Input.GetKey(KeyCode.D))
{
transform.position = new
Vector3(transform.position.x + 0.3f, transform.position.y,
transform.position.z);
}
}
}
4. Jangan lupa save scriptnya dan silakan play scenenya. Maka playernya
akan bergerak.
Penjelasan Kode
Alangkah baiknya segala bentuk fisika atau gerakan atau semacamnya
dimasukkan ke dalam method FixedUpdate dikarenakan FixedUpdate
akan berjalan konstan sesuai dengan FixedTime (0.02 s). Selanjutnya
adalah logika menjalankan pemain. Jika kita ingin menjalankan pemain
tentunya posisi dari pemain tersebut akan berubah. Maka dari itu dalam
hal ini yang kita gunakan adalah posisi

if (Input.GetKey(KeyCode.A))
{
transform.position = new Vector3(transform.position.x -
0.3f, transform.position.y, transform.position.z);
}
Jika input keyboard A maka player akan ke kiri, begitu juga kontrol yang
lainnya memiliki peran masing-masing. Jika player ke kiri maka yang
berubah pastinya adalah sumbu X nya, maka dari itu sumbu X - 0.3f.
Tanda plus minus menentukan arah. Maka dibuatlah sebuah Vector3
agar posisinya berubah. Begitu juga input yang lainnya

Level Medium

1. Selanjutnya kita akan beralih ke level yang advance cara memindahkan


objek atau player. Kembali ke scriptnya, kalian bisa komen atau hapus
kode sebelumnya.
2. Yang akan kita lakukan di sini adalah mengimplementasikan sebuah
tekanan. Maka dari itu kita memerlukan Rigidbody. Edit scriptnya
menjadi seperti di bawah.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour


{
// Deklarasi variabel
private float speed = 5f;
Rigidbody rb;

// Start is called before the first frame update


void Start()
{
rb = GetComponent<Rigidbody>(); // Get Rigidbody
Component
}
// Update is called once per frame
void Update()
{

// FixedUpdate is for physic things


private void FixedUpdate()
{
// Berpindah ke Kiri
if (Input.GetKey(KeyCode.A))
{
/// Memindahkan pemain dengan posisi
/// transform.position = new
Vector3(transform.position.x - 0.3f, transform.position.y,
transform.position.z);

/// Memindahkan pemain dengan bantuan tekanan


rb.AddForce(new Vector3(-3f * speed, 0f, 0f));
}

// Berpindah ke Depan
if (Input.GetKey(KeyCode.W))
{
/// Memindahkan pemain dengan posisi
/// transform.position = new
Vector3(transform.position.x, transform.position.y,
transform.position.z + 0.3f);

/// Memindahkan pemain dengan bantuan tekanan


rb.AddForce(new Vector3(0f, 0f, 3f * speed));
}

// Berpindah ke Belakang
if (Input.GetKey(KeyCode.S))
{
/// Memindahkan pemain dengan posisi
/// transform.position = new
Vector3(transform.position.x, transform.position.y,
transform.position.z - 0.3f);

/// Memindahkan pemain dengan bantuan tekanan


rb.AddForce(new Vector3(0f, 0f, -3f * speed));
}
// Berpindah ke Kanan
if (Input.GetKey(KeyCode.D))
{
/// Memindahkan pemain dengan posisi
/// transform.position = new
Vector3(transform.position.x + 0.3f, transform.position.y,
transform.position.z);

/// Memindahkan pemain dengan bantuan tekanan


rb.AddForce(new Vector3(3f * speed, 0f, 0f));
}
}
}
5. Jangan lupa save scriptnya. Dan mainkan scenenya.
Penjelasan Kode
Dibandingkan kita mengubah posisinya, lebih baik kita memberikan
tekanan pada Playernya.

Rigidbody rb;
Sebelum menambahkan tekanan, kita harus deklarasi Rigidbodynya
terlebih dahulu

rb = GetComponent<Rigidbody>(); // Get Rigidbody Component


Setelah itu dapatkan komponen rigidbody dari player

if (Input.GetKey(KeyCode.A))
{
/// Memindahkan pemain dengan bantuan tekanan
rb.AddForce(new Vector3(-3f * speed, 0f, 0f));
}
Dengan menambahkan AddForce, maka tekanan akan mendorong
rigidbody player. AddForce membutuhkan Vector3. Masih sama seperti
yang posisi, jika mau ke kiri maka sumbu X nya negatif. Begitu juga yang
lainnya. Challange: Coba buat Player melompat

Level Hard

1. Semakin tinggi levelnya semakin bagus implementasi dari cara


menggerakkan objeknya
2. Dalam kode yang tadi, sangat tidak efisien. Dikarenakan pendeklarasian
Vector 3 yang berulang-ulang. Dan juga dalam menggerakkan player
bukan hanya A, W, S, D, tetapi arrow juga. Maka dari itu ada cara yang
lebih efisien. Selain itu jika kita ingin berhenti pemainnya akan tetap
jalan karena masih ada tekanan yang tersisi.
3. Tambahkan komponen Character Controller pada Player

4. Kalian bisa menghapus atau komen kode kalian yang sebelumnya. Edit
script kalian menjadi seperti di bawah.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour


{
// Deklarasi variabel
private float speed = 8f, jumpSpeed = 5f, gravity =
10f;
CharacterController controller;
private Vector3 movement;

// Start is called before the first frame update


void Start()
{
controller = GetComponent<CharacterController>();
// Get CharacterController Component
}

// Update is called once per frame


void Update()
{
// Dapatkan input yang membuat objek bergerak
horizontal dan vertikal
float moveHorizontal =
Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");

// Jika pemain di tanah maka dia bisa bergerak


// Jika di udara, maka dia tidak bisa bergerak
if (controller.isGrounded)
{
movement = new Vector3(moveHorizontal, 0f,
moveVertical);
movement *= speed;

// Jika player melompat


if (Input.GetButtonDown("Jump"))
movement.y = jumpSpeed;
}

// Saat melompat gravitasi akan bekerja


movement.y -= gravity * Time.deltaTime;
controller.Move(movement * Time.deltaTime); //
Gerakkan player
}
}
5. Jangan lupa save scriptnya dan coba mainkan scenenya. Lebih bagus
bukan?
Penjelasan Kode
Kenapa memakai Character Controller? Pertama, Character Controller
itu biasanya dipakai dalam third-person atau first-person player control
yang tidak memerlukan Rigidbody. (Kalian bisa Remove Component
Rigidbody, dan coba Play, maka hasilnya akan sama saja.)

private float speed = 8f, jumpSpeed = 5f, gravity = 10f;


CharacterController controller;
private Vector3 movement;

Pertama kita akan bikin variabel yang diperlukan yaitu kecepatan


bergerak (speed), kecepatan melompat atau lebih tepatnya kecepatan
ke atas (jumpSpeed), dan gravitasi. Kita juga membutuhkan
CharacterController agar bisa bergerak, dan juga Vector3 movement,
sebagai Vektor untuk pergerakan kita.

controller = GetComponent<CharacterController>(); // Get


CharacterController Component

Kita butuh komponen CharacterController pada player.

float moveHorizontal = Input.GetAxis("Horizontal");


float moveVertical = Input.GetAxis("Vertical");

Kita hanya perlu 2 baris ini untuk mendapatkan input horizontal (Kiri dan
kanan) dan Vertical (Depan dan belakang). Anda bisa melihat nama-
nama seperti Vertical, Horizontal, di Edit > Project Settings > Input > di
sana terdapat beberapa nama Key. Pertanyaannya adalah kenapa kita
membuat player bergerak di Update, bukan di FixedUpdate?
Dikarenakan untuk mendapatkan input itu diperlukan deteksi per
frame, sedangkan FixedUpdate berjalan sesuai fixed time jadi tidak
disarankan menggunakan input di FixedUpdate.

if (controller.isGrounded)
{
movement = new Vector3(moveHorizontal, 0f,
moveVertical);
movement *= speed;

// Jika player melompat


if (Input.GetButtonDown("Jump"))
movement.y = jumpSpeed;
}
Selanjutnya adalah kode ini. Di bagian kode inilah yang menentukan
player kita bergerak atau tidak. Logikanya adalah jika pemain kita
sedang berada di atas tanah/permukaan, maka dia bisa bergerak. Jika
melompat atau sedang berada di udara, maka dia tidak bisa bergerak.
Kemudian movement dibuat menjadi Vector3 yang mengambil input
dari keyboard untuk berpindah/bergerak dan dikalikan speed . Lalu
untuk melompat terdapat Input.GetButtonDown("Jump"). Sama
seperti GetAxis tadi, anda bisa melihat jump itu menggunakan key
space. GetButtonDown digunakan karena untuk mencegah jika pemain
menahan tombol space, dan player akan terbang ke angkasa. Jadi
GetButtonDown bertujuan agar pemain menekan tombol sekali saja.
Lalu jika pemain menekan Space maka sumbu Y akan bergerak.

movement.y -= gravity * Time.deltaTime;


controller.Move(movement * Time.deltaTime);
Selanjutnya adalah jika player sudah melompat maka harus diturunkan
memakai gravitasi yang dikalikan deltaTime. Dan yang terakhir jika
semuanya sudah masuk di vector movement, saatnya
menggerakkannya dengan character controller tadi, dengan fungsi
Move. Begitulah cara kita menggerakkan player kita.

Bonus Merotate Pemain


Kali ini kita akan mencoba merotate player dengan keyboard. Ikuti langkah-
langkah di bawah ini.
1. Buka script PlayerController-nya dan edit menjadi seperti di bawah ini.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour


{
// Deklarasi variabel
private float speed = 8f, jumpSpeed = 5f, gravity =
10f;
CharacterController controller;
private Vector3 movement;

// Start is called before the first frame update


void Start()
{
controller = GetComponent<CharacterController>();
// Get CharacterController Component
}

// Update is called once per frame


void Update()
{
// Dapatkan input yang membuat objek bergerak
horizontal dan vertikal
float moveHorizontal =
Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");

// Jika pemain di tanah maka dia bisa bergerak


// Jika di udara, maka dia tidak bisa bergerak
if (controller.isGrounded)
{
movement = new Vector3(0f, 0f, moveVertical);
movement =
transform.TransformDirection(movement);

movement *= speed;

// Jika player melompat


if (Input.GetButtonDown("Jump"))
movement.y = jumpSpeed;
}

// Saat melompat gravitasi akan bekerja


movement.y -= gravity * Time.deltaTime;
controller.Move(movement * Time.deltaTime); //
Gerakkan player

// Rotate Player
transform.Rotate(0, Input.GetAxis("Horizontal"),
0);
}
}
2. Save scriptnya dan silakan mainkan.
C. Membuat Camera Mengikuti Pemain
Selanjutnya kita akan membuat main camera kita mengikuti player kita.
Sederhana saja. Pertama kita harus mengetahui logikanya. Cara mengikuti
player adalah posisi kamera yang kita inginkan ditambah posisi player. Ikuti
langkah-langkah di bawah agar paham.
1. Buatlah script bernama “CameraScript”. Lalu drag and drop
CameraScript ke MainCamera di hierarki. Lalu bukalah scriptnya
2. Editlah scriptnya menjadi seperti ini.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraScript : MonoBehaviour


{
// Deklarasi variabel
GameObject player;
[SerializeField] Vector3 cameraOffset;

// Start is called before the first frame update


void Start()
{
// Pertama carilah objek bernama Player di hirarki
player = GameObject.Find("Player");
}

/// <summary>
/// LateUpdate: method yang dipanggil setelah Update
/// Method yang cocok untuk kamera
/// </summary>
private void LateUpdate()
{
// Kamera mengikuti player
// Posisi camera saat ini = posisi awal + posisi
Player
transform.position = cameraOffset +
player.transform.position;
}
}
3. Jangan lupa save scriptnya. Lalu kembali ke Unity dan atur agar posisi
kamera pas dengan posisi Player. Dan masukkan nilai posisinya ke
cameraOffset di Inspector. Anda bisa lihat valuenya di gambar di bawah.

4. Dan cobalah play. Jika masih kurang nyaman, aturlah senyaman


mungkin.
Penjelasan Kode

GameObject player;
[SerializeField] Vector3 cameraOffset;
Pertama kita harus mendeklarasikan GameObject player untuk
mendapatkan objek player dan Vector3 cameraOffset untuk
menentukan posisi camera saat mengikuti player.

player = GameObject.Find("Player");
Kode di atas untuk mencari object yang bernama Player.

transform.position = cameraOffset +
player.transform.position;
Kode di atas menjelaskan bahwa Posisi kamera akan menjadi posisi
kamera untuk mendapatkan objek player ditambah posisi Player.

Bonus: Camera Mengikuti Rotasi Player


Jika pada bonus yang pertama kita sudah merotasi pemain, maka sekarang
kita juga ingin supaya camera mengikuti rotasi pemain. Ikuti langkah-
langkah di bawah ini.
1. Edit CameraScript menjadi di bawah ini.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraScript : MonoBehaviour


{
// Deklarasi variabel
GameObject player;
[SerializeField] private Vector3 cameraOffset;

private float speedX = 2f, speedY = 2f, axisX, axisY;


private bool lookAt;
private Space offsetPositionSpace = Space.Self;

// Start is called before the first frame update


void Start()
{
// Pertama carilah objek bernama Player di hirarki
player = GameObject.Find("Player");
}

private void Update()


{
// Rotate Camera dengan mouse
// axisX += speedX * Input.GetAxis("Mouse X");
// axisY -= speedY * Input.GetAxis("Mouse Y");
//
// transform.eulerAngles = new Vector3(axisY,
axisX, 0f);
}

/// <summary>
/// LateUpdate: method yang dipanggil setelah Update
/// Method yang cocok untuk kamera
/// </summary>
private void LateUpdate()
{
if (player == null)
{
Debug.LogWarning("Player tidak ada");
return;
}

// Kamera mengikuti player


// Posisi camera saat ini = posisi awal + posisi
Player
if (offsetPositionSpace == Space.Self)
{
transform.position =
player.transform.TransformPoint(cameraOffset);
}
else
{
transform.position = cameraOffset +
player.transform.position;
}

// Rotate camera
if (lookAt)
{
transform.LookAt(player.transform);
}
else
{
transform.rotation = player.transform.rotation;
}
}
}
2. Save scriptnya dan kembali ke Unity dan mainkan

D. Rotate Camera dengan Mouse


Setelah mengikuti pemain, selanjutnya kita akan memutar camera dengan
mouse. Ikuti langkah-langkah di bawah.
1. Lanjutkan CameraScript di atas dan edit seperti ini.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraScript : MonoBehaviour


{
// Deklarasi variabel
GameObject player;
[SerializeField] Vector3 cameraOffset;

private float speedX = 2f, speedY = 2f, axisX, axisY;

// Start is called before the first frame update


void Start()
{
// Pertama carilah objek bernama Player di hirarki
player = GameObject.Find("Player");
}

private void Update()


{
// Rotate Camera
axisX += speedX * Input.GetAxis("Mouse X");
axisY -= speedY * Input.GetAxis("Mouse Y");

transform.eulerAngles = new Vector3(axisY, axisX,


0f);
}

/// <summary>
/// LateUpdate: method yang dipanggil setelah Update
/// Method yang cocok untuk kamera
/// </summary>
private void LateUpdate()
{
// Kamera mengikuti player
// Posisi camera saat ini = posisi awal + posisi
Player
transform.position = cameraOffset +
player.transform.position;
}
}
2. Jangan lupa save scriptnya. Play scenenya untuk melihat hasilnya dan
gerakkanlah mouse kalian.
Penjelasan Kode

private float speedX = 2f, speedY = 2f, axisX, axisY;


Kode di atas merupakan deklarasi variabel untuk rotasi kamera. speedX
dan speedY merupakan kecepatan rotasi.

private void Update()


{
// Rotate Camera
axisX += speedX * Input.GetAxis("Mouse X");
axisY -= speedY * Input.GetAxis("Mouse Y");

transform.eulerAngles = new Vector3(axisY, axisX, 0f);


}
Kita menggunakan method Update bukan LateUpdate dikarenakan ada
Input yang diinginkan yaitu Mouse X dan Mouse Y.

axisX += speedX * Input.GetAxis("Mouse X");


axisY -= speedY * Input.GetAxis("Mouse Y");
Lalu kode di atas merupakan nilai dari sumbu X dan sumbu Y yang akan
digunakan untuk disimpan di rotation nanti. Ingat bahwa tanda plus dan
minus di situ merupakan arah.

transform.eulerAngles = new Vector3(axisY, axisX, 0f);


Selanjutnya adalah ini. Kode di atas bertugas untuk mendapatkan
eulerAngles dari camera dan memasukkan hasil putarannya ke
eulerAngles.

E. Move Camera dengan Mouse


Selanjutnya adalah bagian memindahkan kamera dengan Mouse.
Sebenarnya bagian ini adalah opsional saja karena saya jarang melihat ada
game yang mengimplementasikan hal ini. Tetapi kita akan mempelajarinya
hanya untuk menambah pengetahuan saja. Ikuti langkah-langkah di
bawah.
1. Pertama buatlah scene baru dengan nama SceneTwo. Karena saya tidak
ingin merusak SceneOne, jadi buatlah scene baru.
2. Lalu buatlah banyak cube dengan sembarangan. Cube ini gunanya
untuk melihat apakah camera benar-benar bergerak atau tidak.
3. Buatlah script baru dengan nama MoveCameraWithMouseScript. Lalu
drag and drop script tersebut ke main camera.
4. Bukalah script tersebut dan edit seperti ini.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMoveWithMouseScript : MonoBehaviour


{
private float speed = 10f, axisX, axisY;

// Update is called once per frame


void Update()
{
axisX = Input.GetAxis("Mouse X");
axisY = Input.GetAxis("Mouse Y");

transform.position += new Vector3(axisX *


Time.deltaTime * speed, 0, axisY * Time.deltaTime *
speed);
}
}
5. Jangan lupa save scriptnya dan kalian bisa lihat hasilnya dengan play
scenenya dan menggerakkan mouse kalian.
Penjelasan Kode
Jika kalian perhatikan baik-baik, cara menggerakkan camera ini sama
dengan menggerakkan player level beginner, yaitu menggunakan
position.

private float speed = 10f, axisX, axisY;


Pertama kita deklarasi variabelnya dulu untuk kecepatan kamera, dan
sumbu X dan Y.

axisX = Input.GetAxis("Mouse X");


axisY = Input.GetAxis("Mouse Y");
Selanjutnya inisiasikan sumbu X dengan mouse sumbu X dan begitu
juga sumbu Y.

transform.position += new Vector3(axisX *


Time.deltaTime * speed, 0, axisY * Time.deltaTime * speed);
Untuk mengubah positionnya diperlukan transform.position
ditambah dengan input Mouse X dan Mouse Y yang dikalikan deltaTime
dan speed.

F. Scene Management
Selanjutnya adalah kita akan mempelajari cara mengganti scene yaitu
SceneOne dan SceneTwo. Ikuti langkah-langkah di bawah agar paham
1. Pertama buat script bernama SceneOneScript dan SceneTwoScript.
Yang nantinya akan digunakan untuk menghubungkan kedua scene
kita. Lalu drag and drop SceneOneScript ke objeck Scripts pada
SceneOne. Dan SceneTwoScript di salah satu Cube di SceneTwo.
2. Edit script SceneOneScript menjadi seperti ini.

sing UnityEngine;
using UnityEngine.SceneManagement;

public class SceneOneScript : MonoBehaviour


{
// Update is called once per frame
void Update()
{
// Jika mouse diklik
if (Input.GetMouseButtonDown(0))
{
// Ganti menjadi SceneTwo
SceneManager.LoadScene("SceneTwo");
}
}
}
3. Save sciptnya dan lanjut edit SceneTwoScript menjadi seperti ini.

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneTwoScript : MonoBehaviour


{
// Update is called once per frame
void Update()
{
// Jika mouse diklik
if (Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene("SceneOne");
}
}
}
4. Save scriptnya dan selanjutnya kembali ke Unity > klik File > Build
Settings > Tekan Add Open Scene untuk menambahkan SceneOne. Lalu
lakukan hal yang sama tapi harus masuk di SceneTwo terlebih dahulu.
Hasilnya akan menjadi seperti ini.
5. Selanjutnya tekan Play dan lihat hasilnya jika kalian klik Game kalian.
Penjelasan Kode

using UnityEngine.SceneManagement;
UnityEngine.SceneManagement merupakan library untuk
SceneManager maka diperlukan deklarasi library untuk mengakses
SceneManager.

if (Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene("SceneOne");
}
Jika mouse diklik Scene akan berpindah sesuai nama scene yang
diperlukan. Input.GetMouseButtonDown(0) merupakan kondisinya. 0
merupakan klik bagian kiri. Sedangkan 1 merupakan klik bagian kanan.
Sekian tentang berpindah-pindah scene. Ini akan sangat berguna jika
kalian membikin game.

G. Audio
Selanjutnya adalah penjelasan lebih lanjut tentang Audio. Kita akan
mencoba membuat 3D Audio, audio yang hanya didengar pada jarak
tertentu, dan juga bagaimana cara mempertahankan Audio pada saat
Scene berpindah.

1. 3D Audio

Agar lebih realistis, kita akan membuat air yang suara airnya hanya bisa
kedengaran pada jarak tertentu saja. Ikuti langkah-langkah di bawah ini.
a. Pertama untuk mendapatkan air di Unity. Kita akan memakai
Standard Assets yang disediakan Unity sendiri. Tetapi harus
didownload terlebih dahulu. Pergi ke Unity Asset Store dan cari
Standard Assets. (Filenya akan dibagikan jika kuota tidak cukup)

b. Jika kalian sudah mendownloadnya kalian bisa Import semua


standard assets-nya walaupun tidak semua akan kita gunakan.
c. Jika sudah meng-import semuanya, selanjutnya kita akan
menambahkan airnya. Kalian bisa mendapatkan airnya di folder
Standard Assets > Environment > Water > Water > Prefabs. Hasilnya
akan seperti di bawah. Agak sedikit berbeda karena saya mengubah
water modenya.
d. Kemudian download-lah audionya (Sea sound by blimp66) di
bit.ly/assetci. Kemudian import ke project kalian. Dan masukkan di
folder audios.
e. Lalu buat empty game object bernama WaterAudio. Lalu drag and
drop audio yang sudah di download tadi ke game object Audio. Atur
posisinya ke tengah-tengah air.

f. Centang Loop pada Inspector agar suara bisa berulang-ulang


dimainkan. Lalu Ubah Spatial Blend yang ada di Inspector menjadi
3D.
g. Buka 3D Sound Settings dan ubah Volume Rolloff menjadi Linear
Rolloff. Dengan begitu kalian bisa mengatur jarak minimal dan
maksimal audio bisa terdengar. Set jarak minimalnya 1 dan jarak
maksimalnya 30.

h. Silakan Play untuk mendengar audionya.


2. Mempertahankan Audio pada berbagai Scene.

Selanjutnya adalah kita akan memainkan audio, tetapi audio itu akan
tetap berlanjut walaupun kita sudah berpindah scene. Ikuti langkah-
langkah di bawah.
a. Buatlah empty game object dan beri nama BgSound. Drag and drop
audio JP Soundworks - Chill Time ke BgSound.
b. Lalu buat Script bernama BgSoundScript. Drag and drop script ini ke
object BgSound.
c. Edit scriptnya menjadi seperti di bawah ini.

using UnityEngine;

public class BgSoundScript : MonoBehaviour


{
// Deklarasi variabel
private void Awake()
{
DontDestroyOnLoad(gameObject);
}
}
d. Selanjutnya save scriptnya. Dan mainkan, cobalah untuk berpindah
ke SceneTwo dengan klik kiri. Lalu berpindah kembali ke SceneOne.
Tentunya anda mendengar lagu yang sama tetapi di play 2 kali.
Berarti ini merupakan bug dan tidak sesuai ekspektasi kita.
e. Mari kita fix bug ini dengan edit scriptnya lagi menjadi seperti di
bawah.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BgSoundScript : MonoBehaviour


{
// Deklarasi variabel
private static BgSoundScript instance;

private void Awake()


{
// Jika instance-nya ada
if (instance != null)
Destroy(gameObject); // Destroy gameObject
yang dibuat
else
instance = this; // instance = BgSound

// Don't Destroy the audio ketika pindah scene


DontDestroyOnLoad(gameObject);
}
}
f. Save scriptnya dan mainkan. Anda tidak akan menemukan bugnya
lagi.
Penjelasan Kode

DontDestroyOnLoad(gameObject);
Fungsi DontDestroyOnLoad(gameObject) merupakan fungsi yang tidak
akan menghancurkan game object jika berpindah scene.

private static BgSoundScript instance;


Lalu pendeklarasian ini bertujuan untuk mengetahui diri sendiri.

if (instance != null)
Destroy(gameObject); // Destroy gameObject yang dibuat
else
instance = this; // instance = BgSound
Instance yang tadi dideklarasikan berguna di sini. Logikanya sederhana
saja jika saat berpindah scene dari SceneOne ke SceneTwo, dan pada
saat berpindah kembali ke SceneOne hancurkan atau destroy Audio
yang diciptakan karena sudah ada atau sedang dimainkan sekarang.

Awal dimulai game, instance adalah null. Kemudian instance masuk ke


bagian else yang artinya instance adalah BgSound (Object). Lalu Object
BgSound tidak akan dihancurkan ketika berpindah scene.
Lalu ketika berpindah kembali ke SceneOne, instance sudah tidak null
karena instance memiliki nilai BgSound. Lalu dia masuk ke bagian if
untuk menghancurkan gameObject baru yang terbuat untuk
mencegah 2 audio yang terdengar.

H. Save dan Load Data dengan PlayerPrefs()


Kali ini kita akan mencoba yang namanya save ataupun load data yang
terdapat pada game kalian. Biasanya ini diimplementasikan untuk
menyimpan skor tertinggi atau semacamnya pada game. Ikuti langkah-
langkah di bawah agar mengerti.
1. Buka SceneOneScript dan SceneTwoScript. Lalu edit menjadi seperti di
bawah ini.
SceneOneScript.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneOneScript : MonoBehaviour


{
// Start is called before the first frame update
void Start()
{
PlayerPrefs.SetString("Name", "Coder Institute");
}

// Update is called once per frame


void Update()
{
// Jika mouse diklik
if (Input.GetMouseButtonDown(0))
{
// Ganti menjadi SceneTwo
SceneManager.LoadScene("SceneTwo");
}
}
}

SceneTwoScript.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneTwoScript : MonoBehaviour


{
// Start is called before the first frame update
void Start()
{
Debug.Log(PlayerPrefs.GetString("Name"));
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene("SceneOne");
}
}
}

2. Jangan lupa save dan kembali ke Unitynya. Selanjutnya play dan cobalah
berpindah ke SceneTwo dan perhatikan consolenya. Akan ada tertulis
“Coder Institute” pada console.

Penjelasan Kode

PlayerPrefs.SetString("Name", "Coder Institute");


PlayerPrefs mempunyai fungsi untuk menyimpan (save) dan
mengambil (load) yaitu setter dan getter.

PlayerPrefs.SetString("nama_key", "nama_value");

Untuk Setter sendiri, diekspektasikan mendapatkan 2 parameter yaitu


nama_key dan nama_value. Sedangkan untuk getternya sendiri, hanya
membutuhkan 1 parameter saja, yaitu nama_key.

PlayerPrefs.GetString("Name")
Untuk mendapatkan value yang kita sudah simpan kita harus
memasukkan key yang sama, yang artinya penamaan nama_key adalah
case sensitive.
Unity Tips

Pernahkah kalian tahu apa kegunaan tanda tanya pada component


object atau gambar buku pada Unity versi lama? Kegunaannya itu adalah
untuk melihat dokumentasi dari component tersebut. Jadi jika kalian
ingin melihat dokumentasi dari komponen kalian bisa mengklik icon
tersebut dan akan diarahkan ke websitenya.

Gamification Series!!!

Bahkan lembaga pertahanan seperti US Army pun memanfaatkan


gamification loh! US Army menggunakan beberapa game yang dibuat
dengan sangat baik kemudian diluncurkan untuk umum untuk menarik
orang-orang untuk bergabung menjadi angkatan bersenjata AS. Salah
satu gamenya adalah America's Army. Tujuan dari permainan ini adalah
agar anak muda di Amerika mengeksplorasi dan belajar mengenai
tentara dan untuk mengetahui bagaimana menjadi seorang prajurit
yang sesuai dengan kebutuhan, minat, dan kemampuan mereka.

Source :
https://potion.social/en/blog/10-amazingly-successful-examples-of-
gamification/
https://gamificationdoesitwork.wordpress.com/2017/04/19/americas-
army/

Anda mungkin juga menyukai