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 koruptordengan 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 korupsidengan 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. Playerhanya 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 CorruptAdapun gambar icon dan button yang telah dibuat :
Tabel 4.1 Icon, Splash Screen, dan Tombol Obyek 2D KeteranganIcon 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 KeteranganPintu 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 KeteranganPerwujudan 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 Folder4.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 HierarchyAdapun 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 Credit4.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 PrologueFungsi 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 RealityPada 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 ARCameraObyek 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 Prefabsdan 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 CubeBehaviorScriptPada 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 LaserScriptPada 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 PigKode 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 PesanAdapun 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 LvoneTanpa 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 pembuatanLevel : 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 LaserScript2Perbedaan Laserscript2.cs dengan Laserscript.cs terlihat pada lingkaran1
dan lingkaran2 yaitu saat laser bersentuhan dengan obyek knight dan shield. Pada
folder asset3D 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 KnightKode 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 PesanAdapun 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 RealityOleh 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