애니메이션 클립
- 3D 모델 프리팹 안에 애니메이션 클립이 같이 있는 경우가 있다.
- 이 경우 별개 에셋으로 복사해 애니메이션 파일을 빼내 편집할 수 있다.
- Animation 윈도우 탭에서 직접 애니메이션 클립을 만들 수 있다.
- 원하는 오브젝트를 선택 후 애니메이션 탭의 녹화 버튼을 누르고 오브젝트를 조작하면 선택한 키 프레임 때(타임라인을 드래그) 움직임이 저장된다.
애니메이터 컨트롤러(FSM)
- 유니티의 애니메이터는 FSM(Finite State Machine) 으로 구성되어 있다.
- FSM은 유한 상태 머신으로, 한 번에 한가지 상태만 존재할 수 있다.
애니메이터 파라미터
- Float, Int, Bool 형은 기본적인 문법과 동일
- Trigger은 점프와 같은, 한 번 해당 상태를 찍고 다시 돌아오게 된다면 쓰는 파라미터다.
- 사용법:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public Animator anim;
void Update()
{
if(Input.GetButtonDown("Jump")
anim.SetTrigger("jump"); //철자 중요
float horizontal = Input.GetAxis("Horizontal");
anim.SetFloat("horizontal", horizontal);
}
}
트랜지션
- 각 상태 간 전이를 설정해 줄 수 있다.
- Has Exit Time
- 해당 옵션을 체크해주면 전이할 때 이전 상태에서 애니메이션이 끝나기 까지 기다려준다.
- Fixed Duration
- 해당 옵션을 체크해주면 Transition Duration을 초 단위로 설정 가능하다.
- 해제 시, 0.0~1.0 으로 조절
- Transition Duration: 전이 중 양 측 애니메이션을 얼마나 블렌딩해줄지 정할 수 있다.
- 0에 가까울수록 바로 전이되지만 부자연스럽다.
- 1에 가까울수록 전이가 느려지지만 좀 더 자연스럽다.
- Transition Offset: 전이될 애니메이션이 언제부터 재생될 지 offset
- Conditions에서 전이되는 조건을 설정해 줄 수 있다.
- Any State: 어떤 상태였던 간에 조건을 충족하면 해당 상태로 전이 가능하도록 해주는 상태이다.
- ex) Idle, Walk 두 상태일 때 모두 Jump 상태로 전이 가능
- 주의할 점: 유니티에서는 아무 조건 설정 없이 Transition을 설정해두면 자동으로 전이되는데, 이 때는 Has Exit Time이 반드시 체크되어야 한다.
블랜드 트리
- 2D 어쩌구 3종류가 있는데 약간씩 다를 뿐 기능 자체는 비슷하다고 한다.
- 보통은 이런 식으로 Idle, 상하좌우 이동을 표현한다.
- 파라미터 값에 따라 적절히 애니메이션을 섞어준다.
- 블랜드 트리를 쓰면 FSM을 보다 더 간단하게 관리 가능하다.
루트 모션
- 애니메이터에 의해 플레이어의 좌표 값이 변경됨
- 코드를 통해 조작하고 싶다면 체크 해제해야 함 (일반적인 경우)
아바타
- Animation Type 이 같은 경우 모델이 다르더라도, 애니메이션은 같은 Animation Type끼리는 호환 가능하다.
애니메이터 레이어
- 동시에 여러개의 상태 머신을 실행
- 아래에 있을수록 표시 우선순위가 높다.
- Weight: 0.0~1.0으로 1에 가까울수록 상위 레이어와 섞임이 덜하고 해당 레이어만 표시된다.
- Mask : 만들어둔 유니티 마스크를 설정할 수 있는데, 마스크에서 아바타의 구성 중 어느 부분만 애니메이션이 적용되도록 할 것인지 마스킹하는 파일이다.
-Blending
- Override : 덮어씌움
- Additive : 적절히 섞음
IK (Inverse Kinematic)
- 특정 지점을 기준으로 모델의 관절 위치를 역계산
- 물체의 위치를 기점으로 시선이나 팔의 위치 등을 결정하고자 할 때 사용
public Transform target;
//해당 함수는 유니티가 IK를 갱신하려할때마다 실행됨.
void OnAnimatorIK() //애니메이터가 부착된 오브젝트에서만 실행됨.
{
//SetIK~Weight() 함수는 IK의 우선순위를 정함( 0.0~1.0)
anim.SetIKPositionWeight(AvartarIKGoal.LeftHand, 1.0);
anim.SetIKRotationWeight(AvartarIKGoal.LeftHand, 1.0);
anim.SetIKPosition(AvartarIKGoal.LeftHand, target.position);
anim.SetIKRotation(AvartarIKGoal.LeftHand, target.rotation);
//target을 보도록
anim.SetLookAtWeight(1.0f);
anim.SetLookAtPosition(target.position);
}
- 적용하려면 애니메이션의 레이어 설정에서 IK Pass를 체크해야 함.
- 관절 범위 내면 target을 따라 이동, 거리가 멀면 해당 방향을 향함.