
오늘은 캐릭터의 움직임을 부여하고, 그 움직임을 제어해보도록 할 것이다.
우선 스프라이트가 있는 캐릭터에 Aimator 컴포넌트를 추가한 후, 생성한 AnimatorController를 참조했다.

해당 오브젝트를 클릭한 채로 ctrl + 6키를 이용해 Animation 창을 열면, 애니메이션 클립을 만들 수 있는 버튼이 생성된다.
우선 아무동작도 하지 않았을 때의 idle 애니메이션과 이동할 때 나올 run 애니메이션을 만들 것이다.


2D 프로젝트에서는 예전 영화 필름과 같이, 여러 스프라이트를 연속으로 재생하여 움직임을 구현하는 방식이다.
애니메이션에 이용할 이미지를 순서에 맞춰 배치하고, 적절한 속도로 조절하면 된다.

Animator에서는 위에서 만든 애니메이션 클립들을 유기적으로 연결할 수 있다.
해당 애니메이션 클립 위에서 Make Transition을 이용하면 애니메이션을 서로 연결할 수 있다.
Parameters에는 다양한 값들을 추가할 수 있는데, 해당 값에 따라 애니메이션의 변화를 제어할 수 있다.
위 예시의 경우, 이동할 때 player_run애니메이션을 실행하고, 이동하지 않으면 다시 idle 애니메이션을 재생하는 식으로 할 것이기 때문에 이를 표시할 isWalking이라는 bool값을 이용할 것이다.

Transition 화살표를 클릭하면 인스펙터 창에 위와 같은 장면이 표시된다.
바로 전환되기를 원하므로 exit time을 비활성화 하고 Transition Duration을 0으로 설정했다.
idle->run 으로 가는 transition이므로 conditions에는 isWalking이 true를 넣었다.
반대 transition에는 isWalking이 false를 넣으면,
처음 시작했을 때 player_idle 애니메이션이 재생되다, 이동할 때 player_run 애니메이션이 재생되고,
이동을 멈춘다면 다시 player_idle 애니메이션이 재생되는 것을 구현할 수 있다.
이제 저 isWalking을 제어하는 코드를 작성할 것이다.
우선 다음과 같은 AnimationController 스크립트와 AnimationController를 상속받는 CharacterAnimationController를 작성했다.
using UnityEngine;
public class AnimationController : MonoBehaviour
{
protected Animator animator;
protected TopDownController controller;
protected virtual void Awake()
{
animator = GetComponentInChildren<Animator>();
controller = GetComponent<TopDownController>();
}
}
using UnityEngine;
public class CharacterAnimationController : AnimationController
{
private static readonly int isWalking = Animator.StringToHash("isWalking");
private readonly float magnitudeThreshold = 0.5f;
protected override void Awake()
{
base.Awake();
}
private void Start()
{
controller.OnMoveEvent += Move;
}
private void Move(Vector2 vector)
{
animator.SetBool(isWalking, vector.magnitude > magnitudeThreshold);
}
}
private static readonly int isWalking = Animator.StringToHash("isWalking");
에서는 애니메이터에 있는 "isWalking"이라는 이름의 문자열을 정수값으로 바꾸는 역할을 한다.
문자열을 사용하는 것보단, 정수를 이용하는 것이 처리가 가볍다고 배웠다.
StringToHash() 에서 괄호에는 애니메이터의 파라메터 명을 정확하게 입력해야한다.
Move함수는 입력된 벡터값의 magnitude가 0.5f보다 클 때 isWalking 이 true가 되고, 아니라면 false가 된다.
Start함수에서 CharacterAnimationController의 Move 메서드는 움직임을 담당하는 OnMoveEvent 이벤트 메서드에 구독된다.
public class TopDownController : MonoBehaviour
{
public event Action<Vector2> OnMoveEvent;
public event Action<Vector2> OnLookEvent;
public void CallMoveEvent(Vector2 direction)
{
OnMoveEvent?.Invoke(direction);
}
public void CallLookEvent(Vector2 direction)
{
OnLookEvent?.Invoke(direction);
}
}
실제 이동이 이루어질때 그 이동 값에 따라 isWalking이 true나 false 값이 되므로, 이동을 구현할 수 있다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 22일차 TIL "캐릭터를 뒤집는 방법" (0) | 2024.10.15 |
|---|---|
| 내일배움캠프 21일차 TIL "캐릭터의 무기 회전시키기" (0) | 2024.10.14 |
| 내일배움캠프 19일차 TIL "맵 내 존재하는 캐릭터들 이름 출력" (0) | 2024.10.10 |
| 내일배움캠프 18일차 TIL "Scriptable Object를 이용한 캐릭터 정보 적용" (0) | 2024.10.08 |
| 내일배움캠프 17일차 TIL "Input System을 이용한 캐릭터 조작법" (0) | 2024.10.07 |