유니티 Bake된 Navmesh 영역내에서 랜덤하게 움직이기

NavMesh Bake하기

 

AI가 움직이기 위한 바닥을 선택해줍니다.

 

선택한 바닥을 Static으로 체크해줍니다.

 

다음으로, 상단 [Window] - [AI] - [Navigation] 탭을 눌러줍니다.

Bake를 누르시면 AI가 다닐 수 있는 영역을 파란색 표시로 볼 수 있습니다.

 

 

유니티 (Unity) AI Agent 설정 (Setting)

FSM이란 무엇인가 내비게이션 시스템이란 무엇인가 1. FSM이란? F : Finite S : State M : Machine 주어진 시간에 주어진 유한개의 상태를 가지고 주어진 입력에 따라 어떠한 상태에서 다른 상태로 전환하

wlsdn629.tistory.com

AI Agent 설정은  위 포스팅을 참고하시길 바랍니다.


AI가 랜덤으로 돌아다니게 하는 스크립트 

using UnityEngine;
using UnityEngine.AI;

public class AgentController : MonoBehaviour
{
    public float updateInterval = 3f; // 목표 위치를 갱신할 시간 간격 (초)
    private NavMeshAgent agent; // NavMeshAgent를 저장할 변수
    private float timeSinceLastUpdate; // 마지막으로 목표 위치를 갱신했던 시간

    void Start()
    {
        agent = GetComponent<NavMeshAgent>(); // NavMeshAgent 컴포넌트를 가져옵니다.
        timeSinceLastUpdate = updateInterval; // 초기에 목표 위치를 설정하기 위해 시간 값을 설정합니다.
    }

    void Update()
    {
        timeSinceLastUpdate += Time.deltaTime; // 시간 값을 갱신합니다.

        if (timeSinceLastUpdate >= updateInterval) // 설정한 시간 간격이 지났는지 확인합니다.
        {
            Vector3 randomPosition = GetRandomPositionOnNavMesh(); // NavMesh 위의 랜덤한 위치를 가져옵니다.
            agent.SetDestination(randomPosition); // NavMeshAgent의 목표 위치를 랜덤 위치로 설정합니다.
            timeSinceLastUpdate = 0f; // 시간 값을 초기화합니다.
        }
    }

    Vector3 GetRandomPositionOnNavMesh()
    {
        Vector3 randomDirection = Random.insideUnitSphere * 20f; // 원하는 범위 내의 랜덤한 방향 벡터를 생성합니다.
        randomDirection += transform.position; // 랜덤 방향 벡터를 현재 위치에 더합니다.

        NavMeshHit hit;
        if (NavMesh.SamplePosition(randomDirection, out hit, 20f, NavMesh.AllAreas)) // 랜덤 위치가 NavMesh 위에 있는지 확인합니다.
        {
            return hit.position; // NavMesh 위의 랜덤 위치를 반환합니다.
        }
        else
        {
            return transform.position; // NavMesh 위의 랜덤 위치를 찾지 못한 경우 현재 위치를 반환합니다.
        }
    }
}

스크립트를 작성하신 다음  Nav Mesh Agent 컴포넌트가 부착되어 있는 오브젝트에 Agent Controller를 부착시켜줍니다!


결과

Setting된 Position 위치를 Navmesh에서 볼 수 있다!