✅ 우리가 게임을 플레이 하면 걷기나 뛰기를 하는 동시에 다른 행동을 동시에 수행하는경우가 많습니다. 그렇기에 우리는 자연스럽게 걷기, 뛰기등의 애니메이션을 보여줌과 동시에 공격이나 회복등의 다른 행동을 함께 섞어서 제공을 해야합니다. 이번에는 유니티의 애니메이션 레이어를 이용하여 여러개의 애니메이션을 동시에 재생하는 방법을 정리해보았습니다.
1. 특정 부위만 재생하기 위한 애니메이션 아바타 만들기(걷기와 방패막기를 동시에 사용해보자)
- 프로젝트 폴더에서 Create > Avatar Mask를 통해 아바타 마스크 에셋을 생성합니다.
- 아바타 마스크 에셋을 클릭하면 휴머노이드가 나오는데, 휴머노이드의 각 영역을 클릭하면 초록색-빨간색으로 바뀝니다. 빨간색은 해당 애니메이션에서 해당 부분을 무시한다는 뜻 입니다.
- 필자는 걷는 모션(다리 부분)과 숙이면서 방패로 막는 모션(몸통 위)를 사용하기때문에 다리 부분은 무시하도록 합니다.
- 아바타 마스크 에셋에는 Humanoid말고 Transform영역도 있습니다.
- 휴머노이드로 세팅되지 않은 릭 형태에서는 해당 릭을 설정하여 마스크할 수 있습니다.
2. 애니메이션 레이어란?
간단하게 말해서, 애니메이션 레이어는 '마스크' 라는 것을 이용하여 마스크에 포함되어있는 범위의 애니메이션만 재생하도록 하는 기능입니다. 예를들어 휴머노이드의 팔만 마스크를 지정하면 해당 애니메이션은 팔만 움직이며 다른 부분(다리, 몸통, 머리)는 움직이지 않도록 둘 수 있습니다.
3. 애니메이션 컨트롤러에서 레이어를 생성하고 마스크를 등록합니다.
- 신규 레이어를 생성합니다.
- 생성한 신규 레이어에 마스크를 등록합니다.
- 톱니바퀴 버튼을 누르고 Mask 영역에서 생성한 마스크를 등록합니다.
- Weight를 1로 올려 오버라이드되는 크기를 증가시킵니다 ( 0부터 1까지하여, 1이면 100%로 해당 레이어의 애니메이션을 실행 )
4. 새로 생성된 Shield Layer에 애니메이션 설정을 합니다.
- 기본 상태는 None이며, 아무런 애니메이션이 없습니다.
- 애니메이션 컨트롤러의 매개변수를 이용하여 애니메이션 설정을 완료합니다.
5. 스크립트로 작성하여 애니메이션 컨트롤러의 매개변수를 변경하여 애니메이션이 작동되도록 합니다. (예시)
- 방패막기 스테이트로 진입시, _ShieldState를 1로 변경시킴과 동시에 상황에 따라 _AnimState도 변경시킵니다. 애니메이션 스테이트 별로 레이어가 다르기때문에 서로 다른 애니메이션 레이어에서 별도의 애니메이션이 실행됩니다. 이렇게 하여 여러개의 애니메이션을 동시에 실행할 수 있습니다.
/// <summary>
/// 방패로 막기
/// </summary>
public class SHIELD_BLOCK : State<PlayerController>
{
private bool mIsMoved;
public override void Enter(PlayerController entity)
{
//ShieldState가 1이면, 방패 상태를 활성화
entity.Animator.SetInteger("_ShieldState", 1);
}
public override void Execute(PlayerController entity)
{
//기본 이동속도의 x0.5로 이동
mIsMoved = entity.Move(0.3f);
//이동 여부에 따라 베이스레이어의 애님 스테이트 변경
entity.Animator.SetInteger("_AnimState", mIsMoved ? 1 : 0);
//우클릭을 그만 둔 경우에는 방패막기 상태 해제(SHIELD_BLOCK > IDLE)
if (Input.GetMouseButtonUp(1)) { entity.SetState(PlayerStates.IDLE); }
//좌클릭을 한 경우에는 방패 밀치기로 상태 변경 (SHIELD_BLOCK > SHIELD_SHOVE)
if (Input.GetMouseButtonDown(0)) { entity.SetState(PlayerStates.SHIELD_SHOVE); }
//애니메이션 블렌드 트리의 움직임 속도 설정
entity.Animator.SetFloat("_MovementSpeed", entity.CharController.velocity.magnitude);
}
public override void Exit(PlayerController entity)
{
}
public override bool OnMessage(PlayerController entity, Telegram telegram)
{
return false;
}
}
- 서로 다른 레이어(Base, Shield)에 있는 애니메이션이 동시에 실행되어 움직임 + 방패 활동이 보여집니다.
'unity etc. > others' 카테고리의 다른 글
[유니티, C# 오류] InvalidOperationException: Collection was modified; enumeration operation may not execute (0) | 2022.12.02 |
---|---|
[유니티] 오디오믹서 사운드 관리 (0) | 2022.11.21 |
유니티 안드로이드 지원 게임 빌드하기 (0) | 2022.11.05 |
유니티 이미지 외곽선 오류(PSD Matte) 해결하기 (0) | 2022.11.04 |
유니티 KeyCode 값 (0) | 2022.09.26 |