한 걸음 두 걸음
unity 유니티 ] NaviMeshAgent으로 네비게이션 사용하기 본문
간단하게 이런 맵이 있다고 가정하자.
여기서 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에 타켓을 향해서 움직이도록 설정해주면 움직입니다 : )
'Unity' 카테고리의 다른 글
유니티 특강 Day5 ] ray이벤트처리 / Video 비디오 및 전환/ insideout (0) | 2019.01.25 |
---|---|
Unity ] Ray 선 (Script함수 활용) DrawRay / RaycastHit 등 이벤트처리 (0) | 2019.01.25 |
unity 유니티 ] Text bestfit 이용하기 (0) | 2019.01.24 |
Unity 유니티 ] Effect 설정하기 (particel System) + asset store 이용하기 (0) | 2019.01.24 |
Unity 유니티 ] Ragdoll 만드는 법 (신체부위별 3D객체 연결) (0) | 2019.01.24 |