0% menganggap dokumen ini bermanfaat (0 suara)
42 tayangan19 halaman

Modul 10 - Scripting (Advance)

Modul ini membahas tentang raycast dan penerapannya untuk drag and drop objek di Unity. Raycast digunakan untuk mendeteksi objek yang disentuh mouse dengan menembakkan sinar dari kamera. Untuk drag and drop, raycast digunakan untuk mendeteksi objek yang diklik lalu posisinya diubah sesuai gerakan mouse sambil diklik.
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
42 tayangan19 halaman

Modul 10 - Scripting (Advance)

Modul ini membahas tentang raycast dan penerapannya untuk drag and drop objek di Unity. Raycast digunakan untuk mendeteksi objek yang disentuh mouse dengan menembakkan sinar dari kamera. Untuk drag and drop, raycast digunakan untuk mendeteksi objek yang diklik lalu posisinya diubah sesuai gerakan mouse sambil diklik.
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 19

Modul 10

Scripting (Advance)

A. Raycast
Raycast adalah proses menembakkan sinar (ray) yang tidak dapat dilihat
oleh user dari 1 titik menuju arah tertentu untuk mendeteksi apakah ada
collider yang disentuh oleh ray tersebut. Biasanya Raycast digunakan untuk
game FPS atau sesuatu yang lain yang menembakkan peluru ataupun hal
sejenis lainnya. Ikuti langkah-langkah di bawah agar paham.
1. Buka SceneOneScript.cs dan editlah filenya menjadi seperti di bawah ini.

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneOneScript : MonoBehaviour


{
// Start is called before the first frame update
void Start()
{
PlayerPrefs.SetString("Name", "Coder Institute");
}
// Update is called once per frame
void Update()
{
// Jika mouse diklik
if (Input.GetMouseButtonDown(0))
{
Ray ray =
Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)){
Debug.Log(hit.collider.gameObject);
}
}
}
}
2. Lalu save scriptnya. Dan kembali ke Unity dan mainkan. Lalu klik
sembarang objek yang ada pada scene, maka akan muncul pesan di
console objek yang kalian klik.
Penjelasan Kode

Ray ray =
Camera.main.ScreenPointToRay(Input.mousePosition);
Pertama adalah kita akan mendeklarasikan Ray. Lalu isinya adalah
Camera.main.ScreenPointToRay(Input.mousePosition). Dari kode
tersebut akan sedikit memusingkan. Mari kita melihat satu per satu dari
Camera.main mengambil objek yang memiliki tag MainCamera yang
ada di Hirarki Unity. Dan ScreenPointToRay(Vector3 Input),
maksudnya adalah mengambil posisi dari Input dalam kasus ini
mengambil posisi dari mouse.

RaycastHit hit;
RaycastHit hit untuk mendapatkan kembalian dari Raycast.

if (Physics.Raycast(ray, out hit)){


// DO IT
}
Physics.Raycast(ray, out hit) menghasilkan boolean. Maksudnya
apa? Jika ray mengenai objek yang memiliki collider maka akan
menghasilkan true, jika ray tidak mengenai apa-apa atau menembus
objek yang tidak memiliki collider maka akan menghasilkan false.

Debug.Log(hit.collider.gameObject);
Kode di atas menghasilkan object hit mana yang ditunjuk oleh mouse
pada console..
3. Untuk lebih jelasnya tambahkanlah sedikit kode pada
SceneOneScript.cs.

if (Input.GetMouseButtonDown(0))
{
Ray ray =
Camera.main.ScreenPointToRay(Input.mousePosition);
Debug.DrawRay(ray.origin, ray.direction*100,
Color.red, 5f);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)){
Debug.Log(hit.collider.gameObject);
}
}
}
4. Save dan coba mainkan di Unity.
Penjelasan Kode

Debug.DrawRay(ray.origin, ray.direction*100, Color.red,


5f);
Kita sudah mengenal Debug.Log() yang gunanya untuk menampilkan
pesan di console. Selanjutnya adalah Debug.DrawRay() untuk
menggambarkan Ray yang kelihatan pada Scene Window. Begini
maksud dari parameter DrawRay()

Debug.DrawRay(asal(wajib), arah(wajib), warna(opsional),


durasi(opsional));
Bisa dilihat di atas bahwa ray itu diambil dari Main Camera, maka asal
garisnya akan berasal dari Main Camera. Arahnya adalah garis arah yang
dituju ray. Untuk memperpanjang garisnya, maka dikalikan 100.
Selanjutnya adalah warna, kalian bebas memilih warna. Dan juga durasi
berapa lama garis akan bertahan.

B. Penerapan Drag and Drop Objek


Selanjutnya adalah pengimplementasian yang lain dari Raycast adalah
drag and drop objek pada game. Pertama kita berlogika dulu. Jika kita
sebagai player ingin mengangkat objek di Unity maka kita harus
menggunakan Raycast untuk mendeteksi apakah ada objek yang memiliki
collider yang bisa diangkat atau tidak. Jika ya, maka ubahlah posisi objek
tersebut sesuai dengan pergerakan mouse kita selama di klik. Begitulah
logika sederhananya. Mari implementasikan dengan kode.
1. Pertama kembali buka SceneOneScript.cs kalian dan edit menjadi
seperti di bawah ini.

using UnityEngine;

public class SceneOneScript : MonoBehaviour


{
GameObject target;
bool isDragging;
Vector3 offsetValue, screenPosition;

// Start is called before the first frame update


void Start()
{
PlayerPrefs.SetString("Name", "Coder Institute");
}

// Update is called once per frame


void Update()
{
// Jika mouse diklik, maka ...
if (Input.GetMouseButtonDown(0))
{
RaycastHit hitInfo;
target = ClickedObject(out hitInfo);
if (target != null)
{
isDragging = true;

// Screen Position
screenPosition =
Camera.main.WorldToScreenPoint(target.transform.position);

// Offset Value
offsetValue = target.transform.position -
Camera.main.ScreenToWorldPoint(new
Vector3(Input.mousePosition.x, Input.mousePosition.y,
screenPosition.z));
}
}

// Jika mouse tidak diklik, maka ...


if (Input.GetMouseButtonUp(0)) {
isDragging = false; // isDragging = false
}
// Jika isDragging, maka ...
if (isDragging)
{
Vector3 currentScreenSpace = new
Vector3(Input.mousePosition.x, Input.mousePosition.y,
screenPosition.z);
Vector3 currentPosition =
Camera.main.ScreenToWorldPoint(currentScreenSpace) +
offsetValue;
// Ubah posisi target
target.transform.position = currentPosition;
}
}

/// <summary>
/// ClickedObject: mengembalikan game object yang
diklik
/// Deklarasikan ray yang mendeteksi posisi mouse
/// Jika terdapat objek yang dideteksi ray, maka
jadikan target
/// </summary>
/// <param name="hit"></param>
/// <returns>Game Object target</returns>
GameObject ClickedObject(out RaycastHit hit)
{
GameObject target = null;
Ray ray =
Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray.origin, ray.direction*10,
out hit))
{
target = hit.collider.gameObject;
}

return target;
}
}
2. Selanjutnya adalah save dan mainkan di Unity. Cobalah untuk mengklik
objek dan pindahkan.
Penjelasan Kode

GameObject target;
bool isDragging;
Vector3 offsetValue, screenPosition;
Pertama kita akan mendeklarasi objek target, boolean isDragging untuk
mengecek apakah kita sedang men-drag objek atau tidak, dan Vector3
offsetValue dan screenPosition.

if (Input.GetMouseButtonDown(0))
{
// TYPE YOUR CODE
}
Kode di atas mengecek jika Mouse sedang diklik maka jalankan
kodenya.

GameObject ClickedObject(out RaycastHit hit)


{
GameObject target = null;
Ray ray =
Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray.origin, ray.direction*10, out
hit))
{
target = hit.collider.gameObject;
}

return target;
}
Sebelum melangkah ke dalam kode saat objek diklik, kita melihat
terlebih dahulu sebuah method yang namanya ClickedObject. Method
ini akan mengecek apakah ada atau tidak target yang dilalui ray. Jika ya
kembalikan game object dari target tersebut. Jika tidak, maka
kembalikan null

RaycastHit hitInfo;
target = ClickedObject(out hitInfo);
if (target != null)
{
// TYPE YOUR CODE
}
Selanjutnya kita membahas isi dari jika mouse sedang diklik. Yang
pertama deklarasikan RaycastHit untuk mendapatkan info target yang
dilalui ray. Kemudian kita membuat target. Untuk mendapatkan target
gunakan method yang kita sudah bikin sebelumnya. Selanjutnya akan
dicek apakah target tersebut null atau tidak. Jika target tidak null, maka
lanjutkan kode di bawahnya.

isDragging = true;

screenPosition =
Camera.main.WorldToScreenPoint(target.transform.position);

offsetValue = target.transform.position -
Camera.main.ScreenToWorldPoint(new
Vector3(Input.mousePosition.x, Input.mousePosition.y,
screenPosition.z));
Ini merupakan isi dari jika target tidak null. Pertama kita memberikan
nilai true ke isDragging, karena kita dalam posisi men-drag object.
Selanjutnya kita memberi nilai screenPosition sama dengan
MainCamera.WorldToScreenPoint(Posisi target).
Selanjutnya kita memberi nilai pada offsetValue sama dengan posisi
target - MainCamera.ScreenToWorldPoint(Posisi x Mouse, Posisi y
Mouse, Posisi z dari screenPosition)

if (Input.GetMouseButtonUp(0)) {
isDragging = false; // isDragging = false
}
Kode di atas mengecek jika mouse sudah tidak diklik berarti kita tidak
sedang men-drag objek, maka dari itu berikan nilai false pada
isDragging.

if (isDragging)
{
Vector3 currentScreenSpace = new
Vector3(Input.mousePosition.x, Input.mousePosition.y,
screenPosition.z);
Vector3 currentPosition =
Camera.main.ScreenToWorldPoint(currentScreenSpace) +
offsetValue;
// Ubah posisi target
target.transform.position = currentPosition;
}
Kode di atas mengecek jika isDragging true atau jika kita sedang men-
drag object, maka buat vector3 currentScreenSpace (posisi x mouse,
posisi y mouse, posisi z screenPosition)
Lalu buat vector3 currentPosition sama dengan ubah
currentScreenSpace ke World Space dengan ScreenToWorldPoint()
ditambah dengan offsetValue.
Setelah itu update posisi target sama dengan currentPosition.

C. Intelligent Player Movement


Sebelumnya kalian sudah mempelajari tentang menjalankan Player kalian
dengan input keyboard dan mouse. Kali ini kita akan mempelajari tentang
cara menjalankan Player tetapi dengan tap tempat tujuan. Ikuti langkah-
langkah di bawah untuk membuat Player yang pintar.
1. Pertama kita akan membuat scene baru bernama SceneThree.unity.
Buatlah dengan klik kanan pada Project window > Create > Scene.
2. Lalu buka Scene tersebut. Pertama buatlah Plane, klik kanan Hierarchy
> 3D Object > Plane. Karena kita membutuhkan Plane yang besar
ubahlah scale-nya menjadi (2, 2, 2).
3. Selanjutnya buatlah tembok dengan menggunakan Cube. Sehingga
hasilnya menjadi seperti ini. Ubahlah ukurannya sesuai minat kalian.

4. Kemudian buatlah banyak tembok sesuka kalian. Sehingga jika saya


yang buat hasilnya akan seperti di bawah ini

5. Kemudian buatlah Player dengan Capsule.


6. Lalu ubah posisi kamera sehingga bisa melihat player berjalan.

7. Lalu jadikan MainCamera child dari Player.

8. Klik Add Component pada Player > Lalu tambahkan component Nav
Mesh Agent di Player.
9. Selanjutnya klik tab window > AI > Navigation

10. Kemudian kita akan membuat semua objek yang tidak bergerak (Plane
dan Tembok) menjadi statis. Caranya adalah pada Navigation > klik
Object > Mesh Renderers > Lalu pilih objek Plane dan kubus dari Tembok
(jangan pilih Player karena Player bukan objek statis). Lalu centang
Navigation Static.
11. Kemudian kita ke menu Bake pada Navigation. Lalu tekan Bake.
Hasilnya akan menjadi seperti di bawah ini.

12. Terdapat area biru yang di mana area tersebut bisa dilewati oleh Player
kita.
13. Lalu buatlah script bernama NavPlayerScript dan bukalah script
tersebut. Edit menjadi seperti di bawah ini.

using UnityEngine;
using UnityEngine.AI;
public class NavPlayerScript : MonoBehaviour
{
NavMeshAgent navPlayer;
// Start is called before the first frame update
void Start()
{
// Get NavMeshAgent Component
navPlayer = GetComponent<NavMeshAgent>();
}

// Update is called once per frame


void Update()
{
if(Input.GetMouseButtonDown(0)){
Ray ray =
Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 100)){
navPlayer.SetDestination(hit.point);
}
}
}
}

14. Jangan lupa save. Selanjutnya drag and drop NavPlayerScript ke objek
Player. Lalu mainkan di Unity.
Akan terlihat jika kalian mengklik Plane di Unity maka Player akan
otomatis atau secara intelligent akan berjalan ke tujuan.
15. Kalian bisa mengedit radius dari Area biru (area berjalan) untuk
memperlebar atau mempersempit jalan.
Penjelasan Kode

NavMeshAgent navPlayer;
navPlayer = GetComponent<NavMeshAgent>();

Yang pertama kita lakukan adalah mendeklarasikan NavMeshAgent dan


mendapatkan component-nya pada objek Player.

if(Input.GetMouseButtonDown(0)){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 100)){
navPlayer.SetDestination(hit.point);
}
}

Untuk mengetahui kemana kita akan pergi yaitu dengan


mengimplementasikan Raycast. Jika suatu tempat di klik maka raycast
akan mendeteksinya, dan cara menjalankan player ada pada
navPlayer.SetDestination(hit.point);. Nav Mesh Agent pada Player

akan meng-set destinasi tujuan (hit.point) dan menjalankan Player ke


tujuan.
D. Pengenalan Coroutine
Apa itu Coroutine? Coroutine adalah sebuah method yang bisa
menghentikan sementara eksekusinya (yield) sampai instruksi yield selesai.
Apa yang membedakannya dengan method biasa?
1. Method biasa akan dieksekusi langsung selesai. Coroutine, method akan
dieksekusi namun bisa dihentikan di tengah method sampai instruksi
yield selesai lalu melanjutkan lagi sisa method-nya. (akan dijelaskan di
Praktiknya)
2. Method biasa jika dipanggil hanya menggunakan nama method
tersebut. Contoh: NamaMethod().
Coroutine akan dipanggil dengan menggunakan function
StartCoroutine(). Contoh: StartCoroutine(NamaCoroutine);.
3. Method biasa menggunakan void, dan tipe data lainnya. Coroutine akan
menggunakan IEnumerator.
Contoh: IEnumerator NamaCoroutine(){}.
Begitulah sedikit perbedaan antara method biasa dengan Coroutine. Agar
lebih paham, ikutilah langkah-langkah di bawah.
1. Buka Unity SceneOne kalian. Dan Buatlah script dengan nama
CoroutineScript. Lalu drag and drop script tersebut ke objek Scripts
2. Editlah script tersebut menjadi seperti di bawah.

using System.Collections;
using UnityEngine;

public class CoroutineScript : MonoBehaviour


{
bool isPlayerFire = true;

// Update is called once per frame


void Update()
{
// Jika menekan F pada keyboard
if (Input.GetKeyDown(KeyCode.F))
{
// Jika isPlayerFire true, maka jalankan
Coroutine
if (isPlayerFire)
StartCoroutine(Fire());
}
}

/// <summary>
/// Fire: menahan tembakan selama 3 detik
/// </summary>
/// <returns></returns>
IEnumerator Fire()
{
Debug.Log("Fire");
isPlayerFire = false;

yield return new WaitForSeconds(3);

isPlayerFire = true;
}
}

3. Save script dan mainkan di Unity. Lalu tekan F pada keyboard berulang-
ulang (bukan ditahan). Dan lihat hasilnya pada console.
Penjelesan Kode

if (Input.GetKeyDown(KeyCode.F))
{
// Jika isPlayerFire true, maka jalankan Coroutine
if (isPlayerFire)
StartCoroutine(Fire());
}
Kode di atas akan mengecek jika kita menekan F pada keyboard lalu di
cek lagi apakah isPlayerFire true. Jika true, maka jalankan Coroutine Fire.

IEnumerator Fire()
{
Debug.Log("Fire");
isPlayerFire = false;

yield return new WaitForSeconds(3);

isPlayerFire = true;
}
Kode di atas adalah Coroutine Fire. Coroutine ini akan menampilkan Fire
pada Console. Dan membuat isPlayerFire menjadi false. Lalu yield
return new WaitForSeconds(3);, maksudnya adalah tunggu selama 3
detik. Lalu buat isPlayerFire menjadi true.
Unity Tips
MELIHAT DETAIL OBJEK 3D

Pertama klik objek 3D sehingga muncul di Inspector. Lalu pada bagian


bawah (bagian abu-abu gelap paling bawah, gambar 1), klik kanan pada
tulisan orang, lalu muncul window baru.

Gambar 1
Gamification Series!!!
Dalam strategi pemasaran, gamification juga sering digunakan untuk
menarik pelanggan. Bahkan untuk brand besar seperti Starbucks.
Melalui aplikasi "My Starbucks Reward", kita mendapatkan bintang emas
setiap kali kita membayar kopi dengan menggunakan aplikasi ini. Jika
kita telah mengumpulkan lima bintang emas, kita akan mendapatkan
status 'hijau' dan isi ulang (refill) kopi gratis loh! Bahkan ketika kita
mencapai 30 bintang, kita membuka kunci keanggotaan 'Gold', dan Anda
mendapatkan kartu emas dibuat untuk kita sendiri. Sangat menarik
bukan?

Source: https://potion.social/en/blog/10-amazingly-successful-
examples-of-gamification/
https://www.bitcatcha.com/blog/gamify-website-increase-engagement/

Anda mungkin juga menyukai