동아리 스터디를 통해 자료조사 한 내용을 백업.
Notion에서 쓴 걸 옮겨오는 거라 중간중간 이상한 부분 있을 수 있음...
Unity의 Animation
Animator 컴포넌트
- GameObject에 Animation을 할당하기 위해 사용함.
- Animator Controller에 대한 참조가 필요함.
- Animation Controller
: Animation 클립들과 Animation Transition을 조정하여 Animation을 다양한 방법으로 재생될 수 있게 함. - Animation Transition
: 애니메이션의 전환, 각 애니메이션이 전환되는 사이에 필요한 기간 및 전환 조건 등을 정의함.
Animation Controller
- Parameters (Event Parameters Widget)
: 스크립트를 통해 접근하고 할당될 수 있는 변수. 스크립트로 State Machine의 흐름을 제어할 수 있게 해줌.
- Bool, Float, Integer, Trigger 형식의 변수를 선언할 수 있음.
- 각각의 타입의 변수는 스크립트에서 SetFloat, SetInteger, SetBool, SetTrigger, ResetTrigger 등을 통해 제어할 수 있음. - Layers (Animation Layers)
: 각각의 다른 파츠에 대해 복잡한 State Machine을 제어할 때 사용. (아마 머리, 몸, 팔, 다리 등으로 부위가 나뉜 경우를 말하는 듯)
Inspector (Animation)
- Loop Time : Animation이 재생된 후 계속 루프할 것인지를 결정함. 체크를 해제하면 Animation이 한 번 재생된 후 다시 재생되지 않음.
State Machine
- States : 캐릭터가 취할 수 있는 액션. (걷기, 달리기 등...)
- State Transitions : 현재 상태에서 캐릭터가 넘어갈 수 있는 다음 상태에 대한 옵션.
→ 각 상태와 전환, 현재 상태를 기억하기 위한 변수가 합쳐져 State Machine 을 구성.
→ States, Transitions, Events 로 구성.
Animation States
: Animation State Machine의 기본 블록.
캐릭터가 해당 상태에 있을 때 재생할 애니메이션을 가짐.
- Speed : 기본 속도.
- Motion : 해당 상태에서 재생할 애니메이션.
- Transitions : 해당 상태에서부터 파생된 Transitions들.
* 아래의 3가지의 상태는 기본적으로 존재하는 상태들.
- Any State (모든 상태)
: 현재의 상태와는 상관 없이 특정 조건을 만족하면 해당 상태로 이동할 때 사용. Animation State Machine내의 모든 상태에 대해 동일한 전환을 추가할 때 사용함. 단, '전환의 끝'에 위치하는 것은 불가능.
2. Entry : 시작 상태. 애니메이션에 처음 진입했을 때의 시점.
3. Exit : 종료 상태. 모든 상태가 종료되는 시점.
Animation Transitions
(각 Transition에 대해서는 이름을 설정해줄 수 있음.)
- Has Exit Time : 캐릭터가 다른 State로 변화하여도 현재 재생 중인 애니메이션이 끝날 때까지 유지.
- Conditions : 전환이 일어날 조건의 설정.
이하는 스샷에 없는 Settings 내의 설정들.
Property | 기능 |
Exit Time | Has Exit Time이 활성화되어있을 경우, 애니메이션의 전환이 실행될 시간을 나타냄. ex) 0.5로 설정되어있을 경우, 전환 조건이 만족 되더라도 현재 재생중인 애니메이션이 최소 50%는 재생되어야 전환이 이루어짐. |
Fixed Duration | Fixed Duration이 활성화되어있을 경우, 전환 시간을 초 단위로 나타냄. |
Transition Duration | 두 애니메이션(전환 전과 후)이 겹치는 정도. (0 ~ 1 사이 값) |
Transition Offset | 애니메이션의 재생 시간을 정의. (0 ~ 1 사이 값) |
Interruption Source | 애니메이션 전환이 중단되는 상황의 제어에 사용. (참고: https://jinhomang.tistory.com/116) |
이하는 기존 에셋의 구조를 분석&활용해본 예시.
사용 에셋 : Brackeys 2D Mega Pack
(https://assetstore.unity.com/packages/2d/free-2d-mega-pack-177430)
- 사용한 Sprite : BlobPlayer_Blue
- 전체 Sprite
- BlobPlayer_Blue.controller 의 구성
- Idle : Player가 아무 동작도 하지 않을 때의 기본 애니메이션.
- Walk : Player가 걸어다닐 때의 애니메이션.
- Jump : Player가 위로 점프할 때의 애니메이션.
- Land : Player가 점프한 뒤 착지할 때의 애니메이션.
- BlobPlayer_Blue 에 애니메이션 적용
- Walking : Player가 지면 위에서 이동 중인지 나타냄.
- Jumping : Player가 점프 중인지 나타냄.
- Landing : Player가 착지 중인지(공중에서 아래로 하강하는 중인지) 나타냄.
- onGround : Player가 지면 위에 있는지 나타냄.
//PlayerController.cs
/*
private Animator ani;
ani = GetComponent<Animator>();
*/
if (rigidBody.velocity.normalized.x == 0)
{
//Player가 멈췄을 때
ani.SetBool("Walking", false);
}
else
{
//Player가 이동할 때
ani.SetBool("Walking", true);
}
if (rigidBody.velocity.y < 0)
{
//점프 직후 하강할 때
ani.SetBool("Landing", true);
}
else if (rigidBody.velocity.y == 0)
{
//하강 후 지면에 착지했을 때
ani.SetBool("Landing", false);
ani.SetBool("onGround", true);
}
if (Input.GetButtonDown("Jump") && onGround) {
//점프 시
rigidBody.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
ani.SetBool("Jumping", true);
onGround = false;
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "Ground")
{
//지면에 착지 시
ani.SetBool("Jumping", false);
onGround = true;
}
}
참고
더보기
* 자료가 번역체라 이해가 안 가서 이것저것 블로그 자료도 찾아봤음...
'공부 > Unity' 카테고리의 다른 글
Raycast & LayerMask (쪼까 추가 (0) | 2021.04.18 |
---|---|
Tilemap (feat. World Building) (0) | 2021.04.09 |
Input 정리 (0) | 2021.03.12 |