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 )
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 )
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 )
d.)
TableZombies AR
Gambar 4.4 TableZombies ARGameplay
(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
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
Menu Button
Icon Loading
Back Button
Adapun gambar
bakground
adalah sebagai berikut :
Tabel 4.2 Background
Obyek 2D Keterangan
Pintu Masuk / Lobi
Ruangan Prof. Julius
Laboratorium
Adapun karakter yang telah dibuat :
Tabel 4.3 Karakter
Obyek 2D Keterangan
Prof. Julius
Adi
(Pemilik permasalahan menunda pekerjaan)
Beta
(Pemilik permasalahan memberi contekan)
Charlie
(Pemilik permasalahan tidak bekerja dalam
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 : 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
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() {
}
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
Gambar 4.9 Tampilan Menu Utama
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.
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
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
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 () {
}
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;
} }
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 () {
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;
}
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;
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 ); }
}
}
}
// 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) {
}
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 Pigkebiasaan 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 :
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
.
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 {
// 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
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
// 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
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;
}
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();
}
// 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 ); }
}
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;
}
//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
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 +";
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;
} }
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
?
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
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.