- Today
- Total
프로그래밍 농장
Animator / Blending tree 구현 [ Unity ] 본문
유니티에서 오브젝트를 동작할때, 앞뒤좌우의 입력을 받으면 Animator에서 대응시킨 동작방식에 따라 동작하게 된다.
이때, 단순히 Input에 따른 동작을 수행하는것이 아니라, 동작간의 Translation Duration 의 조작, 그리고 Blend Tree를 활용한 다양한 애니메이션의 블랜딩을 통한 자연스러운 오브젝트 동작을 구현할수있다.
단순히 각 Input에 따른 Animator 동작을 수행하도록 구현하는것이 아닌, 예를 들어 앞뒤좌우의 이동동작에 대한 입력을 동시에 받아서 동작하도록 구현하고자 할때, 아래와 같이 Blend Tree를 하나 만들고 아래와 같이 각 Input에 대한 동작을 블랜딩해주면된다.
-> 위와 같이 Blend Tree는 여러개의 Animation을 부드럽게 섞으면서 현재 parameter에 따라서 어떤식으로 중첩할것인지를 판단하고 수행한다.
Animator에는 아래와 같이 Layers 필드에 여러가지의 Layers가 존재할수있다. 이는 Layer 상태머신을 여러개 만들어 놓음으로서, 한 플레이에서 두개이상의 Animator를 동작하도록 할수있다. -> 그러나 새로운 Layer를 단순히 구현할경우 이전에 존재하던 Animator를 덮어쓰게 됨으로 이를 잘 구현하여야한다.
톱니바퀴 -> weight가 0~1.0에 가까울수록 기존의 Layer를 덮어쓰게된다.
보통 Layer를 구분할때는 위와같이 몸과 얼굴, 또는 몸의 상하체를 구분하여 동작하도록 한다.
만약 상체만에 적용되는 ( weight가 1로서 덮어씌워져 수행되는) 작업을 수행하고자 한다면, 일단 아래와 같이 상체를 담당하는 레이어인 Upper Layer 하나 만들어 준 후, Animator Mask에서 하체를 비활성화 한 Mask를 넣어주면 된다.
IK (Inverese Kinematic)
IK : 어떤 위치를 중심으로 관절의 위치를 역계산하는 것. 물체의 위치가 어디든 상관없이 거기에 맞춰서 시선이나 팔의 위치가 결정될 때 많이 쓴다.
Sphere인 Ball 이름의 오브젝트를 만들어 게임이 시작되면 unitychan이 이 Ball을 잡는 애니메이션을 취하게 해보자.
- Ball 오브젝트의 위치를 중심으로 애니메이션의 관절의 위치를 결정한다.
애니메이션을 적용할때 특정지점을 중심으로 관절을 조절할때 사용한다.
ex) 특정한 오브젝트를 쳐다보는 시선처리 , 특정 오브젝트를 들고다닐때 양손을 들고있게해주는 처리 . .
- void OnAnimatorIK()
- 이벤트 함수.
- IK 정보가 갱신될때마다 유니티는 OnAnimatorIK 메세지를 뿌린다.
- 애니메이터가 붙어있는 오브젝트만 이 이벤트 함수를 동작시킬 수 있다.
void OnAnimatorIK()
{
//0에 가까울수록 덜 적용 (weight)
anim.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1.0f);
anim.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1.0f);
anim.SetIKPosition(AvatarIKGoal.LeftHand, target.position);
anim.SetIKRotation(AvatarIKGoal.LeftHand, target.rotation);
}
위는 유니티가 Animator에 적용한 IK정보를 갱신하려고 할때마다 수행되도록 한 함수이다.
'Unity' 카테고리의 다른 글
유니티 생명주기 (Monobehavior LifeCycle) (0) | 2022.07.28 |
---|---|
물리엔진 (0) | 2022.07.22 |
델리게이트(delegate) / 대리자 [ Unity ] (0) | 2022.07.12 |
유니티 이벤트 [ Unity ] (0) | 2022.07.11 |
Property [ Unity ] (0) | 2022.07.11 |