Modul 10 - Scripting (Advance)
Modul 10 - Scripting (Advance)
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;
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.
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
using UnityEngine;
// 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));
}
}
/// <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.
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.
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>();
}
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>();
if(Input.GetMouseButtonDown(0)){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, 100)){
navPlayer.SetDestination(hit.point);
}
}
using System.Collections;
using UnityEngine;
/// <summary>
/// Fire: menahan tembakan selama 3 detik
/// </summary>
/// <returns></returns>
IEnumerator Fire()
{
Debug.Log("Fire");
isPlayerFire = false;
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;
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
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/