[Unity]10.유한상태머신 구현하기

안녕하세요 유랑입니다.



지난시간에 배운 휴머노이드를 가지고 유한상태머신을 구현해 보겠습니다.

인공지능 AI를 다루는 게임에서는 필수적인 요소랍니다.

시작하겠습니다.




1.유한상태머신



적 캐릭터가 플레이어를 찾거나 때리거나, 사망할 때의 상태 머신들을 일컬어서 유한상태머신이라고합니다.

이름 그대로 상태가 유한하다는 뜻이겠죠? 

앞으로 Animator에서 구성한 상태들을 가지고 캐릭터의 상태를 설정해 주겠습니다.







1-1) 애니메이터



Run, Idle, Attack 이렇게 세 개의 상태머신들을 가지고 유한상태머신을 구현해 보겠습니다.

원하는 공격 애니메이션을 추가하고 이름을 다음과 같이 바꿔주세요. 

각 상태(Run, Idle, Attack)는 서로 연결되어야 의미가 있습니다.

게임이 시작되면 상태가 Idle로 바뀌고 뛰거나 공격하는 모션으로 바뀔 수 있고, 

반대로 다시 Idle 상태로도 바꿀 수 있습니다.

이 떄 쓰이는것은 Make Transition이며 상태머신 위에서 마우스 우측버튼을 누른뒤 

Make Transition을 이용해 서로 연결해주겠습니다.







1-2) 파라미터 



상태머신들을 연결하는 부분에 파라미터값을 추가할 수 있습니다.

파라미터값은 Float, Int, Bool, Trigger 이렇게 4개가 있으며, 

저는 Bool을 이용해 isRun과 isAttack 파라미터를 만들어 보았습니다.






Idle => Run 화살표 부분에 +표시를 이용해서 isRun true를 추가해주었습니다.

이때 인스펙터창에서 Has Exit Time 체크를 해제해 주어야 하는데, 체크하게되면 상태머신을 바꾸라는 

명령을 내리더라도 Idle 애니메이션을 끝까지 동작하고 상태를 바꾸기 때문입니다.

파라미터를 다음과 같이 추가시켜주면 Idle 상태일 때 isRun이 true일 경우 자동으로 Run상태로 바뀌게 됩니다.





Run -> Idle도 마찬가지로 Has Exit Time 체크를 해제시켜주고 isRun false 파라미터를 추가시켜주세요.





공격모션도 Run과 같이 설정해 주도록 하겠습니다.





만약 공격모션을 끝까지 보고싶으시다면 Has Exit Time을 체크해주셔도 무방합니다.






1-3) StartCoroutine



코드를 작성하시다보면 뭔가 동시에 처리하고 싶으실 때 어떤걸 써야하나 생각하실 겁니다.

유니티에서는 코루틴이라는 개념을 도입하여 동시에 실행시켜주도록 도와줍니다.

왜 이런 방법을 써야하냐하면 여러가지 이유가 있겠지만, 

우선 Update문은 1초에 60프레임을 불러오기 때문에 불필요하게 사용됩니다.

이 때 코루틴을 이용해 3초에 한번씩 메소드를 불러 올 수도 있습니다.

상태머신을 코룬틴을 이용해서 구성해 보겠습니다.






코드는 다음과 같습니다.

Start 메소드에서 StartCroutine 코드를 작성해 코루틴을 사용합니다. 

아까만든 파라미터값이 ture되면서 이동상태로 변합니다. 

그리고 yield return new WaitForSeconds(3.0f)를 사용하면 3초 동안 대기 후

파라미터값이 false되면서 대기상태로 변하게됩니다.







유니티짱이 대기=>이동=>대기=>공격=>대기하는 상태를 보실 수 있습니다.






2. 마무리



이번 시간에는 상태머신과 메카님 휴머노이드를 이용해서 간단하게 AI를 구현해 보았습니다.

다음 시간에는 유니티 광고를 넣는 방법에 대해서 알아보겠습니다.

오늘도 고생하셨습니다.

감사합니다.




수업자료: https://github.com/YouRang12/-Tistory-Unity---Basic




댓글

Designed by JB FACTORY