한 걸음 두 걸음

unity 유니티 ] NaviMeshAgent으로 네비게이션 사용하기 본문

Unity

unity 유니티 ] NaviMeshAgent으로 네비게이션 사용하기

언제나 변함없이 2019. 1. 24. 23:16
반응형

간단하게 이런 맵이 있다고 가정하자.

여기서 target(목표물)을 따라 움직이는 mover를 캡슐 3D객체로 하나씩 만들어줄 예정이다.

먼제 target과 mover를 제외한 환경들을

Navigation Static으로 설정해준 후,

(navigation창 못찾을까봐 첨부)
(
)

bake하여 이동할 수 있는 경로를 지정해주어야한다.

그럼 다음과 같이 나온 것을 확인할 수 있는데, show NavMesh가 체크되어있어야 볼 수 있다.

그리고 큐브들은 Plane에 맞닿아있어야하며, Plane까지 모두 static Navi 설정을 해주었어야 한다.

여기서 agent Radius나 agent Height 등을 바꿔줌으로써 이동할 수 있는 경로나 높이, 최대 경사 등을 정해줄 수 있다.

위의 사진대로라면 0.5radius의 폭과, 2의 높이와 45도의 경사면까지 갈 수 있는 곳의 경로만 이동할 수 있게끔 표시했다는 뜻이다.

그래서 오른쪽 상단과 같이 보다 촘촘하고 높게 이동할 수 있다는 것을 설정한 후 bake해주면

더 넓은 이동경로와, 높은 곳까지 닿을 수 있게 되었다는 것을 확인할 수 있다.

이제 capsule을 두 개 추가해서 mover와 target을 만들어주었다.( 빨간색으로 표시 )

이 두 객체에는

addComponent로 NavMeshAgent를 추가해주고

unity documentation에 나와있는 navmeshAgent의 destination 설정을 가져다 씁니다.

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class FollowTarget : MonoBehaviour
{
    public Transform target;
    Vector3 destination;
    NavMeshAgent agent;

    void Start()
    {
        // Cache agent component and destination
        agent = GetComponent<NavMeshAgent>();
        destination = agent.destination;
    }

    void Update()
    {
        // Update destination if the target moves one unit
        if (Vector3.Distance(destination, target.position) > 1.0f)
        {
            destination = target.position;
            agent.destination = destination;
        }
    }
}

나와있는 예시처럼 하나 C# 스크립트를 만들어 적용시켜주자면

script하나 만들어준 뒤, navi로 이름짓고 더블클릭해서 들어가주면

위와 같은 개발환경 창으로 들어갑니다 (visual studio)

거기에 위에서 참고한 destination 라이브러리대로 입력을 해서 사용해주면,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class navi : MonoBehaviour
{
    public Transform target;
    Vector3 destination;
    NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        destination = agent.destination;

    }
    void Update()
    {
        if (Vector3.Distance(destination, target.position) > 1.0f)
        {
            destination = target.position;
            agent.destination = destination;
        }
    }
}

이렇게 되고, public으로 목적지 주소를 받았으니까 소스코드 저장 후 유니티로 돌아와서

만든 스크립트 navi를 mover에 적용시켜주고 (목적지로 이동하는 스크립트였죠!)

mover 객체 내의 스크립트 target 으로

target 객체를 연결시켜주고나면,


이렇게 mover객체가 target객체와 가까워지기위해 움직이는 모습을 확인하실 수 있습니다.


도형으로 계단같이 만들어서 bake후 이렇게 계단따라 움직이는 것도 만들어볼 수 있고ㅡ

asset store에서 무료로 제공되는

simple home stuff를 import해와서

asset - HomeStuff - demo파일 더블클릭해서 가져온다음

사용할 요소들을 빈객체 room에 넣어 묶어준뒤 prefebs로 넣어서 저장시켜놓고

demo를 사용하지 않고 원래 사용하던 scene으로 prefebs에서 가져와 사용하면 된다.

여기서도 캡슐 두 개 (mover, target을 두고 쫒아가는 행동을 지시할 수 있으며,

카메라를 mover 시점으로 둬서 target을 쫒아가는 모습으로 볼 수 있다.

(나는 카메라에도 navmesh를 적용시켜주고 만든 navi script로 target에 이동하게 해서
mover와 같은 움직임을 갖는 시점의 영상을 만들어주었다.)

그리고 이렇게 찍은 카메라 시점의 영상은 따로

File - build setting -

build 클릭해서 새폴더 지정으로 만든 파일에 저장시켜주면

그 파일 내에 생성된 exe파일로

실행 영상을 확인할 수 있다.

windowed를 체크해줘야 적절한 크기로 보기 좋음!! : )


번외 추가

Vector3.MoveToward API 사용하기


public GameObject target; // 타겟값 받고! 
// public float speed; //스피드 값을 받아와서 사용해도 굿

float step =  speed * Time.deltaTime; // 움직이는 속도 정해주고

        transform.position = Vector3.MoveTowards(transform.position, target.position, step);

        //transform.position에 타켓을 향해서 움직이도록 설정해주면 움직입니다 : )
반응형