BAB IV PEMBUATAN & PEMBAHASAN GAMErepository.unika.ac.id/16191/5/13.07.0003 Pieter Santoso...Sebelum...
Transcript of BAB IV PEMBUATAN & PEMBAHASAN GAMErepository.unika.ac.id/16191/5/13.07.0003 Pieter Santoso...Sebelum...
24
BAB IV
PEMBUATAN & PEMBAHASAN GAME
4.1 Pembuatan Konsep Game
Pembuatan game diawali dengan perencanaan konsep dasar game serta
melakukan pencarian referensi dari konsep game serupa di Google Play Store.
Game tersebut dibuat dengan menggunakan platform Android. Referensi game lalu
dikaji sehingga game yang dibuat dapat memiliki ciri khasnya tersendiri dibanding
referensi game pembanding. Adapun referensi game pembanding adalah sebagai
berikut :
a.) Pemburu Koruptor
Gambar 4.1 Pemburu Koruptor Gameplay
(Sumber : http://www.gadgetgaul.com/wp-content/uploads/2014/09/SS71.jpg )
Pesan melawan korupsi terlihat pada saat player menyerang koruptor
dengan melemparkan kepala kucing seperti pada game Angry Bird. Game ini
menunjukan bahwa perlu adanya musuh yang jelas di dalam game untuk melawan
perilaku korupsi. Pada game ini musuh tersebut adalah koruptor yang melarikan
25
diri dari penjara dan konsep melawan musuh ini diambil sebagai referensi dalam
penyusunan konsep game.
b.) Tap Koruptor
Gambar 4.2 Tap Koruptor Gameplay
(Sumber : http://img.duniaku.net/wp-content/uploads/2016/09/duniaku-
tapkoruptor-2.jpg )
Game bernama Tap Koruptor ini memberikan pesan melawan korupsi
dengan sangat jelas. Konsep dari game Tap Koruptor ini menunjukan bahwa pelaku
korupsi digambarkan sebagai sosok yang buruk, musuh masyarakat. Penggambaran
26
tokoh koruptor yang buruk tersebut diambil sebagai referensi dalam penyusunan
konsep game.
c.) Fate Grand Order (FGO)
Gambar 4.3 Fate Grand Order (FGO)
(Sumber :https://assets.rpgsite.net/images/images/000/055/586/original/fgo_axpre
sskit_%2812%29.jpg )
Fate Grand Order merupakan game seri Fate yang terbit pada tahun 2015.
Fate Grand Order diluncurkan pertama kali dalam versi bahasa Jepang dan pada
tahun 2017 Fate Gand Order diluncurkan dalam versi bahasa Inggris. Game ini
memiliki unsur Visual Novel (VN) dimana pembawaan cerita game yang
menggunakan tokoh-tokoh terkenal dalam sejarah dapat menonjolkan karakter dari
masing-masing tokoh seiring dengan perkembangan cerita. Game ini memiliki
pengajaran sejarah yang mudah diingat karena sejarah dari masing-masing karakter
memiliki andil dalam cerita game. Penggunaan Visual Novel untuk penyampaian
pesan diambil sebagai referensi dalam penyusunan konsep game.
27
d.) TableZombies AR
Gambar 4.4 TableZombies AR Gameplay
(Sumber : https://play.google.com/store/apps/details?id=com.srg.tzcards )
TableZombies AR ini memiliki Gameplay yang mudah dipahami. Player
hanya perlu menembak setiap zombie yang muncul di layar. Desain game dari
TableZombies AR ini diambil sebagai referensi dalam penyusunan konsep dasar
game.
Setelah membandingkan dan mempelajari game-game referensi, game yang
dibuat tersebut merupakan game edukasi dengan genre Augmented Reality. Adapun
pesan yang akan disampaikan kepada pemain adalah tentang hubungan korupsi dan
karakter mahasiswa, pesan untuk tidak menunda-nunda pekerjaan, pesan tidak
memberi contekan, serta pesan untuk tidak bertidak pasif dalam kerja kelompok.
4.2 Pembuatan Asset Game
Sebelum pembuatan game dimulai, dilakukan pembuatan asset sesuai
dengan konsep game yang telah dibuat. Asset tersebut berupa gambar (karakter,
background, animasi, icon) dan beberapa asset 3D yang diambil dari
assetstore.unity3d.com. Pengerjaan game akan menggunakan Unity sebagai game
28
engine karena adanya plugin seperti Vuforia yang mempermudah pengerjaan
pembuatan serta memiliki kinerja yang stabil untuk game bergenre Augmented
Reality.
Pembuatan game dimulai dengan menentukan judul game. Setelah
mempertimbangkan konsep dan tujuan game, judul game tersebut adalah Mental of
Corrupt.
Gambar 4.5 Mental of Corrupt
Adapun gambar icon dan button yang telah dibuat :
Tabel 4.1 Icon, Splash Screen, dan Tombol
Obyek 2D Keterangan
Icon Game
Splash Screen
Splash Screen
29
Splash Screen
Menu Button
Icon Loading
Back Button
Adapun gambar bakground adalah sebagai berikut :
Tabel 4.2 Background
Obyek 2D Keterangan
Pintu Masuk / Lobi
Laboraorium
30
Ruangan Prof. Julius
Laboratorium
Adapun karakter yang telah dibuat :
Tabel 4.3 Karakter
Obyek 2D Keterangan
Player
31
Prof. Julius
Adi
(Pemilik permasalahan menunda pekerjaan)
Beta
(Pemilik permasalahan memberi contekan)
Charlie
(Pemilik permasalahan tidak bekerja dalam
kerja kelompok)
32
Researcher
(Asisten Prof. Julius)
Adapun asset 3D yang digunakan adalah sebagai berikut[21][22][23]:
Tabel 4.4 Aset Obyek 3D
Obyek 3D Keterangan
Perwujudan kebiasaan buruk :
menunda-nunda pekerjaan
Perwujudan kebiasaan buruk :
Memberi Contekan
33
Perwujudan kebiasaan buruk :
tidak bekerja dalam kerja
kelompok
Assets tersebut lalu dikumpulkan dalam satu folder Assets yang terdapat di
folder project Unity.
Gambar 4.6 Assets Folder
4.3 Pembuatan Game
4.3.1 Pembuatan Menu Utama
Pembuatan game dimulai dengan pembuatan menu utama. Menu utama ini
berguna untuk mengakses Button Start, Button Credit, dan Button Exit. Button Start
berguna untuk mengakses Game Stage. Button Credit berguna untuk mengakses
34
Scene berisi ucapan terima kasih kepada pihak-pihak yang telah membantu serta
ikut dalam pembuatan game. Button Exit berguna untuk menutup aplikasi game.
Pembuatan game menggunakan Unity Engine 5.6.1f1. Menu utama dibuat
pada scene dengan nama CS. Pada scene CS kolom Hierarchy, obyek Canvas dibuat
dan di dalam Canvas tersebut berisi Button, Text, dan Image. Button, Text, dan
Image tersebut lalu diposisikan sesuai dengan kebutuhan dan tujuan.
Gambar 4.7 Menu Utama Hierarchy
Adapun script yang digunakan adalah sebagai berikut :
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
35
public void taptap()
{
title.SetBool("hidden2", true);
tap.SetActive(false);
start.SetActive(true);
credit.SetActive(true);
exit.SetActive(true);
}
public void OpenSettings()
{
startButton.SetBool("hidden", false);
creditButton.SetBool("hidden", false);
exitButton.SetBool("hidden", false);
title.SetBool("hidden", true);
if (startButton.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1 && !startButt
on.IsInTransition(0)){
Story_chapter.SetActive(true);
prologue.SetActive(true);
chone.SetActive(true);
chtwo.SetActive(true);
chthree.SetActive(true);
}
if (title.GetCurrentAnimatorStateInfo(0).normalizedTime > 1 && !title.IsInTransitio
n(0)){
back.SetActive(true);
}
}
public void backButton()
{
title.SetBool("hidden", false);
startButton.SetBool("hidden", true);
creditButton.SetBool("hidden", true);
exitButton.SetBool("hidden", true);
Story_chapter.SetActive(false);
prologue.SetActive(false);
chone.SetActive(false);
chtwo.SetActive(false);
chthree.SetActive(false);
back.SetActive(false);
title.SetBool("hidden2", true);
tap.SetActive(false);
start.SetActive(true);
credit.SetActive(true);
exit.SetActive(true);
}
public void loadzero() {
SceneManager.LoadScene(1);
36
}
public void loadlvone() {
SceneManager.LoadScene(7);
}
public void loadlvtwo() {
SceneManager.LoadScene(11);
}
public void loadlvthree() {
SceneManager.LoadScene(15);
}
public void loadcredit() {
SceneManager.LoadScene(17);
}
public void excit() {
Application.Quit();
}
}
Gambar 4.8 Listing Program MainMenu
Fungsi taptap() berguna untuk memulai permainan dari Touch Screen.
Fungsi Opensettings() berguna untuk peralihan dari Button Start yang ditekan
pemain ke pemilihan stage. Fungsi backButton() berguna untuk peralihan dari
pemilihan stage ke menu utama yang berisikan Button Start, Button Credit, dan
Button Exit. Fungsi loadzero() berguna untuk berpindah ke scene 1 yang merupakan
Level : Prologue. Fungsi loadlvone() berguna untuk berpindah ke scene 7 yang
merupakan Level : Chapter 1. Fungsi loadlvtwo() berguna untuk berpindah ke scene
11 yang merupakan Level : Chapter 2. Fungsi loadlvthree() berguna untuk
berpindah ke scene 15 yang merupakan Level : Chapter 3. Fungsi loadcredit()
berguna untuk berpindah ke scene 17 yang merupakan scene Credit. Fungsi Excit()
berguna untuk keluar atau menutup aplikasi game.
37
Gambar 4.9 Tampilan Menu Utama
Gambar 4.10 Tampilan Menu Utama Button Start
38
Gambar 4.11 Tampilan Menu Utama Button Credit
4.3.2 Pembuatan Level : Prologue
Pembuatan Level : Prologue terbagi menjadi 2 scene. Scene pertama
berfungsi untuk menyampaikan pesan melawan kebiasaan buruk mahasiswa dalam
pendidikan anti korupsi. Scene pertama memiliki genre visual novel. Scene kedua
merupakan Augmented Reality melawan musuh yaitu perwujudan kebiasaan
menunda pekerjaan.
Gambar 4.12 Scene #1 Penyampaian Pesan
39
Adapun Script prologue.cs yang digunakan pada scene pertama adalah
sebagai berikut:
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
switch (a) {
case 1 :
dialogue.text ="Jadi ini... ";
fscreen.SetActive(false);
break;
case 2 :
mc01.SetActive(false);
professora1.SetActive(true);
...
}
public void textchange() {
if(a!=5 && a!=8 && a!=10 && a!=19 && a!=25 && a!=54 && a!=37) {
a=a+1;
} else {a=a+2;}
}
public void btnchoice1() {
a=a+1;
}
public void btnchoice2() {
a=a+2;
}
}
Gambar 4.13 Listing Program Prologue
Fungsi Update() berguna untuk mengganti Image karakter serta Text seiring
perkembangan cerita yang menyampaikan pesan. Fungsi textchange() berguna
untuk menambah variabel int a yang berhubungan dengan fungsi Update(). Fungsi
btnchoice1() berguna untuk menamah variabel int a ketika pemain memilih
jawaban. Fungsi btnchoice2() memiliki guna yang sama dengan fungsi
btnchoice1(). Int a sendiri berguna untuk mengganti perintah swicth-case sesuai
dengan perubahan int a.
40
Gambar 4.14 Scene #2 Game Augmented Reality
Pada Scene kedua, hal pertama yang perlu dilakukan adalah mengimpor
Vuforia Package. Pilih Assets -> import package -> custom package, lalu pilih
Vuforia Package yang telah diunduh. Hapus obyek Camera pada kolom Hierarchy,
lalu pada kolom project -> Assets -> Vuforia -> Prefabs -> ARCamera. Drag
ARCamera kekolom Hierarchy.
Pada obyek ARCamera , lihatlah kolom Inspector dan masukan Vuforia
Licence Key. Vuforia Licence Key dapat ditemukan saat membuat project di
Vuforia’s developer portal. Ubah World Center Mode menjadi Device_tracking
sehingga Smart Phone Android nantinya dapat melakukan track pada obyek yang
tampil di layar.
41
Gambar 4.15 Pengaturan Vuforia ARCamera
Obyek ARCamera harus memiliki Position x, y, z bernilai 0 sebab posisi 0
itu berarti terletak tepat dikamera Smart Phone. Pada kolom Hierarchy dibuat
obyek 3D Cube. Adapun kode programan menggunakan bahasa C#
(SpawnScript.cs) yang berguna untuk melakukan Spawn Cube atau membuat Cube
bermunculan dalam waktu berkala dan batas tertentu :
// Use this for initialization
void Start () {
// Initializing spawning loop
StartCoroutine( SpawnLoop() );
// Initialize Cubes array according to
// the desired quantity
mCubes = new GameObject[ mTotalCubes ];
}
// Update is called once per frame
void Update () {
}
// Define the position if the object
// according to ARCamera position
42
private bool SetPosition() {
// get the camera position
Transform cam = Camera.main.transform;
// set the position 10 units forward from the camera position
transform.position = cam.forward * 10;
return true;
}
// We'll use a Coroutine to give a little
// delay before setting the position
private IEnumerator ChangePosition() {
yield return new WaitForSeconds(0.2f);
// Define the Spawn position only once
if ( !mPositionSet ){
// change the position only if Vuforia is active
if ( VuforiaBehaviour.Instance.enabled )
SetPosition();
}
}
// Loop Spawning cube elements
private IEnumerator SpawnLoop()
{
// Defining the Spawning Position
StartCoroutine( ChangePosition() );
yield return new WaitForSeconds(0.2f);
// Spawning the elements
int i = 0;
while ( i <= (mTotalCubes-1) ) {
mCubes[i] = SpawnElement();
i++;
yield return new WaitForSeconds(Random.Range(mTimeToSpawn, mTimeToSpawn*3));
}
}
// Spawn a cube
private GameObject SpawnElement()
{
// spawn the element on a random position, inside a imaginary sphere
GameObject cube = Instantiate(mCubeObj, (Random.insideUnitSphere*4) + transform.positi
on, transform.rotation ) as GameObject;
// define a random scale for the cube
float scale = Random.Range(0.5f, 1f);
// change the cube scale
cube.transform.localScale = new Vector3( scale, scale, scale );
return cube;
}
}
Gambar 4.16 Listing Program SpawnScript
43
Buat folder baru dengan nama Prefabs. Drag obyek Cube kefolder Prefabs
dan drag obyek Cube yang ada pada folder Prefabs ke M Cube Obj pada kolom
Inspector.
Gambar 4.17 Cube Pada Folder Prefabs
Gambar 4.18 Drag Cube ke M Cube Obj
Buat kode program dengan bahasa C# dan beri nama CubeBehaviorScript.
CubeBehaviorScript ini berguna untuk menentukan HP (Health Point) dari obyek
Cube serta ukuran dan pergerakan Cube. Adapun script CubeBehaviorScript adalah
sebagai berikut :
// Use this for initialization
void Start () {
CubeSettings();
}
// Update is called once per frame
void Update () {
RotateCube();
// scale cube if needed
44
if ( !mIsCubeScaled )
ScaleObj();
}
// Set initial cube settings
private void CubeSettings(){
// defining the anchor point as the main camera
mOrbitAnchor = Camera.main.transform;
// defining the orbit direction
float x = Random.Range(-2f,2f);
float y = Random.Range(-2f,2f);
float z = Random.Range(-2f,2f);
mOrbitDirection = new Vector3( x, y , z );
// defining speed
mOrbitSpeed = Random.Range( 1f, mOrbitMaxSpeed );
// defining scale
float scale = Random.Range(mScaleMin, mScaleMax);
mCubeMaxScale = new Vector3( scale, scale, scale );
// set cube scale to 0, to grow it lates
transform.localScale = Vector3.zero;
// cube colour
GetComponent<Renderer>().material.color = new Color(255, 10, 10);
}
// Makes the cube rotate around a anchor point
// and rotate around its own axis
private void RotateCube(){
// rotate cube around camera
transform.RotateAround(
mOrbitAnchor.position, mOrbitDirection, mOrbitSpeed * Time.deltaTime);
// rotating around its axis
transform.Rotate( mOrbitDirection * 30 * Time.deltaTime);
}
// Scale object from 0 to 1
private void ScaleObj(){
// growing obj
if ( transform.localScale != mCubeMaxScale )
transform.localScale = Vector3.Lerp( transform.localScale, mCubeMaxScale, Time.deltaTi
me * mGrowingSpeed );
else
mIsCubeScaled = true;
}
// Cube got Hit
// return 'false' when cube was destroyed
public bool Hit( int hitDamage ){
mCubeHealth -= hitDamage;
if ( mCubeHealth >= 0 && mIsAlive ) {
StartCoroutine( DestroyCube());
return true;
45
}
return false;
}
// Destroy Cube
private IEnumerator DestroyCube(){
mIsAlive = false;
// Make the cube desappear
GetComponent<Renderer>().enabled = false;
// we'll wait some time before destroying the element
// this is usefull when using some kind of effect
// like a explosion sound effect.
// in that case we could use the sound lenght as waiting time
yield return new WaitForSeconds(1f);
Destroy(gameObject);
}
}
Gambar 4.19 Listing Program CubeBehaviorScript
Pada kolom Hierarchy dibuat empty object dengan nama _PlayerController
dan satu buah empty object lagi didalamnya dengan nama _LaserController. Buat
C# Script dengan nama LaserScript.cs dan drag C# script tersebut keobyek
_LaserController. Adapun kode program LaserScript.cs adalah sebagai berikut :
// Use this for initialization
void Start () {
// getting the Line Renderer
mLaserLine = GetComponent<LineRenderer>();
}
// Update is called once per frame
void Update () {
if ( Input.GetButton("Fire1") && Time.time > mNextFire ){
Fire();
}
}
// Shot the Laser
private void Fire(){
// Get ARCamera Transform
Transform cam = Camera.main.transform;
// Define the time of the next fire
mNextFire = Time.time + mFireRate;
// Set the origin of the RayCast
46
Vector3 rayOrigin = cam.position;
// Set the origin position of the Laser Line
// It will always 10 units down from the ARCamera
// We adopted this logic for simplicity
mLaserLine.SetPosition(0, transform.up * -10f );
// Hold the Hit information
RaycastHit hit;
// Checks if the RayCast hit something
if ( Physics.Raycast( rayOrigin, cam.forward, out hit, mFireRange )){
// Set the end of the Laser Line to the object hit
mLaserLine.SetPosition(1, hit.point );
boom.SetActive(true);
a=a+1;
} else {
// Set the enfo of the laser line to be forward the camera
// using the Laser range
mLaserLine.SetPosition(1, cam.forward * mFireRange );
}
// anterior code supressed for simplicity
// Show the Laser using a Coroutine
StartCoroutine(LaserFx());
// Checks if the RayCast hit something
if ( Physics.Raycast( rayOrigin, cam.forward, out hit, mFireRange )){
// Set the end of the Laser Line to the object hitted
mLaserLine.SetPosition(1, hit.point );
// Get the CubeBehavior script to apply damage to target
CubeBehaviorScript cubeCtr = hit.collider.GetComponent<CubeBehaviorScript>();
if ( cubeCtr != null ) {
if ( hit.rigidbody != null ) {
// apply force to the target
hit.rigidbody.AddForce(-hit.normal*mHitForce);
// apply damage the target
cubeCtr.Hit( mLaserDamage );
}
}
// Get the CubeBehavior script to apply damage to target
pig pigCtr = hit.collider.GetComponent<pig>();
if ( pigCtr != null ) {
if ( hit.rigidbody != null ) {
// apply force to the target
hit.rigidbody.AddForce(-hit.normal*mHitForce);
// apply damage the target
pigCtr.Hit( mLaserDamage );
}
1
47
}
}
}
// Show the Laser Effects
private IEnumerator LaserFx(){
mLaserLine.enabled = true;
if(a==4) {
CanvasTutorial2.SetActive(true);
a=5;
}
// Way for a specific time to remove the LineRenderer
yield return mLaserDuration;
mLaserLine.enabled = false;
yield return new WaitForSeconds(2.0f);
boom.SetActive(false);
}
}
Gambar 4.20 Listing Program LaserScript
Pada lingkaran 1 dijelaskan bahwa ketika obyek _LaserController
bersentuhan dengan obyek pig maka HP dari obyek pig akan berkurang. Pada folder
asset 3D Pigman yang telah diunduh, drag PigmanAnimated ke kolom Hierarchy.
Setelahnya dibuat kode program C# dengan nama pig. Adapun kode program pig.cs
adalah sebagai berikut :
void Start () {
CubeSettings();
orc.SetBool("normal", false);
orc.SetBool("attacks", true);
}
// Update is called once per frame
void Update () {
//tes
if (transform.position.x >= -5 && aone==true) {
transform.Translate(Vector3.right * movementSpeed * Time.deltaTime);
atwo=true;
} else if (transform.position.x <= 5 && atwo==true) {
transform.Translate(Vector3.left * movementSpeed * Time.deltaTime);
aone=false;
} else if (transform.position.x >= 5) {
transform.Translate(Vector3.right * movementSpeed * Time.deltaTime);
aone=true;
48
}
if (transform.position.x <= 5 && transform.position.x >= 2) {
hpbar.SetActive(false);
if(red==true){
myCG.SetActive(true);
} else if (red==false) {myCG.SetActive(false);}
}
if (transform.position.x >= 3) {
red=false;
}
}
private void CubeSettings(){
// get the camera position
Transform cam = Camera.main.transform;
// set the position 10 units forward from the camera position
transform.position = cam.forward * 11;
}
// Cube got Hit
// return 'false' when cube was destroyed
public bool Hit( int hitDamage ){
mCubeHealth -= hitDamage;
ebar.transform.localScale -= new Vector3(1,0,0);
//orc.SetBool("attacks", true);
if ( mCubeHealth <= 0 && mIsAlive ) {
ebar.SetActive(false);
orc.SetBool("death", true);
canvas4.SetActive(true);
StartCoroutine(DestroyCube());
return true;
}
return false;
}
private IEnumerator DestroyCube(){
mIsAlive = false;
// Make the cube desappear
yield return new WaitForSeconds(2.0f);
}
}
Gambar 4.21 Listing Program Pig
Kode program pig.cs tersebut berguna untuk mengatur gerakan obyek 3D
PigmanAnimated , HP , dan pola serangan. Pemain harus menembak musuh dengan
memposisikan musuh tepat di tengah layar. Musuh yang merupakan perwujudan
49
kebiasaan menunda pekerjaan memiliki HP dan pola serangan yang perlu
diwaspadai pemain. Pemain berhasil menyelesaikan game ketika pemain dapat
menghacurkan musuh dengan membuat HP-barnya menjadi nol.
4.3.3 Pembuatan Level : Chapter 1
Pembuatan Level : Chapter 1 terbagi menjadi 2 scene. Scene pertama
berfungsi untuk menyampaikan pesan melawan kebiasaan buruk mahasiswa dalam
pendidikan anti korupsi. Scene pertama memiliki genre visual novel. Scene kedua
merupakan Augmented Reality melawan musuh yaitu perwujudan memberi
contekan.
Gambar 4.22 Scene #1 Penyampaian Pesan
Adapun Script lvone.cs yang digunakan pada scene pertama adalah sebagai
berikut :
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
switch (a) {
case 1 :
name.text = "+ Prof. Julius +";
dialogue.text ="Iyaaah, kau benar-benar menolong kami. ";
fscreen.SetActive(false);
break;
case 2 :
dialogue.text="Aku tak tahu bagaimana kami bisa berterima kasih padamu.";
50
break;
case 3 :
choice1Btn.SetActive(true);
choice2Btn.SetActive(true);
...
}
public void btnchoice1() {
a=a+1;
}
public void btnchoice2() {
a=a+1;
}
public void textchange() {
a=a+1;
}
}
Gambar 4.23 Listing Program Lvone
Tanpa memiliki perbedaan yang significant dengan script prologue.cs,
fungsi Update() berguna untuk mengganti Image karakter serta Text seiring
perkembangan cerita yang menyampaikan pesan. Fungsi textchange() berguna
untuk menambah variabel int a yang berhubungan dengan fungsi Update(). Fungsi
btnchoice1() berguna untuk menamah variabel int a ketika pemain memilih
jawaban. Fungsi btnchoice2() memiliki guna yang sama dengan Fungsi
btnchoice1(). Int a sendiri berguna untuk mengganti perintah swicth-case sesuai
dengan perubahan int a.
Gambar 4.24 Scene #2 Game Augmented Reality
51
Oleh karena Unity telah mengimport Vuforia package pada pembuatan
Level : Prologue maka tidak perlu dilakukan import untuk kedua kalinya.
Pembuatan SpawnScript.cs dan CubeBehaviorScript.cs juga telah dilakukan
sebelumnya sehingga tidak perlu membuat kode pemrogamannya lagi dan dapat
langsung diaplikasikan pada pembuatan Level : Chapter 1 ini. Akan tetapi perlu
dilakukan perubahan terhadap Laserscript.cs karena adanya bug yang ditakutkan
dapat menganggu kinerja game. Adapun kode program Laserscript2.cs adalah
sebagai berikut :
// Use this for initialization
void Start () {
// getting the Line Renderer
mLaserLine = GetComponent<LineRenderer>();
}
// Update is called once per frame
void Update () {
if ( Input.GetButton("Fire1") && Time.time > mNextFire ){
Fire();
}
}
// Shot the Laser
private void Fire(){
// Get ARCamera Transform
Transform cam = Camera.main.transform;
// Define the time of the next fire
mNextFire = Time.time + mFireRate;
// Set the origin of the RayCast
Vector3 rayOrigin = cam.position;
// Set the origin position of the Laser Line
// It will always 10 units down from the ARCamera
// We adopted this logic for simplicity
mLaserLine.SetPosition(0, transform.up * -10f );
// Hold the Hit information
RaycastHit hit;
// Checks if the RayCast hit something
if ( Physics.Raycast( rayOrigin, cam.forward, out hit, mFireRange )){
// Set the end of the Laser Line to the object hit
mLaserLine.SetPosition(1, hit.point );
boom.SetActive(true);
} else {
// Set the enfo of the laser line to be forward the camera
52
// using the Laser range
mLaserLine.SetPosition(1, cam.forward * mFireRange );
}
// Show the Laser using a Coroutine
StartCoroutine(LaserFx());
// Checks if the RayCast hit something
if ( Physics.Raycast( rayOrigin, cam.forward, out hit, mFireRange )){
// Set the end of the Laser Line to the object hitted
mLaserLine.SetPosition(1, hit.point );
// Get the CubeBehavior script to apply damage to target
CubeBehaviorScript cubeCtr = hit.collider.GetComponent<CubeBehaviorScript>();
if ( cubeCtr != null ) {
if ( hit.rigidbody != null ) {
// apply force to the target
hit.rigidbody.AddForce(-hit.normal*mHitForce);
// apply damage the target
cubeCtr.Hit( mLaserDamage );
}
}
//get the sphere shield damage
shield shieldCtr = hit.collider.GetComponent<shield>();
if ( shieldCtr != null ) {
if ( hit.rigidbody != null ) {
// apply force to the target
hit.rigidbody.AddForce(-hit.normal*mHitForce);
// apply damage the target
shieldCtr.Hit( mLaserDamage );
}
}
//get the knight damage
knight knightCtr = hit.collider.GetComponent<knight>();
if ( knightCtr != null ) {
if ( hit.rigidbody != null ) {
// apply force to the target
hit.rigidbody.AddForce(-hit.normal*mHitForce);
// apply damage the target
knightCtr.Hit( mLaserDamage );
}
}
}
}
}
// Show the Laser Effects
private IEnumerator LaserFx(){
mLaserLine.enabled = true;
// Way for a specific time to remove the LineRenderer
yield return mLaserDuration;
mLaserLine.enabled = false;
yield return new WaitForSeconds(2.0f);
1
2
53
boom.SetActive(false);
}
}
Gambar 4.25 Listing Program LaserScript2
Perbedaan Laserscript2.cs dengan Laserscript.cs terlihat pada lingkaran1
dan lingkaran2 yaitu saat laser bersentuhan dengan obyek knight dan shield. Pada
folder asset 3D ToonRTS_demo_Knight yang telah diunduh, drag
ToonRTS_demo_Knight ke kolom Hierarchy. Setelahnya dibuat kode program C#
dengan nama knight.cs. Adapun kode program knight adalah sebagai berikut:
// Use this for initialization
void Start () {
CubeSettings();
}
// Update is called once per frame
void Update () {
if (transform.position.x <= 4 && aone==true) {
transform.Translate(Vector3.left * movementSpeed * Time.deltaTime);
transform.Translate(Vector3.down * movementSpeed * Time.deltaTime);
atwo=true;
}
else if (transform.position.x >= -3 && atwo==true ) {
transform.Translate(Vector3.right * movementSpeed * Time.deltaTime);
aone=false;
}
else if (transform.position.x >= -4 && transform.position.y <= 2) {
transform.Translate(Vector3.left * movementSpeed * Time.deltaTime);
transform.Translate(Vector3.up * movementSpeed * Time.deltaTime);
atwo=false;
} else if (transform.position.x >= -4 && transform.position.y >= 2) {
transform.Translate(Vector3.right * movementSpeed * Time.deltaTime);
aone=true;
}
if (transform.position.x >= 5) {
atwo=true;
}
}
private void CubeSettings(){
// defining the anchor point as the main camera
//mOrbitAnchor = Camera.main.transform;
// get the camera position
Transform cam = Camera.main.transform;
54
// set the position 10 units forward from the camera position
transform.position = cam.forward * 11;
}
// Cube got Hit
// return 'false' when cube was destroyed
public bool Hit( int hitDamage ){
mCubeHealth -= hitDamage;
ebar.transform.localScale -= new Vector3(1,0,0);
//orc.SetBool("attacks", true);
if ( mCubeHealth <= 0 && mIsAlive ) {
ebar.SetActive(false);
//orc.SetBool("death", true);
canvas4.SetActive(true);
StartCoroutine(DestroyCube());
return true;
}
return false;
}
// Destroy Cube
private IEnumerator DestroyCube(){
mIsAlive = false;
// Make the cube desappear yield return new WaitForSeconds(1.0f);
Destroy(gameObject);
}
}
Gambar 4.26 Listing Program Knight
Kode program knight.cs tersebut berguna untuk mengatur gerakan obyek
3D ToonRTS_demo_Knight, HP , dan pola serangan. Pemain harus menembak
musuh dengan memposisikan musuh tepat di tengah layar. Musuh yang merupakan
perwujudan memberi contekan memiliki HP dan pola serangan yang perlu
diwaspadai pemain. Pemain berhasil menyelesaikan game ketika pemain dapat
menghacurkan musuh dengan membuat HP-barnya menjadi nol.
4.3.4 Pembuatan Level : Chapter 2
Pembuatan Level : Chapter 1 terbagi menjadi 2 scene. Scene pertama
berfungsi untuk menyampaikan pesan melawan kebiasaan buruk mahasiswa dalam
pendidikan anti korupsi. Scene pertama memiliki genre visual novel. Scene kedua
merupakan Augmented Reality melawan musuh yaitu perwujudan memberi
contekan.
55
Gambar 4.27 Scene #1 Penyampaian Pesan
Adapun Script lvtwo.cs yang digunakan pada scene pertama adalah sebagai
berikut :
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
switch (a) {
case 1 :
name.text = "+ Prof. Julius +";
dialogue.text ="Untung pada akhirnya kita bisa memotivasi Beta. Haha...";
fscreen.SetActive(false);
break;
case 2 :
dialogue.text="Sepertinya, kita berdua bisa menjadi tim yang hebat.";
break;
case 3 :
choice1Btn.SetActive(true);
choice2Btn.SetActive(true);
dialgueBtn.SetActive(false);
...
}
public void btnchoice1() {
a=a+1;
}
public void btnchoice2() {
56
a=a+1;
}
public void textchange() {
a=a+1;
}
}
Gambar 4.28 Listing Program Lvtwo
Gambar 4.29 Scene #2 Game Augmented Reality
Oleh karena Unity telah mengimpor Vuforia package pada pembuatan
Level: Prologue maka tidak perlu dilakukan import untuk kedua kalinya.
Pembuatan SpawnScript.cs dan CubeBehaviorScript.cs juga telah dilakukan
sebelumnya sehingga tidak perlu membuat kode pemrogamannya lagi dan dapat
langsung diaplikasikan pada pembuatan Level: Chapter 2 ini. Adapun kode
program Laserscript3.cs adalah sebagai berikut:
void Start () {
// getting the Line Renderer
mLaserLine = GetComponent<LineRenderer>();
}
// Update is called once per frame
void Update () {
if ( Input.GetButton("Fire1") && Time.time > mNextFire ){
Fire();
}
}
57
// Shot the Laser
private void Fire(){
// Get ARCamera Transform
Transform cam = Camera.main.transform;
// Define the time of the next fire
mNextFire = Time.time + mFireRate;
// Set the origin of the RayCast
Vector3 rayOrigin = cam.position;
// Set the origin position of the Laser Line
// It will always 10 units down from the ARCamera
// We adopted this logic for simplicity
mLaserLine.SetPosition(0, transform.up * -10f );
// Hold the Hit information
RaycastHit hit;
// Checks if the RayCast hit something
if ( Physics.Raycast( rayOrigin, cam.forward, out hit, mFireRange )){
// Set the end of the Laser Line to the object hit
mLaserLine.SetPosition(1, hit.point );
boom.SetActive(true);
} else {
// Set the enfo of the laser line to be forward the camera
// using the Laser range
mLaserLine.SetPosition(1, cam.forward * mFireRange );
}
// anterior code supressed for simplicity
// Show the Laser using a Coroutine
StartCoroutine(LaserFx());
// Checks if the RayCast hit something
if ( Physics.Raycast( rayOrigin, cam.forward, out hit, mFireRange )){
// Set the end of the Laser Line to the object hitted
mLaserLine.SetPosition(1, hit.point );
// Get the CubeBehavior script to apply damage to target
CubeBehaviorScript cubeCtr = hit.collider.GetComponent<CubeBehaviorScript>();
if ( cubeCtr != null ) {
if ( hit.rigidbody != null ) {
// apply force to the target
hit.rigidbody.AddForce(-hit.normal*mHitForce);
// apply damage the target
cubeCtr.Hit( mLaserDamage );
}
}
//get the rhino1 damage
58
rhino1 rhino1Ctr = hit.collider.GetComponent<rhino1>();
if ( rhino1Ctr != null ) {
if ( hit.rigidbody != null ) {
// apply force to the target
hit.rigidbody.AddForce(-hit.normal*mHitForce);
// apply damage the target
rhino1Ctr.Hit( mLaserDamage );
}
}
}
}
// Show the Laser Effects
private IEnumerator LaserFx(){
mLaserLine.enabled = true;
// Way for a specific time to remove the LineRenderer
yield return mLaserDuration;
mLaserLine.enabled = false;
yield return new WaitForSeconds(2.0f);
boom.SetActive(false);
}
}
Gambar 4.30 Listing Program LaserScript3
Pada lingkaran3 terlihat perbedaan antara kode program Laserscript.cs dan
Laserscript2.cs yang telah dibuat sebelumnya. Pada folder asset 3D Rhino yang
telah diunduh, drag Rhino ke kolom Hierarchy. Setelahnya dibuat kode program
C# dengan nama rhino. Adapun kode program rhino.cs adalah sebagai berikut:
void Start () {
CubeSettings();
orc.SetBool("attacks", true);
}
// Update is called once per frame
void Update () {
if (transform.position.x >= -7 && aone==true) {
transform.Translate(Vector3.right * movementSpeed * Time.deltaTime);
atwo=true;
} else if (transform.position.x <= 7 && atwo==true) {
transform.Translate(Vector3.left * movementSpeed * Time.deltaTime);
aone=false;
} else if (transform.position.x >= 7) {
transform.Translate(Vector3.right * movementSpeed * Time.deltaTime);
aone=true;
}
3
59
//attack
if (transform.position.x <= 5 && transform.position.x >= 2) {
hpbar.SetActive(false);
if(red==true){
myCG.SetActive(true);
} else if (red==false) {myCG.SetActive(false);}
}
if (transform.position.x >= 3) {
red=false;
}
}
private void CubeSettings(){
Transform cam = Camera.main.transform;
transform.position = cam.forward * 11;
}
public bool Hit( int hitDamage ){
mCubeHealth -= hitDamage;
if(mCubeHealth>=700) {
ebar2.transform.localScale -= new Vector3(1,0,0);
}
else if (mCubeHealth<700) {
ebar.transform.localScale -= new Vector3(1,0,0);
}
//orc.SetBool("attacks", true);
if ( mCubeHealth <= 0 && mIsAlive ) {
ebar.SetActive(false);
canvas4.SetActive(true);
StartCoroutine(DestroyCube());
return true;
}
return false;
}
private IEnumerator DestroyCube(){
mIsAlive = false;
yield return new WaitForSeconds(1.0f);
Destroy(gameObject);
}
}
Gambar 4.31 Listing Program Rhino
Kode program rhino.cs tersebut berguna untuk mengatur gerakan obyek 3D
Rhino, HP , dan pola serangan. Pemain harus menembak musuh dengan
60
memposisikan musuh tepat di tengah layar. Musuh yang merupakan perwujudan
tidak bekerja dalam kerja kelompok memiliki HP dan pola serangan yang perlu
diwaspadai pemain. Pemain berhasil menyelesaikan game ketika pemain dapat
menghacurkan musuh dengan membuat HP-barnya menjadi nol.
4.3.5 Pembuatan Level : Epilogue
Level : Epilogue merupakan kesimpulan dari Level : Prologue , Level :
Chapter 1 , Level : Chapter 2. Level : Epilogue ini disajikan dalam bentuk visual
novel dan pada akhirnya diberikan credit roll yang berisi ucapan terima kasih
kepada pihak-pihak yang telah membantu pembuatan game.
Gambar 4.32 Level : Epilogue
Adapun Script epilogue.cs yang digunakan adalah sebagai berikut :
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
switch (a) {
case 1 :
name.text = "+ Prof. Julius +";
dialogue.text ="Oh benar, apakah kamu mendapat informasi yang berguna untuk penelitia
61
nmu ?";
fscreen.SetActive(false);
break;
case 2 :
choice1Btn.SetActive(true);
choice2Btn.SetActive(true);
dialgueBtn.SetActive(false);
professora1.SetActive(false);
mc01.SetActive(true);
name.text= "+ Player +";
chtext1.text = "Ya, aku mendapatkan semua informasi yang kubutuhkan.";
chtext2.text = "Ya, bahkan aku bekerja langsung didalamnya.";
break;
case 3 :
//scrollview.SetActive(false);
mc01.SetActive(false);
choice1Btn.SetActive(false);
choice2Btn.SetActive(false);
...
}
public void btnchoice1() {
a=a+1;
}
public void btnchoice2() {
a=a+1;
}
public void textchange() {
a=a+1;
}
}
Gambar 4.33 Listing Program Epilogue
62
4.4 Pembahasan Statistik
Setelah game selesai dibuat, hipotesa dibangun untuk memprediksi apakah
game Mental of Corrupt mampu menyampaikan pesan anti korupsi. Berikut ini
hipotesa yang dibangun:
H1: Game Mental of Corrupt mampu menyampaikan pesan pendidikan korupsi ke
mahasiswa.
H2: Game Mental of Corrupt mampu menyampaikan pesan melawan sikap
menunda pekerjaan yang berkaitan dengan pendidikan korupsi.
H3: Game Mental of Corrupt mampu menyampaikan pesan melawan sikap
memberi contekan yang berkaitan dengan pendidikan korupsi.
H4: Game Mental of Corrupt mampu menyampaikan pesan melawan sikap tidak
bekerja dalam kerja kelompok yang berkaitan dengan pendidikan korupsi.
H5: Game Mental of Corrupt mampu menyampaikan pesan melawan kebiasaan
buruk dikalangan mahasiswa berkaitan dengan pendidikan korupsi.
Hipotesa yang diajukan perlu diuji dengan menggunakan metode survei
dengan menyebarkan kuesioner. Adapun pertayaan yang dibangun dalam kuesioner
disusun berdasar hipotesa yang diajukan untuk mengetahui apakah game Mental of
Corrupt mampu menyampaikan pesan anti korupsi. Berikut ini pertanyaan yang
dibangun berdasarkan hipotesa:
Q1) Setelah memainkan game Mental of Corrupt, berapa nilai yang anda berikan
untuk pesan hubungan korupsi dan karakter mahasiswa?
Q2) Setelah memainkan game Mental of Corrupt, berapa nilai yang anda berikan
untuk pesan tidak menunda-nunda pekerjaan?
Q3) Setelah memainkan game Mental of Corrupt, berapa nilai yang anda berikan
untuk pesan tidak memberi contekan?
Q4) Setelah memainkan game Mental of Corrupt, berapa nilai yang anda berikan
untuk pesan tidak bertindak pasif dalam kerja kelompok atau tidak berkerja
dalam kerja kelompok?
63
Q5) Setelah memainkan game Mental of Corrupt, berikanlah nilai untuk game
pendidikan anti korupsi ber genre Augmented Reality (AR) tersebut dalam
menyampaikan pesan?
Hipotesa H5 dibatalkan dengan alasan bahwa pertanyaan kelima (Q5) yang
merupakan alat tes untuk hipotesa H5 tidak secara tepat mewakili pengukuran
melawan kebiasaan buruk.
Data hasil kuesioner tersebut lalu diolah menggunakan SPSS. Penghitungan
dilakukan dengan uji One-Sample T Test untuk membuktikan hipotesa yang
diajukan terpenuhi dan korelasi Pearson untuk membuktikan bahwa variabel
independent Q2, Q3, dan Q4 berkorelasi dengan variabel dependent Q1.
Berikut adalah hasil uji One- Sample T Test :
Tabel 4.5 One- Sample Statistics
One-Sample Statistics
N Mean Std. Deviation Std. Error Mean
Q1 30 3,9333 ,78492 ,14331
Q2 30 4,1000 ,88474 ,16153
Q3 30 4,1333 ,81931 ,14958
Q4 30 4,3000 ,70221 ,12821
Tabel 4.6 One- Sample Test
One-Sample Test
Test Value = 3
t df Sig. (2-tailed) Mean Difference
Q1 6,513 29 ,000 ,93333
Q2 6,810 29 ,000 1,10000
Q3 7,577 29 ,000 1,13333
Q4 10,140 29 ,000 1,30000
Berdasarkan tabel 4.5 dan 4.6 yang merupakan uji One- Sample T Test menunjukan
bahwa mean untuk variabel Q1, Q2, Q3 lebih dari 3 dan perbedaan dari nilai netral
64
3 menghasilkan angka positif. Dengan demikian, hipotesa H1, H2, H3, dan H4
terbukti (supported).
Untuk menunjukan kaitan/korelasi antara variabel independent Q2, Q3, Q4
dengan variabel dependent Q1 digubakan uji korelasi Pearson yang hasilnya
ditunjukan dalam tabel 4.7.
Tabel 4.7 Hasil Korelasi Menggunakan SPSS
Dari tabel 5.5 menunjukan bahwa variabel H1 memiliki korelasi atau
hubungan yang kuat dengan variabel H2, H3, H4. Dengan demikian dapat
disimpulkan bahwa variabel H2 berkorelasi kuat dengan H1, dengan kata lain
perilaku menunda pekerjaan memiliki kaitan yang kuat dengan (merupakan bagian
dari) perilaku korupsi. Variabel H3 memiliki korelasi yang kuat dengan H1, dengan
kata lain perilaku memberi contekan memiliki kaitan yang kuat dengan (merupakan
bagian dari) perilaku korupsi. Variabel H4 memiliki korelasi yang kuat dengan H1,
dengan kata lain perilaku tidak bekerja dalam kerja kelompok memiliki kaitan yang
kuat dengan (merupakan bagian dari) perilaku korupsi.