유니티 5 애니메이션 시스템인 메카님에 대한 개괄적인 내용은 아래 링크를 참조하시기 바랍니다.


 위 링크에 나온 내용과 같이 5 버전부터는 스테이트에 스크립트(StateMachineBehaviour)를 추가할 수 있게 되었습니다. 그야말로 각 스테이트/스테이트머신에 대한 행동을 정의할 수 있게 되었죠. 따라서 코딩을 해야 할 경우 매우 단순하고 깔끔하게 처리할 수 있습니다. 이에 대한 좀더 자세한 내용은 아래 링크를 통해서 확인하실 수 있으니 읽어보시기 바랍니다.

 http://unity3d.com/learn/tutorials/modules/beginner/5-pre-order-beta/state-machine-behaviours



 링크 문서 내용 중에서 특히 주목해야 할 부분이 하나 있는데, 바로 StateMachineBehaviour과 MonoBehaviour의 차이점에 대해서 언급한 부분입니다. 둘 다 스크립트라는 점은 동일하지만, StateMachineBehaviour는 에셋이고 MonoBehaviour는 씬 오브젝트라는 점입니다. 이러한 차이로 인해 State Machine Behaviour 내에서 씬 오브젝트를 참조해야 할 경우에는 해당 씬 오브젝트를 검색(find)을 통하거나 인자로 넘겨받아야 합니다. 또한 각각의 스크립트 생성시점과도 연관이 있는데요, MonoBehaviour의 경우 GameObject가 추가된 시점에서 생성되는 반면에 StateMachineBehaviour는 Animator의 Awake 호출에 의해서 런타임 때 자동적으로 생성됩니다. 따라서 만약 MonoBehaviour의 Awake 함수에서 StateMachineBehaviour의 참조를 얻는 코드를 짜게 될 경우 예기치 못한 결과가 나올 수 있다는 점을 주의해야 합니다. 


 그 밖에 유의할 점은 State Machine Behaviour 의 콜백함수인 OnStateEnter와 OnStateExit의 호출 시점에 대한 부분입니다. OnStateEnter는 해당 스테이트의 애니메이션 재생이 시작되는 시점에서 호출되며, OnStateExit의 경우에는 해당 스테이트의 애니메이션 재생이 완료되는 시점에서 호출됩니다. 

그렇기 때문에 만약 A스테이트에서 시작하여 B스테이트로 트랜지션이 일어났다고 가정한다면,

A Enter -> B Enter -> A Exit -> B Exit   

순서로 호출됩니다. 트랜지션 인(in)의 시점에서 B Enter가 호출되고, 트랜지션 아웃(out)의 시점에서 A Exit이 호출되기 때문입니다.  


 OnStateExit의 경우에는 또 다른 이슈가 하나 있는데 바로 transition interruption 시에 호출되지 않는 경우가 있다는 사실입니다. 만약 A-B 트랜지션 도중에 A-C트랜지션에 의해 인터럽션이 일어나게 되면 B 스테이트의 OnStateExit의 경우는 호출될 기회를 잃게 됩니다. (이 부분에 대해서는 의도적인 설계인지 아닌지 메카님 개발팀에 확인이 필요한 부분입니다.) 





Posted by 흑 기사

댓글을 달아 주세요