Animator 적용 –

Animation에 사용할 Sprite 클립 준비

  • 준비할 클립은 대기(IDLE)와 이동(MOVE)

IDLE

MOVE

  • 준비된 Sprite를 Sprite Editor를 이용하여 Slice 해준다
  • Sprite ModeMultiple 을 선택 후 Sprite Editor를 클릭한다.

  • 왼쪽 상단에 Slice 탭을 선택하면 아래 팝업이 등장
  • 해당 Type과 Pivot 을 설정하고 Slice를 클릭하면 이미지가 분할된다

  • Apply 버튼을 누르고 빠져나온다
  • 위의 과정을 마치면 하나의 이미지가 Slice 되어 아래처럼 여러개의 Sprite로 나뉘어 진다.

Animator 생성

  • Slice 한 Sprite Group을 하이어라키로 이동시켜 Animation ClipAnimation Controller을 생성한다.

  • 생성된 Animation ControllerAnimation 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());

결과 확인