이번 포스팅은 #8-1 유니티 캐릭터(Player) 이동하기 포스팅의 다음 포스팅으로 캐릭터가 이동할 때 애니메이션이 바뀌도록 하겠습니다.
1. 애니메이션 전환을 사용하는 방법
2. 애니메이션 블렌드 트리 사용하는 방법
2가지에 대하여 다루도록 하겠습니다.
포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다.
#1 유니티2D 개발 시작하기
안녕하세요 첫 포스팅입니다. 유니티2D 관련 포스팅을 진행하겠습니다. 게임개발에 필요한 지식을 전달하고 함께 학습하겠습니다. 먼저 유니티2D 개발 블로그 포스팅에 앞서 참고한 책을 소개합
my-develop-note.tistory.com
#8-1 유니티 캐릭터(Player) 이동하기 포스팅 링크입니다.
#8-1 유니티 캐릭터(Player) 이동하기
이번 포스팅 C# 스크립트를 사용하여 그동안 만들었던 PlayerObject를 이동하는 것을 보여드리도록 하겠습니다. 포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다. http
my-develop-note.tistory.com
애니메이션 전환을 사용하는 방법

Assets > Animations > Contorllers > PlayerController 애니메이션 상태머신을 열겠습니다.

저는 현재 player-idle 애니메이션이 기본 상태이며, 오른쪽, 왼쪽, 위, 아래로 움직이는 애니메이션이 있습니다.
※애니메이션 상태머신에서 alt키와 애니메이션 상태머신의 바탕을 클릭하고 이동하면 상태머신을 둘러볼 수 있습니다.
※마우스 휠을 이용하면 애니메이션 상태머신을 확대/ 축소 할 수 있습니다.

애니메이션을 기본 상태로 변경하는 방법은 기본상태로 만드는 방법입니다.
만들고 싶은 애니메이션을 마우스 오른쪽 클릭 > Set as Layer Default State 클릭합니다.
현재 저는 player-idle 애니메이션이 이미 기본 상태이기 때문에 클릭할 수 없게 되어있습니다.
지금부터는 캐릭터가 이동할 때 애니메이션도 함께 사용하는 방법에 대하여 이야기하겠습니다.

Any State > 마우스 오른쪽 클릭 > Make Transition 클릭하여 전환을 만들고 5가지 애니메이션에 전환을 연결합니다.

Animator > Parameters > int Parameter(파라미터)를 생성하고 파라미터의 이름은 AnimationState로 바꾸었습니다.
Animations Parameter(애니메이션 파라미터)란 애니메이션 컨트롤러에 정의하는 변수로 스크립트(C#)에서 애니메이션 상태머신을 제어할 때 사용합니다.
애니메이션 파라미터는 전환과 상태를 사용할 때 필요합니다.

1. Any State에서 Player-right-move로 가는 전환을 클릭해줍니다.
2. Inspector창에서 아래와 같이 설정을 합니다.
Has Exit Time(종료 시간 있음) : 체크 해제
Fixed Duration(고정 지속 시간) : 체크 해제
Transition Duration(%)(전환 지속 시간)(%) : 0
Interruption Source(중단 소스) : Current State Then Next State
Ordered Interruption(순차적 중단) : 체크 해제
Can Transition To self(자체 전환 가능) : 체크 해제

Inspector > Conditions > + 버튼을 클릭합니다.
AnimationState > Equals > 1을 입력합니다.
이렇게 player-right-move의 조건을 설정을 하였습니다. 나머지 player-left-move, player-up-move, player-down-move, player-idle 애니메이션의 조건 또한 설정해야 합니다.
Conditions 부분을 제외한 나머지 부분은 동일하게 적용합니다
Conditions의 부분만 left 부터 idle 순으로 2~5의 번호를 지정합니다.
게임을 진행하는 동안 애니메이터는 언제든 해당 조건이 참이 되면 해당 애니메이션을 실행할 것입니다.
이제 스크립트를 사용하여 PlayerObject의 애니메이션 파마미터의 조건을 참으로 설정하겠습니다.
MoveController의 전체 스크립트입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveController : MonoBehaviour
{
public float movementSpeed = 3.0f;
Vector2 movement = new Vector2();
Rigidbody2D rigidbody2D;
Animator animator;
string animationsState = "AnimationState";
enum States
{
right = 1,
left = 2,
up = 3,
down = 4,
idle = 5
}
void Start()
{
animator = GetComponent<Animator>();
rigidbody2D = GetComponent<Rigidbody2D>();
}
void Update()
{
UpdateState();
}
private void FixedUpdate()
{
MoveCharacter();
}
private void MoveCharacter()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
movement.Normalize();
rigidbody2D.velocity = movement * movementSpeed;
}
private void UpdateState()
{
if (movement.x > 0)
{
animator.SetInteger(animationsState, (int)States.right);
}
else if (movement.x < 0)
{
animator.SetInteger(animationsState, (int)States.left);
}
else if (movement.y > 0)
{
animator.SetInteger(animationsState, (int)States.up);
}
else if (movement.y < 0)
{
animator.SetInteger(animationsState, (int)States.down);
}
else
{
animator.SetInteger(animationsState, (int)States.idle);
}
}
}
작성한 스크립트중 중요하다고 생각되는 부분만 살펴보도록 하겠습니다.
enum States
{
right = 1,
left = 2,
up = 3,
down = 4,
idle = 5
}
"enum"데이터 형식을 사용하여 열거형 상수를 선언하였습니다.
열거형 상수 뒤에 int(정수) 값과 일치하므로 해당 값을 얻을 수 있습니다.
위에서 하였던 전환 설정시에 int값과 일치하게 적고 int값을 사용하여 애니메이션 상태를 설정할 것입니다.
private void UpdateState()
{
if (movement.x > 0)
{
animator.SetInteger(animationsState, (int)States.right);
}
else if (movement.x < 0)
{
animator.SetInteger(animationsState, (int)States.left);
}
else if (movement.y > 0)
{
animator.SetInteger(animationsState, (int)States.up);
}
else if (movement.y < 0)
{
animator.SetInteger(animationsState, (int)States.down);
}
else
{
animator.SetInteger(animationsState, (int)States.idle);
}
}
UpdateState() 메서드를 작성하였습니다.
movement.x > 0 보다 크다는 조건의 의미는 (1,0)이 되었다는 의미로 x축의 움직임이 0보다 커졌다는 의미로 오른쪽으로 이동하였다는 것입니다.
SetInteger() 메서드는 string(문자열), int(정수) 값을 두 개의 파라미터를 받습니다.
첫번째 파라미터는 우리가 위에서 애니메이션 상태머신에서 추가한 AnimationState입니다.
string animationsState = "AnimationState";
animationState라는 변수에 string(문자열) 변수에 저장하였습니다.
두번째 파라미터는 int정수값입니다. 이것은 우리가 위에서 선언한 "enum" 데이터 형식의 열거형 상수입니다.
void Update()
{
UpdateState();
}
Update() 메서드에 방금 작성한 UpdateState() 메서드를 입력하였습니다.
Update() 메서드는 일정한 간격으로 호출하는 FixedUpdate() 메서드와는 달리 프레임당 한번씩 불리는 메서드입니다.
이제 작성한 스크립트를 저장을 합니다.
게임을 실행시켜 보면 정상적으로 작동하는 것을 볼 수 있습니다.

추가로 애니메이션 상태머신에서 애니메이션 상태를 클릭한 후에 Inspector창에서 Speed의 값을 자신이 원하는 값으로 바꾸어 실행해 보면 애니메이션의 속도가 바뀐 것을 볼 수 있습니다.
저는 속도가 너무 빠른것 같아 0.5로 조절하였습니다.

만약 애니메이션이 반복실행이 되지 않는다면 Assets > Animations > Animations 에서 반복 실행이 되지 않는 애니메이션을 선택한 후에 Inspector 창에서 Loop Time을 체크 하시기바랍니다.
애니메이션 블렌트 트리 사용방법은 다음 포스팅에서 진행하도록 하겠습니다!
마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!
감사합니다! :)
'유니티2D' 카테고리의 다른 글
#9-1 유니티 타일맵, 타일팔레트 (0) | 2020.12.01 |
---|---|
#8-3 유니티 캐릭터(Player) 이동하기_애니메이션(블렌드트리) (0) | 2020.12.01 |
#8-1 유니티 캐릭터(Player) 이동하기 (0) | 2020.11.27 |
#7 유니티 프리팹(Prefab) (0) | 2020.11.27 |
#6 유니티 태그(Tag), 레이어(Layer) (0) | 2020.11.27 |