프로그래밍 농장

Animator / Blending tree 구현 [ Unity ] 본문

Unity

Animator / Blending tree 구현 [ Unity ]

Tennessee201 2022. 7. 14.
728x90

유니티에서 오브젝트를 동작할때, 앞뒤좌우의 입력을 받으면 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정보를 갱신하려고 할때마다 수행되도록 한 함수이다. 

 

 

 

 

 

 

 

728x90

'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