BAB IV PEMBUATAN PEMBAHASAN GAME - 13.07.0003 Pieter Santoso Hadi.BAB IV

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

  

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

  

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.

  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

  

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

  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 Ruangan Prof. Julius Laboratorium

  Adapun karakter yang telah dibuat :

Tabel 4.3 Karakter

  

Obyek 2D Keterangan

Player

  

Prof. Julius

Adi

(Pemilik permasalahan menunda pekerjaan)

  

Beta

(Pemilik permasalahan memberi contekan)

Charlie

(Pemilik permasalahan tidak bekerja dalam

kerja kelompok)

  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

  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

  

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 () { }

   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);

   } 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.

Gambar 4.9 Tampilan Menu UtamaGambar 4.10 Tampilan Menu Utama Button StartGambar 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 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.

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.

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

   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 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 PrefabsGambar 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

   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;

   } 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

   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 ) {

  1

   if ( hit.rigidbody != null ) { // apply force to the target hit.rigidbody.AddForce(-hit.normal*mHitForce); // apply damage the target pigCtr.Hit( mLaserDamage ); }

   } } } // 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;

   } 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

  

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.";

   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 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

   // 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);

  1

   // 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

  2

   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);

   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;

   // 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.

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() {

   a=a+1; } public void textchange() { a=a+1; } }

Gambar 4.28 Listing Program LvtwoGambar 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(); } }

   // 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

   rhino1 rhino1Ctr = hit.collider.GetComponent<rhino1>(); if ( rhino1Ctr != null ) { if ( hit.rigidbody != null ) {

  3