이번 포스팅은 #8-1 유니티 캐릭터(Player) 이동하기, #8-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
#8-2 유니티 캐릭터(Player) 이동하기_애니메이션(전환) 포스팅 링크입니다.
#8-2 유니티 캐릭터(Player) 이동하기_애니메이션(전환)
이번 포스팅은 #8-1 유니티 캐릭터(Player) 이동하기 포스팅의 다음 포스팅으로 캐릭터가 이동할 때 애니메이션이 바뀌도록 하겠습니다. 1. 애니메이션 전환을 사용하는 방법 2. 애니메이션 블렌드
my-develop-note.tistory.com
애니메이션 블렌드 트리를 사용하는 방법
블렌드 트리를 사용하면 여러 애니메이션을 하나의 매끄러운 애니메이션으로 합칠 수 있는 장점이 있습니다.
또한 애니메이션을 구조가 깔끔해지고 관리하기 쉬워집니다.

먼저 저는 애니메이션 상태 머신을 열고 기존에 있던 왼쪽, 오른쪽, 위, 아래로 움직이는 애니메이션을 삭제하였습니다.
그리고 Any State와 Player-idle과 연결되어 있던 전환 또한 삭제하였습니다.

애니메이션 상태 머신에서 마우스 오른쪽 클릭 > Create State > From New Blend Tree 새로운 블렌드 노드를 생성합니다.

새로운 블렌드 노드를 선택하고 Inspector > 이름을 Move Tree로 변경하였습니다.

1. 애니메이터 창에서 Move Tree를 더블클릭합니다.
2. Blend Tree를 클릭하고 Inspector창 > Blend Type > 2D Simple Directional 설정합니다.
3. Parameters > xDir, yDir 입력합니다.
4. Add Motion Field로 4개의 Motion Field를 생성합니다.

Inspector > 각 Motion에 4가지의 애니메이션을 추가합니다.
애니메이터 창에서 4개의 애니메이션이 추가가 된 것을 확인합니다.

애니메이터 창 > + 버튼을 클릭하여 3개의 파라미터를 추가합니다.
isMove = bool 타입
xDir, yDir = float 타입으로 추가합니다.
이렇게 설정한 이유는
isMove의 타입이 플레이어가 이동중임을 나타내야 하기 때문에 bool타입을 이용해 true로 설정을 할 것입니다.
xDir, yDir는 스크립트를 작성할 때 Vector2 형식인 movement.x, movement.y의 속성이 float 형식이기 때문입니다.
※기존에 있던 AnimationState는 삭제합니다.

Pos X, 와 Pos Y를 이렇게 작성합니다.

애니메이터 창에 Base Layer로 이동한 뒤에 player-idle과 Move Tree에 전환을 생성하고
Has Exit Time(종료시간 있음) : 체크 해제
Fixed Duration(고정 지속 시간) : 체크 해제
Transition Duration(%)(전환 지속 시간)(%) : 0
Transition Offset(전환 오프셋) : 0
Conditions > + 추가
Coditions > isMove > ture
설정합니다.
player-idle 상태에서 Move 바뀌는 애니메이션 전환을 만든 것입니다.
다음은 그 반대인 Move에서 player-idle 상태로 바뀌는 전환을 만들겠습니다.

Has Exit Time(종료시간 있음) : 체크 해제
Fixed Duration(고정 지속 시간) : 체크 해제
Transition Duration(%)(전환 지속 시간)(%) : 0
Transition Offset(전환 오프셋) : 0
Conditions > + 추가
Coditions > isMove > false
위에 설정을 똑같지만 isMove > false로 다르다는 점은 유의하시기 바랍니다.
이제 스크립트를 작성해보도록 하겠습니다.
먼저 전체스크립트를 보여드리겠습니다.
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;
void Start()
{
animator = GetComponent<Animator>();
rigidbody2D = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
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 (Mathf.Approximately(movement.x, 0) && Mathf.Approximately(movement.y, 0))
{
animator.SetBool("isMove", false);
}
else
{
animator.SetBool("isMove", true);
}
animator.SetFloat("xDir", movement.x);
animator.SetFloat("yDir", movement.y);
}
}
핵심적인 코드만 살펴보겠습니다.
private void UpdateState()
{
if (Mathf.Approximately(movement.x, 0) && Mathf.Approximately(movement.y, 0))
{
animator.SetBool("isMove", false);
}
else
{
animator.SetBool("isMove", true);
}
animator.SetFloat("xDir", movement.x);
animator.SetFloat("yDir", movement.y);
}
Mathf.Apporximately() 메서드를 통하여 movement.x , movement.y 값이 0에 가까운지 확인합니다.
이 의미는 movement 벡터가 플레이어가 서있음을 나타내는 0의 값에 가까운지 확인하는 것입니다.
0에 가깝다면 isMove를 false인 상태로 설정을 하고 그렇지 않다면 true로 바꾸고 애니메이터를 업데이트합니다.
게임을 진행시켜 보면 정상적으로 애니메이션을 사용하며 캐릭터가 움직이는 것을 확인할 수 있습니다.
마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!
감사합니다! :)
'유니티2D' 카테고리의 다른 글
#9-2 유니티 타일 팔레트(도구 소개, 배경 그리기, 정렬 레이어) (0) | 2020.12.03 |
---|---|
#9-1 유니티 타일맵, 타일팔레트 (0) | 2020.12.01 |
#8-2 유니티 캐릭터(Player) 이동하기_애니메이션(전환) (1) | 2020.11.30 |
#8-1 유니티 캐릭터(Player) 이동하기 (0) | 2020.11.27 |
#7 유니티 프리팹(Prefab) (0) | 2020.11.27 |