Animator 적용 –
Animation에 사용할 Sprite 클립 준비
- 준비할 클립은 대기(IDLE)와 이동(MOVE)
IDLE
MOVE
- 준비된 Sprite를 Sprite Editor를 이용하여 Slice 해준다
-
Sprite Mode
는Multiple
을 선택 후Sprite Editor
를 클릭한다.
- 왼쪽 상단에 Slice 탭을 선택하면 아래 팝업이 등장
- 해당 Type과 Pivot 을 설정하고 Slice를 클릭하면 이미지가 분할된다
-
Apply
버튼을 누르고 빠져나온다 - 위의 과정을 마치면 하나의 이미지가 Slice 되어 아래처럼 여러개의 Sprite로 나뉘어 진다.
Animator 생성
- Slice 한 Sprite Group을 하이어라키로 이동시켜
Animation Clip
과Animation Controller
을 생성한다.
- 생성된
Animation Controller
와Animation Clip
을 이름을 바꾸고 정리한다 - 하이어라키에 있던 Sprite 오브젝트는 삭제한다
- MOVE CLIP도 생성한다 여기서는 다른 방법을 사용해본다
- 이름을 바꾸고 정리해준다
- 이렇게 게임에서 사용할 간단한 애니메이션 작업의 준비가 끝난다
FSM 설정
자세한 FSM의 내용은 블로그를 참조 바랍니다. Unity Finite State Machine, FSM && Animator 2 Unity Finite State Machine, FSM && Animator
- 생성된 Controller 를 실행하면
Animator
가 실행됩니다. - 처음에는 IDEL을 만들면서 같이 생성된 Controller 에 IDLE이 추가 되어 있다
- Animator 로 앞서서 만든
MOVE Animation Clip
을 드래그하여 노드를 생성한다
- MOVE <=> IDLE 서로
Transition
을 연결해준다
- 케릭터의 상태를 확인하고 해당 Transition으로 상태를 변환 시켜주어야 하므로 Parameters를 설정한다 여기서는
IDEL, MOVE
로 설정합니다.
- Parameter의 경우
Float, Int, Bool, Trigger
여러 타입이 있는데, 추후 확장성 및 이벤트 드리븐 방법의 형식을 사용하고, 케릭터에 여러가지 상태가 추가 될 수 있기 때문에Trigger
방식을 사용합니다. -
Trigger
방식의 경우 애니메이션에 message를 보낸 방식으로 생각하시면 됩니다. - 그렇기 때문에 상태값과 메세지 값이 동일해야 합니다.
- 타입은 string 값으로 넘겨줄 수 있습니다.
Trigger 설정
- IDEL 에서 MOVE로 이어지는
Transition
을 선택합니다.
- Inspector 를 확인하면 다음과 같습니다.
- 여기서 Has Exit Time 의 체크를 해제합니다.
- 여기서는 Sprite를 갈아끼우는 방식을 사용할 예정이므로 굳이 애니메이션 전환에 딜레이를 줄 필요가 없습니다.
- Setting의 Transition Duration도 0 으로 바꿔 줍니다.
- Conditions 에 값을 추가 해줍니다.
- MOVE 상태로 이어지는 Transition 이므로
MOVE
로 값을 설정합니다.
- MOVE Transition도 동일하게 설정하고 Condition만 IDLE로 설정합니다.
케릭터에 Animator 컴포넌트 추가
- 원하는 케릭터 오브젝트에
Animator 컴포넌트
를 추가 합니다.
- Controller에 아까 만들어 둔 케릭터 컨트롤러를 할당합니다.
스크립트 수정
- 이제 Trigger를 작동시킬 코드를 마저 작성합니다.
- 여기서는 enum 타입을 이용하여 상태를 확이 합니다.
#region AnimationTrigger
[SerializeField] private Animator animator;
private enum Triggers { MOVE, IDLE }
private Triggers _trigger;
#endregion
private void Start()
{
_movementEventController.MoveEvent += Move;
_movementEventController.LookForwardEvent += LookForward;
_trigger = Triggers.IDLE;
animator.SetTrigger(_trigger.ToString());
}
private void MoveToward(Vector2 moveDirection)
{
_trigger = moveDirection != Vector2.zero ? Triggers.MOVE : Triggers.IDLE;
animator.SetTrigger(_trigger.ToString());
Vector2 direction = moveDirection * speed;
_rigidbody2D.velocity = direction;
}
- 트리거는 string 값을 받으므로 Enum 을 Tostring()을 이용하여 string 변환을 해줍니다.
animator.SetTrigger(_trigger.ToString());