Animation Blend Tree 활용하기
[스토리]
손을 편 상태에서 주먹을 쥐는 애니메이션을 Controller의 Trigger버튼을 눌렀을 때 적용하고 싶다.
첫 번째 방법) Trigger Down 상태가 되었을 때 손을 쥐는 Animation을 실행시킨다.
첫 번째 방법을 사용하면, Animation의 Speed와 여러가지 옵션을 만져야 하기 때문에 번거롭고
무엇보다 아름다워 보이지 않는다. (조금만 외부 설정이 변경되어도 옵션을 자주 만져줘야 하기 때문.)
두 번째 방법) Blend Tree를 활용하여 Idle Animation과 Grip Animation을 섞어준다.
이 방법은 Trigger 버튼을 누르는 정도에 따라 값을 설정하고
값에 따라 Idle상태, Grip상태를 각각 나타내는 Animation을 섞어 표현한다.
후자의 방법을 사용하면 전자에서 표현할 수 없었던 '중간 단계'의 Animation을 표현할 수 있게 된다.
(Trigger를 반만 누른다면 주먹을 쥐는 Animation도 절반만 실행된다. 즉, 반주먹을 쥐고 있을 것이다.)
1. 준비
- 손을 표현할 Model (*.fbx)
물론 손가락을 움직여야 하기 때문에 Joint와 Bone이 필요함.
- 손 Model로 만든 Idle, Grip 애니메이션
Idle은 가만히 있는 대기 상태, Grip은 손을 쥐고 있는 상태
2. 적용
Unity에서 Animator를 생성한다.
Blend Tree에는 Action Motion값에 따른 HandIdle, HandClick Tree가 있다.
Action이 0일 때 → HandIdle Tree 실행
Action이 1일 때 → HandClick Tree 실행
Action이 0 < n < 1 → HandIdle과 HandClick을 섞어준다. (Blend 한다.)
* Blend Tree의 Inspector *
Motion에는 시작 전에 준비한 HandIdle, HandClick Animation을 넣어준다.
3. 소스코드 작성
Animator를 생성하고 그 내부를 Blend Tree로 꾸몄으니, 작동하게 만들어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using UnityEngine; using Valve.VR; using Valve.VR.InteractionSystem; public class CustomHand : MonoBehaviour { Animator animator = null; Hand currentHand = null; [SerializeField] SteamVR_Action_Single squeezeAction = null; // Use this for initialization void Start() { animator = GetComponent<Animator>(); currentHand = GetComponentInParent<Hand>(); } // Update is called once per frame void Update() { if ( animator != null && squeezeAction != null ) animator.SetFloat( "Action" , squeezeAction.GetAxis( currentHand.handType ) ); } } | cs |
간단하게 설명하면, squeezeAction은 SteamVR에서 지원하는 Vive Controller의 Trigger 버튼을 의미한다.
Update 함수에서 Trigger버튼이 눌려질 때마다 Animator의 Action이라는 Parameter의 값을 변경해준다.
이 스크립트를 위에서 만든 Animator Component가 있는 GameObject에 Add해주고 실행한다.
4. Debug
- Trigger를 눌렀을 때 Action은 변하지만 Animation이 적용되지 않을 때
Blend Tree는 두 Animation을 섞어주기 때문에 Idle에서 '상태 변화가 완료된 (주먹을 쥔 상태) Animation이 필요하다.
이게 무슨 말인가 하면, 손을 편 상태에서 주먹을 쥘 때 까지의 Animation이 아닌 주먹을 쥐고 있는 상태 Animation이 필요하다는 말이다.
- 스크립트 Error
스크립트를 Add Component하고 Inspector에서 Squeeze Action을 지정해주지 않으면 발생할 수 있다.
5. 응용
이렇게 간단한 Animation을 섞을 수도 있지만 더 다양한 일을 해낼 수 있다.
가령 걷다가 달리는 Animation의 전환이 필요하다면 두 Animation을 섞어 자연스럽게 (사람이 가속도를 내는 것처럼) 표현할 수 있다.
* 추후에 Blend Tree를 응용한다면 포스팅 올라갈 예정
'C# Unity3D' 카테고리의 다른 글
[Physics] 빠르게 움직이는 Object의 충돌 감지 (0) | 2019.03.22 |
---|---|
[Physics] Cast에 관해서 Gizmo 그리기 (0) | 2019.03.19 |
[Physics] Kinematic Object에서 Velocity 값 얻기 (0) | 2019.03.19 |
[Physics] 마그누스 효과, 공기저항 적용하기 (0) | 2019.03.14 |
[Physics] Raycast를 활용한 충돌감지 (0) | 2019.03.13 |