새소식

제작/Souls

[게임제작]유니티 몬스터 순회

  • -

 

1. 목적

- 플레이어에게 공포감을 주기 위한 동작과 추격을 하며, 사운드에 반응하여 움직인다.

 

 

기능

1. 몬스터의 추격의 순서는 플레이어, 전역사운드, 로컬사운드, 맵순회 순으로 진행된다.

2. 추격은 AI Nav를 사용하여 SetDestination으로 지정한다.

3. 플레이어가 DeadRange에 들어왔을 경우에는 Dead이벤트를 발생시킨다.

 

 

문제점

1. Update 내에 조건문을 통해 매 프레임마다 추격대상을 업데이트함으로서, 추격에 있어 대상이 지속적으로 바뀜



해결

1. 플레이어를 제외한 조건문에서 지정한 목적지에 도착을 했을 경우에만 위치값을 업데이트 하며, 그렇지 않다면 업데이트 하지 않는다. 또한, 추격 대상에 도착했을 경우에는 딜레이를 주어 그 곳을 살피도록 한다.

Player 조건
1. 플레이어가 숨기를 한 상태라면 추격 상태가 해제되어야 한다.
2. 만약, 플레이어를 추격했을 경우 마지막 플레이어 위치까지 추격 후 N 초간 정지한다..[탐색]

추격 : 플레이어가 감지된다면, 지속적으로 위치를 업데이트 추격한다.
Global Sound 조건 : 
1. 지역 사운드와 순회의 루틴을 끝내고, 글로벌 사운드가 존재하는 지역까지 이동하며, 이동된 곳의 전역 사운드는 제거된다.
2. 글로벌 사운드는 EventManager.cs가 관리하므로, 추적 대상만 지정해주면 된다.

추격 : 글로벌 사운드가 존재하는 한 지속적으로 추격한다.
Local Sound 조건
1. 지역 사운드가 발생해서 입력이 된다면, 1, 2 순위의 추적 루틴이 없을 경우에만 추격을 시작한다.
2. 기존에 추격하고 있던 지역 사운드가 존재한다면, 새로 입력되는 사운드를 무시된다.

추격 : 지역 사운드가 인식된다면 추격
Traversal 조건 : 
1. 1, 2, 3, 순위 조건에 충족하는 것이 없을 때 실행
2. 목적지에 도착하면 N초 정지 후 다음 목적지를 지정한다.

해당 목적지에 도착하게 된다면, 순회에 대한 조건이 종료가 된다.

 

추적에 대한 순서도

공통 변수 : 

1. 추적 상태 표시해주는 bool 배열

2. 추적 종료 후 대기시간 [추적 종료된 위치에서 일정시간 후 다음 추적을 진행하는 것]

 

 

 

 

추적 기능 확인

 

- Update를 통해 각 우선순위에 해당하는 함수를 구현해 True를 반환하면 해당 추적 루틴을 따르고, 그렇지 않다면 맵을 순회하는 함수를 실행한다. 

private void Update()
{
    //1순위 플레이어 추격
    if (SearchPlayer())
    {
        Debug.Log("Ghost :: Player 추격");
    }
    //2순위 오르골[전역사운드]
    else if (EventManager.instance.GlobalSoundTarget)
    {
        Debug.Log("Ghost :: 전역 사운드 추격");
        targetPosition = EventManager.instance.GlobalSoundTarget.position;
        ChaseState(1);
    }
    //3순위 기타 사운드
    else if(SearchLocalSound())
    {
        Debug.Log("Ghost :: 로컬 사운드 추격");
    }
    //마지막 순회
    else
    {
        Debug.Log("Ghost :: 순회");
        SearchTraversal();
    }
    nav.SetDestination(targetPosition);
}

 

- 아래 Gif 를 보면 1번째 루틴 플레이어를 쫓다가, 숨는기능[숨참기]를 하면 4번째 루틴으로 가는 것을 확인 할 수 있다.

추적 완성 Gif

 

Contents

아핫

땡큐하다