Unity Navmesh (pt.1) - Waypoints

March 22, 2018 in #Coding #Unity | | | Share on Google+

Dalam tutorial ini dan selanjutnya, kita akan belajar membuat AI sederhana dengan menggunakan NavmeshAgent yang merupakan fitur AI pathfinding bawaan Unity.

Dalam tutorial ini, kita akan membuat waypoints, yaitu membuat gerakan karakter AI secara berpola dari suatu titik ke titik lain. Hasil akhir dari tutorial ini adalah seperti berikut :



Pembuatan Scene dan Baking Navmesh

Scene yang akan saya buat adalah sebuah Plane sebagai Ground dan Capsule untuk mewakili agent AI kita. Agar bisa digunakan, kita perlu melakukan baking pada ground agar bisa dilalui oleh NavmeshAgent. Baking dilakukan dengan cara mencentang opsi static pada Inspector.

Selanjutnya, bake Navmesh pada menu Navigation. Jika di tempatmu belum ada, tambahkan dulu dalam Editor lewat menu Window > Navigation. Kemudian di dalam sub Bake, berikan pengaturan sesukamu dengan melihat dokumentasi. Jika sudah, tekan tombol Bake. Hasilnya, di dalam scene akan muncul warna biru dalam Ground.

Ketika kamu menambahkan sesuatu ke dalam scene, kamu perlu melakukan baking ulang, sehingga Navmesh akan terupdate. Sekarang, coba tambahkan dua Cube yang berperan sebagai obstacle sesuai dengan GIF di atas. Agent AI akan berusaha untuk menghindari obstacle tersebut.



Membuat Waypoint

Waypoints sebenarnya adalah kumpulan dari Transform sebuah GameObject. Buatlah beberapa waypoint dengan posisi di dalam Ground, dengan hirarki seperti gambar di bawah.


Bergerak Menuju Waypoint

Alur logika pergerakan AI adalah sebagai berikut :
1.) mendapatkan seluruh waypoint
2.) bergerak menuju waypoint yang dipilih
3.) jika sudah sampai, bergerak ke waypoint selanjutnya

// Filename : Agent.cs

using UnityEngine;  
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class Agent : MonoBehaviour  
{
    public Transform waypoints;
    private NavMeshAgent agent;   
    private int currentWaypointIndex = 0// untuk mengetahui waypoint ke berapa yang sedang dituju

    private void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        GoToNextWaypoint();
    }

    void GoToNextWaypoint()
    {
        // pergi ke waypoint yang dituju
        agent.SetDestination(waypoints.GetChild(currentWaypointIndex).transform.position);

        // siap siap menuju ke waypoint selanjuntnya
        currentWaypointIndex = (currentWaypointIndex + 1% waypoints.transform.childCount;

    }

    private void Update()
    {
        // jika sudah sampai, lanjut ke waypoint selanjutnya
        if (agent.remainingDistance == 0)
            GoToNextWaypoint();
    }
}

Hasilnya, agent sudah dapat berjalan menuju waypoint bahkan ketika ada obstacle di depannya.



Debug

Agar waypoints mudah dilihat, tambahkan Gizmo yang akan menampilkan semua waypoint. Letakkan kode berikut di bagian akhir script Agent.cs.

// Filename : Agent.cs

private void OnDrawGizmos()  
{
    if (waypoints.childCount > 0 && waypoints != null)
    {
        foreach (Transform waypoint in waypoints)
        {
            Gizmos.DrawSphere(waypoint.position, .5f);
        }
    }
}

Hasilnya, akan muncul lingkaran yang menandakan posisi waypoint.


Download Source Code

Source code dapat didownload di sini.

Edit : Pakai yang ini saja.

Pada pertemuan selanjutnya, kita akan membuat agent dapat mengejar karakter lain.

March 22, 2018 in #Coding #Unity | | | Share on Google+