Pada artikel kali ini masih berhubungan dengan project yang beberapa pekan ini masih saya kerjakan, yaitu dengan permasalahan "Bagaimana mendata seluruh objek yang ada pada scene, lalu setelah kita mendapatkan data dari objek di scene kita akan menghitung jaraknya, lalu kita akan menuju objek yang setelah dihitung merupakan objek yang paling dekat daripada yang lainnya".
Sama seperti artikel sebelumnya, artikel kali ini mungkin terkesan apa adanya karena saya sedikit kebingungan untuk menentukan judul. Yah, semoga saja sobat tetap paham dengan apa yang saya maksud >.<.
Pada kasus kali ini saya membuat sebuah roket, yang mana roket tersebut akan mengejar objek yang berada paling dekat dengannya setelah kita meluncurkanya. Pertama-tama saya buat variabel yang dibutuhkan
public float speed; //Kecepatan roket
float dist1; //Jarak objek pertama
float dist2; //Jarak objek kedua
Vector3 destination; //koordinat tujuan (enemy)
int x = 0; //awal mula perulangan = 0
public GameObject [] enemyList; //array dari objek yang dicari
Pada variabel di atas, kita akan membandingkan jarak dari 2 buah objek target (enemyList), yaitu objek target mana yang berada paling dekat dengan objek utama. Tipe data untuk jarak saya menyarankan menggunakan float, karena nantinya akan dilakukan perhitungan vector3 yang akan menghasilkan bilangan float. Selanjutnya koding yang harus dituliskan adalah seperti di bawah ini:
void Start (){
foreach(GameObject enemyFind in GameObject.FindGameObjectsWithTag("Enemy"))
{
if (x<2){
enemyList[x] = enemyFind;
print (enemyFind +" "+ x);
x+=1;
}
}
Example ();
}
Akan dilakukan 2x perulangan karena objek yang akan kita bandingkan hanya ada 2. Kita akan melakukan pencarian objek di scene yang mana menggunakan tag "Enemy" . Setelah ditemukan, enemy yang pertama akan dimasukkan ke array x=0 / array indeks ke 0. Lalu karena kondisi x<2 maka hasil perulangan x selanjutnya ada 1, karena x+=1 (0+1= 1). Maka proses perulangan akan memasuki tahap kedua sampai kondisi sudah tidak memungkinkan lagi. Pada proses kedua ini perulangan akan memasukkan objek dengan tag "enemy" yang kedua pada indeks ke 1, dan perulangan pun berakhir karena kondisi sudah tidak memenuhi. Selanjutnya akan dipanggil void Example() dengan potongan script di bawah ini :
void Example() {
if (enemyList[0]) {
dist1 = Vector3.Distance(enemyList[0].transform.position, transform.position);
print(enemyList[0]+ " Distance to other: " + dist1);
}else{
dist1 = 1000;
}
if (enemyList[1]) {
dist2 = Vector3.Distance(enemyList[1].transform.position, transform.position);
print(enemyList[1]+" Distance to other: " + dist2);
}
else{
dist2 = 1000;
}
}
Pada baris pertama akan dilakukan perhitungan jarak menggunakan posisi dari enemyList indeks ke 0 dengan jarak objek utama (transform.position) menggunakan fungsi Vector3.Distance(). Hasilnya akan dimasukkan ke dalam variabel float dist1. Mengapa pada else saya menuliskan dist = 1000 ?, hal tersebut menandakan apabila enemyList[0] tidak ditemukan maka dist 1 saya analogikan akan menghasilkan jarak yang sangat jauh sehingga kondisi tetap dapat berjalan. Begitu juga pada enemyList[1] kondisi yang saya gunakan sama. Setelah tahapan ini kita akan memasuki logika perbandingan jarak antara dist1 dengan dist2 yang berapa pada void Update(). Berikut potongan script nya :
void Update () {
if (dist1<=dist2){
this.transform.position = Vector3.MoveTowards(transform.position, enemyList[0].transform.position, Time.deltaTime * speed);
destination = enemyList[0].transform.position;
}
else if (dist1>dist2){
this.transform.position = Vector3.MoveTowards(transform.position, enemyList[1].transform.position, Time.deltaTime * speed);
destination = enemyList[1].transform.position;
}
if (transform.position == destination){
Print ("Sudah Sampai Tujuan")
}
}
void Update() akan memanggil kondisi di dalamnya secara terus menerus tergantung dari kondisi di dalam yang kita gunakan. Ini berfungsi untuk menggerakkan objek secara terus menerus, berbeda dengan void lain yang hanya memanggil sekali saja. Objek kita akan kita gunakan fungsi Vector3.Towards untuk menggerakkan dan menuju objek target yang sudah dibandingkan pada kondisi di atasnya antara dist1 dengan dist2. Lalu untuk kondisi penambahan endingnya, saya menggunakan print "Sudah Sampai Tujuan" yang menandakan objek kita sudah sampai pada objek target (tergantung kebutuhan kalian, jika menginginkan apa yang terjadi jika sudah memenuhi).
Well, demikian artikel yang terinspirasi dari proyek saya pribadi beberapa waktu lalu. Semoga bermanfaat untuk kalian ^_^