Unity

[Unity] NavMesh - 자동으로 추격해오는 적 만들기 혹은 마우스로 장애물을 피해 캐릭터 움직이기

Guk-blog 2020. 3. 11. 14:59
728x90
반응형

void Update(){
	if (Input.GetMouseButton(0))
        {
            Ray ray = cam.ScreenPointToRay(Input.GetMouseButton);
            RaycastHit hit;

            if(Physics.Raycast(ray, out hit))
            {
                agent.SetDestination(hit.point);
            }
        }
}

예제로 만든 씬의 구조입니다.

window - ai - navigation을 눌러 navigation 패널을 열어줍니다

추적 해올 적을 위와 같이 세팅해줍니다.

그리고 지형지물을 전부 Static으로 만들어주거나 Navigation만 static으로 만들어 줍니다.

만약 문과 같이 이동해야하는 지형이 있다면 static으로 설정하시면 안됩니다.

그리고 아까 열어둔 Navigation 패널을 열어

Agent Radius와 Height을 설정해주고 

Bake를 눌러 구워줍니다.

그러면 위와 같이 파란색 영역이 생기는데 이 영역이 적이 이동가능한 루트들입니다.

 

만약 적이 이동 불가능한 지형을 만들고 싶다면 위에서 설명했던 것처럼 Navigation static을 하거나 

원하는 오브젝트에

add Component - nav mesh obstacle을 설정하면 이동 방해가 가능합니다.

이 프로젝트에서 nav Agent가 연결된 Enemy는 

위에서 만든 오브젝트가 움직인다면

자동으로 다른 길을 찾아 이동하게 됩니다.

 

자 설정은 끝났으니 플레이어를 죽이는 코드를 만들어보겠습니다.

public NavMeshAgent agent;
    private void Start()
    {
        GameEvents.current.TryAttackToEnemy += Hitted;
        StartCoroutine(FindPlayer());
    }

    IEnumerator FindPlayer()
    {
        agent.enabled = true;
        while (agent.SetDestination(Player.instance.transform.position))
        {
            yield return null;
        }
    }

먼저 Public으로 NavMeshAgent를 추가해준 후

플레이어를 싱글톤으로 만들어둔 상태라 위와 같이 사용했으며

Public GameObject or Transform 이나 다른 방법을 사용해서

Player의 Transform을 가져와서 죽이면 됩니다

 

만약 플레이어를 마우스 클릭으로

장애물을 피해 움직이고 싶다면

 

public Camera cam;

public void Update()
    {
        Input.GetMouseButton(0){
            Ray ray = cam.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if(Physics.Raycast(ray, out hit))
            {
                agent.SetDestination(hit.point);
            }
        }
    }

위 코드를 사용하면 됩니다.

 

그리고 이동 후 Nav Agent 사용을 중지하고 싶다면

Update와 같은 반복문 단에서

agent.hasPath를 확인하시고 false이면 agent.enable =false;로 하시면 되겠습니당

 

이후에 다시 사용하는건 당연히 enable = true;하시면 되구요

 

 

왜인지 모르겠지만 Agent를 기본인 휴머노이드를 안쓰고 다른 걸 쓰려고하면

베이킹도 안되고 오류만 뱉네요 

해결법을 알게되면 다시 포스팅하겠습니다

728x90
반응형