Unity

[ITSkeleton] Unity 플레이어 추적하기 (내비게이션 Navigation)

ITSkeleton 2016. 10. 31. 23:09
728x90
반응형

안녕하세요

ITSkeleton 입니다.


이번에 해볼것은

적이 플레이어를 발견했을때


자동적으로 추적하는 내비게이션에 대하여 알려드리려 합니다.


3.5버전 이후부터는 Navigation이라는 기능을 제공해 주는데요


플레이어와 몬스터 사이거리를 측정해서 가장 짧은 경로로 이동합니다.


잘따라하신다면 문제없이 작동하는걸 볼 수 있습니다.


먼저


셋팅부터 해주도록하겟습니다.


Create -> 3D object -> Cube를 두개를 만들어줍니다.


하나는 플레이어, 하나는 몬스터 역할을 하게 될것입니다.


그리고


카메라를 x축으로 90도 회전, 2D카메라로 변경 시킨다음

(2D카메라 변경은 카메라 클릭후 Inspector에 가보시면)

이러한 화면이 있습니다.

Projection -> Orthographic으로 변경시켜주시면 됩니다.


그다음!


create -> 3dobject->plane 을 하나 만들어서 카메라에 평면이 되도록 위치시켜줍니다.


움직임을 좀더 잘보여 주기위해 한 방식입니다.


장애물도 몇개 만들어보도록 하겟습니다.


create -> 3dobject -> cylinder를 만들어 줍니다.


실린더는 총 3개를 만들어서 원하는 위치에 올려주시면 됩니다.


그다음 메터리얼을 만들겠습니다.


3가지의 색상으로 만들것인데


플레이어 : 파랑


몬스터 : 빨강


장애물 : 녹색


으로 만들도록 하겟습니다.



이러한 모양으로 만들어 주신다면 간단하게 테스트 할수 있습니다.


먼저 플레이어 객체에


물리를 넣어주어야 겟지요?



플레이어에 다음과 같이


Rigidbody를 추가시켜줍니다.


이번장에서는 반드시 필요한것은 아니지만 


중력을 이용해서 플렌바닥에 정확하게 붙게 하기위해서 사용했습니다.


저와 같이 저렇게 새로만드신게아니라 가져오신거라면


Collider가 붙어 있어야 한다는점 명심해주세요


그래야 장애물에 걸려서 못넘어 올테니까요.


이렇게 하셧으면


다음 그림과같이


Plane에 오른쪽 위에 Static 옆의 화살표가 보시죠?


화살표를 클릭하시면 저런 Static 함수들이 뜹니다.


저기서 Navigation Static을 클릭해서 할성화 시켜줍니다.


활성화를 하셧다면


장애물(Cylinder) 3개도 똑같이 Navigation Static을 활성화 시켜줍니다.



그다음 Window -> Navigation 을 클릭해 줍니다.


그럼 Navigation 창이 하나가 뜰텐데요


이러한 창이 하나 뜨게 될겁니다.


아래에 Bake를 클릭해 줍니다.



그럼 다음과 같이 Scene 창에 저런 모양의 그림이 나오게 될겁니다.


저렇게 나왓다면 정상적으로 등록이 된겁니다.


여기까지 했는데 저렇게 안된다 하신다면  처음부터 천천히 따라와보세요!


이게되야만 합니다!


그다음 몬스터가 플레이어를 따라와야 합니다.



위 그림과 같이 몬스터 오브젝트에

Nav Mesh Agent를 추가시켜줍니다.



Stopping Distance 옵션이 0으로 설정되어 있는데요


저렇게되면 두개의 객체가 겹쳐져 버리는것을 볼수있기때문에


2로 바꾸어 주어서 약간의 거리가 있게 멈추게 될것입니다.



그다음은


Player 오브젝트에 Tag를 Player tag로 변경해줍니다.


그다음은


몬스터의 C#스크립트를 생성해 줍니다.


생성방법은 다 아실거라 생각합니다.


그다음은 다음과 같은 코드를 작성해 줍니다.


                 using UnityEngine;

using System.Collections;


public class Monster : MonoBehaviour {

private Transform monstertr;

private Transform playertr;

private NavMeshAgent nvAgent;


// Use this for initialization

void Start () {

monstertr = gameObject.GetComponent<Transform> ();

playertr = GameObject.FindWithTag ("Player").GetComponent<Transform> ();


nvAgent = gameObject.GetComponent<NavMeshAgent> ();


nvAgent.destination = playertr.position;

}

// Update is called once per frame

void Update () {

}

}


이렇게 작성하신후 이 코드를 몬스터에 적용시키면 플레이어의 위치로 가운데 장애물을 피해


서 달려오는 몬스터를 보실수 있습니다.


실질적으로 몬스터를 움직이게 하는것은 nvAgent.destination = playertr.position; 이부분 입니다.


이부분을 Start 부분이아니라 반복적으로 따라오게 하고싶다라고 한다면 Update 부분이나 


코루틴을 이용해서 While로써 계속 반복해서 돌리셔도 됩니다.


if문으로 몬스터와 플레이어의 좌표를 실시간으로 받아오며 어느정도 거리가 된다면 


실행되도록 만들수도 있을 것입니다.


후에 이코드를 가지고 게임을 한가지 더 만들어 볼 예정입니다.


긴글 봐주셔서 감사합니다.

728x90
반응형