본문 바로가기

Unity/Knowledge

생동감 있는 몬스터 만들어 보기

게임을 진행하게 되었을 때

몬스터가 가만히만 있다가 플레이어를 감지했을 때에만 추적하는 메커니즘이라면 

이 것 만큼 단조로운 상황이 존재할 수 있겠는가?

 

FixedUpdate를 사용해서 몬스터가 플레이어를 감지 할때까지 기다리는 방법보다는

코루틴을 사용하여 몬스터를 제어함과 동시에 생동감을 넣어주는 방법을 생각해 봤다.

 

Start메서드에서 UltimatedMove라는 IEnumerator를 호출하여 코루틴을 시작한다.

알다 시피 코루틴은 여러 프레임에 걸쳐 실행되는 작업을 가능케 한다.

ⓐ while (true)

무한 루프이다. 코루틴이 중단되지 않는 한 계속 실행되도록 설계한다.

 

ⓑ if (monsterMechanism.isGrounded)

몬스터가 지면에 닿아있는지 여부

 

ⓒ monsterMechanism.IsPlayerDetected()

플레이어가 감지되었는지 확인

 

Physics2D.OverlapCircle은 현재 Transform기준 원을 그리고 해당 레이어를 찾는 방식 // 3D라면 Physics.OverlapShpere를 사용해야겠죠?

플레이어가 감지되었으면 monsterMechanism.DirectionToTarget()을 호출하여 플레이어의 방향을 얻는다.

플레이어가 감지되지 않았으면 StopMove()를 호출하여 움직임을 멈춰준 뒤, 딜레이를 넣어주자

딜레이가 끝나고 RandomMovement()를 호출하여 무작위 방향을 얻고 움직인뒤, 딜레이를 넣어주자

즉, 몬스터가 멈춘 다음에 coroutineMoveInterval 만큼 대기를 하고
RandomMovement의 호출값 만큼 이동한 다음 또 다시 coroutineMoveInterval 만큼 멈추고를 반복시키게 함으로서
생동감 있는 몬스터가 완성된다.

 

혹시라도 몬스터가 땅에 있지않다면 움직임을 멈추고 떨어지게한다. (리지드바디 Gravity Scale에 의거하여)

마지막으로 yield return null; 처리를 해줌으로서
프레임을 넘기고 루프를 다시 시작하게 한다.

 

결론

1. 몬스터의 지속적인 움직임을 제어
2. 몬스터가 땅에 있을 때 플레이어를 감지하면 해당 방향으로 이동
3. 플레이어가 감지되지 않았다면 멈추고 일정 시간 대기
4. 일정시간 대기가 끝난 뒤 랜덤한 움직임을 갖고 다시 한번 대기
5. 혹시라도 공중에 있을 때 = 땅 위에 있지 않았을 때에는 이동을 멈춤
6. 이 과정은 Coroutine을 통해 여러 프레임에 걸쳐 계속 반복

'Unity > Knowledge' 카테고리의 다른 글

MonoBehaviour와 Unity 생명주기  (0) 2024.07.18
내가 자주 사용하는 LayerMask  (0) 2024.06.20
그래픽스 - 셰이더  (0) 2024.06.18
3D 카메라 타입 별 상호 작용  (1) 2024.06.04
인벤토리 토글 해체 분석기  (0) 2024.05.30