적 캐릭터는 NPC(Non Playable Character)의 일종으로 게임에 참여한 플레이어가 조작할 수 없는 캐릭터를 말한다.
유한 상태 머신의 정의
NPC의 인공지능을 구현하는 방식에는 여러가지가 있다. 그중 하나가 유한상태머신(FSM:Finite State Machine)으로 적캐릭터가 스스로 알아서 주변 환경에 적응하거나 들어오는 반응에 적절하게 반작용하도록 구현한 것을 말한다.
적 캐릭터가 아래와 같이 Spwan되고 일정 범위를 순찰하다가 주인공을 추적하고 사정거리 이내에 근접하면 공격하는 것과 같은 구조를 상태머신이라고 한다. 또한 일정 데미지가 누적되며 사망하고 소멸되는 구조이기에 상태가 유한하여 유한상태머신 이라고 부른다.
상태가 많아 질수록 유지보수가 어려워진다. 이런점을 개선하기 위해 모듈화하고 계층적으로 분류하는 계층적 유한상태머신과 행동트리방식도 개발에 많이 적용한다.
메카님
FSM의 상태에 따라 적절한 애니메이션 동작을 취할 수 있게 메카님을 사용해 유연한 애니메이션을 제어해보자.
메카님은 리타게팅 기능을 제공해 Humanoid 모델의 필수 본 구조와 일치하면 다른 모델의 애니메이션을 바로 적용할 수 있다.
적캐릭터 3D 모델 임포트
다운한 Resources/Models폴더에서 Monster피키지를 임포트해 프로젝트의 05.Models폴더로 옮긴다.
Monster아이콘 삼각형을 눌러 펼쳐보면 삼각형아이콘이 애니메이션이다. idel, walk, attack,die, fall, gothit등 기본적인 애니메이션이 포함되어 있다.
메카님 애니메이션으로 전화
인스펙터뷰의 Rig탭을 눌러보면 Animation Type이 Generic으로 설정되어 있다.
애니메이션은 레거시, 제너릭, 휴머노이드 3가지 유형이 있으며, 각 타입특성은 다음과 같다.
레거시 : 유니티 4.0이전 버전
제너릭 : 메카님 애니메이션(비인간형모델), 리타게팅 불가
휴머노이드 : 메카님 애니메이션(인간형모델), 리타게팅 가능
Monster는 2족 보행(Biped) 모델로 휴머노이드로 설정해 구현할 수 있다. 애니메이션 타입을 Humanoid로 변경후 하단의 Apply후 자동 매핑이 되고 Configure버튼이 활성화 된다. 실패하면 x표시가 나타나고 수동으로 본을 연결해야 한다.
Config 버튼을 누르면 Bone구조의 매핑 정보를 확인할 수 있는 Avatar Confg화면이 나타난다. Avatar Asset은 모델+본구조매핑정보로 본 구조가 동일하다면 재사용이 가능하다.
실선으로 돼 있는 원은 필수로 15개가 있으며 점선은 추가적인 본으로 연결하지 않아도 상관없다.
인스펙트뷰의 좌하 Head탭을 누르면 머리의 본 연결 정보를 볼수 있고 Left Hand를 누르면 손가락 관절의 정보를 볼 수도 있다.
Monster Avatar상단의 Muscles&Settings 탭을 선택하면 각 관절의 정상적인 동작 여부를 슬라이더로 조절하며 시각적으로 확인할 수 있다. Pre-Muscle Settings에서 각 관절의 회전 범위를 설정할 수 있다.
맨밑의 Revert를 눌러 만질걸 복구시키고 Done을 눌러 변경을 마친다. 다시 인스펙터창이 보이고 Animation탭을 선택한다. idel, walk,attack 애니메이션만 Loop Time을 체크한후 Apply버튼을 누른다
애니메이션 리타게킹
맥사모 www.maxamo.com 사이트에 가입후 무료 에니메이션을 가져오자.
사이트에서 gangnam으로 검색후 싸이의 강남스타일 애니메이션을 가져오자.
지금 작업중인 적 캐릭터 모델파일(Monster.fbx)를 업로드해 애니메이션을 테스트도 할 수 있다.
Resources/Animations 폴더에 미리 다운받은 monster@Gangnam Style.fbx파일이 있으니 이걸 프로젝트뷰의 07.Animation폴더로 끌어온다.
메카님 리타게팅을 사용하려면 적용하려는 모델과 애니메이션 클립의 Type이 둘다 Humanoid로 설정해야 한다. 따라서 monster@Gangnam Style.fbx도 Rig탭에서 타입을 Humanoid로 바꾸고 apply한다. Animation탭을 누루고 Loop Time도 체크후 Apply해 준다.
같은 Animation탭 맨밑의 프리뷰창에 05.Model/Monster폴더의 Monster를 끌어다 놓고 Play시켜보면 춤을 추는걸 확인할수 있다.
Animator 컴포넌트
Monster모델을 씬뷰또는 하이라키로 끌어다 Player옆에 놓는다.
씬뷰에 추가된 Monster는 기본적으로 Animator가 추가되어 있다. 3D모델의 애니메이션 타입을 메카님으로 설정하면 Animator컴포넌트가 기본적으로 추가된다. 앞서 제작한 Player모델은 애니메이션 타입을 레거시로 설정했기 때문에 Animation 컴포넌트가 추가된것이다. Animator는 Animation을 컨트롤 하는 컴포넌트로 레가시는 Animation컴포넌트가 그 역활을 한다.
Animation컴포넌트의 각 속성의 기능은 다음과 같다.
프로퍼티: | 기능: | |
Controller | 캐릭터에 부여된 애니메이터 컨트롤러. | |
Avatar | 캐릭터의 Avatar입니다(애니메이터가 휴머노이드 캐릭터를 애니메이션화하기 위해 사용되는 경우). | |
Apply Root Motion | 캐릭터의 포지션과 회전을 애니메이션 자체에서 제어할지 또는 스크립트에서 제어할지 선택합니다. | |
Update Mode | 애니메이터 업데이트를 언제 할지, 어떤 타임스케일을 사용할지 선택할 수 있게 해줍니다. | |
Normal | 애니메이터는 업데이트 호출과 싱크되어 업데이트되며, 애니메이터의 속도는 현재의 타임스케일과 일치합니다. 타임스케일이 느려지면 애니메이션도 따라서 느려집니다. | |
Animate Physics | 애니메이터는 FixedUpdate 호출에 따라(즉, 물리 시스템과 동시에) 업데이트됩니다. 리지드바디 오브젝트를 밀어 움직일 수 있는 캐릭터와 같이 물리 상호작용을 하는 오브젝트의 모션을 애니메이션화하는 경우에 이 모드를 사용해야 합니다. | |
스케일되지 않은 시간(Unscaled Time) | 애니메이터는 업데이트 호출에 따라 업데이트되지만 애니메이터의 속도는 현재의 타임스케일을 무시하고 항상 100%의 속도로 애니메이션화합니다. 게임플레이를 일시정지하거나 특수한 효과를 위해 수정된 타임스케일을 사용하면서 GUI 시스템을 노멀 속도로 애니메이션화하는 경우에 유용합니다. | |
Culling Mode | 애니메이션에 사용할 수 있는 컬링 모드. | |
항상 애니메이션화(Always Animate) | 항상 애니메이션화하고 오프스크린일 경우에도 컬링을 하지 않습니다. | |
업데이트 트랜스폼 컬링(Cull Update Transforms) | 렌더러가 보이지 않을 때 리타겟, IK 및 트랜스폼의 쓰기를 비활성화합니다. | |
완전히 컬링(Cull Completely) | 렌더러가 보이지 않을 때 애니메이션을 완전히 비활성화합니다. |
애니메이터 컨트롤러
애니메이터 컨트롤러를 사용하여 캐릭터나 오브젝트의 애니메이션 클립 세트와 관련 애니메이션 전환을 정렬하고 관리할 수 있습니다. 대부분의 경우, 여러 애니메이션을 이용하여 게임 내에서 특정 상황이 일어났을 때 에셋을 바꿔가면서 사용합니다. 예를 들어 스페이스바를 누를 때마다 걷기 애니메이션 클립에서 점프 애니메이션 클립으로 전환할 수 있습니다. 하지만 애니메이션 클립이 하나만 있을 때에도 이 클립을 게임 오브젝트에 사용하기 위해서는 애니메이터 컨트롤러에 배치해야 합니다.
애니메이터 컨트롤러는 그 안에서 사용되는 애니메이션 클립에 대한 레퍼런스를 포함하고 있으며, 애니메이션 클립과 전환의 순서도 또는 Unity 에디터 내에서 비주얼 프로그래밍 언어로 작성된 간단한 프로그램이라고 생각할 수 있는 상태 머신 을 사용하여 다양한 애니메이션 클립과 각 클립 사이의 전환을 관리합니다. 상태 머신에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
프로젝트뷰의 07.Animation폴더 하위에 Controllers라는 서브폴더를 생성하고 Assts>Create>Animator Controller를 선택해 이름을 MonsterAnim으로 지정한다.
생성한 MonsterAnim을 더블클릭하면 다음 같은 애니메이터뷰가 열린다.
BaseLayer에 3개의 State가 있다.
Any State : 어떤 상태라도 조건이 맞으면 다른 스테이트로 분기시킬 수 있다.
Entry : 시작 스테이트 최초 진입점
Exit : 종료 스테이트 모든 스테이트가 종료되는 마지막 스테이트
Models>Monster폴더의 Monster를 눌러 삼각형 아이콘의 Idle 을 끌어다 애니메이터뷰에 끌어다 놓으면
다음 처럼된다 추가된 Idle은 Default를 의미하는 주황색을 띤다. 다른 스테이트도 우클릭으로 Default State로 변경가능.
하이라키뷰의 Monster를 선택하고 Animation>Controller폴더의 MonsterAnim를 Animator컴포넌트의 Controller에 끌어다 놓는다.
실행해보면 Idel에 파란색 진행 상태가바 채워지는 모습을 확인할 수 있다. 한번만 실행된다면 Loop를 체크해야한다.
이제 Walk도 끌어다 놔보자 아이들을 우클릭후 Maker Transition선택하면 화살표가 나오는데 이걸 walk에 연결한다. 이선을 transition이라고 한다.
애니메이터의 좌상 Parameters 탭을 선택하고 +를 눌러 Bool을 선택하고 이름을 IsTrace로 지정한다.
새로만든 IsTrace변수가 true면 walk, false면 Idel로 되돌아오게 해보겠다.
Idel과 walk사이의 transition을 선택하고 인스펙터뷰의 Conditions속성에 +를 눌러 조건을 추가하면 IsTrue가 true로 되어있다. HasExitTime은 언체크한다. 이건 현재실행중인 애니메이션을 즉시 멈추고 실행한다는 뜻이다.
이번에는 walk를 우클릭한후 transition을Idel에 연결해주고 transition을 눌러 IsTrace 를 fasle로 한다. 역시 HasExitTime은 언체크한다.
Play를 누르고 게임뷰에서 Animator탭으로 전환하고 왼쪽의 IsTrace를 체크/언체크해보면 스테이지가 변화한다.
'유니티게임강좌 > 적 캐릭터 제작' 카테고리의 다른 글
[Enemy제작] Player - 자동 회전 (0) | 2023.03.08 |
---|---|
[Enemy제작] 혈흔 효과 (4) | 2023.03.08 |
[Enemy제작] 유한 상태 머신 구현 (0) | 2023.03.05 |
[Enemy제작] 내비게이션 - 적 캐릭터의 순찰 및 추적 (1) | 2023.03.04 |
[Enemy제작] 유한 상태 머신의 정의 (0) | 2023.03.04 |