Cubism SDK for Unity에서의 파라미터 조작 정보

업데이트: 2020/01/31

Cubism SDK for Unity에서 모델 파라미터의 값을 조작하는 경우 Unity 이벤트 함수의 MonoBehaviour.LateUpdate()에서 MonoBehaviour.OnPreRender()까지의 타이밍에 수행해야 합니다.

Unity 이벤트 함수의 실행 순서에 대해서는 여기 를 참조하십시오.

AnimationClip을 재생시키는 처리는 Unity의 이벤트 함수 MonoBehaviour.Update()와 MonoBehaviour.LateUpdate() 사이에서 이루어집니다.
만일 파라미터의 값을 MonoBehaviour.Update()로 조작했을 경우 직후에 재생되는 AnimationClip의 값에 의해 덮어쓰기되어 버립니다.
따라서 파라미터의 값을 조작하는 경우 AnimationClip이 값을 설정한 후에 수행합니다.

Cubism SDK for Unity와 함께 제공되는 모든 컴포넌트는 MonoBehaviour.LateUpdate()에서 파라미터 값을 조작합니다.

또한 각 프레임에서 파라미터의 값으로부터 모델의 정점 갱신 처리를 CubismModel.OnRenderObject()로 실시하고 있기 때문에, 이것보다 나중에 값의 조작을 실시하면 계산되지 않습니다.

※CubismModel.OnRenderObject()는 Scene에 배치된 각 Camera가 렌더링을 마친 타이밍에 호출되기 때문에, Scene에 여러 Camera가 배치되어 있는 경우 CubismModel.OnRenderObject()가 Camera의 수만큼 호출됩니다. 

SRP에서의 동작

Unity는 2018.1부터 렌더링 설정과 실행을 C# 스크립트로 제어할 수 있는 구조인 「Scriptable Render Pipeline(SRP)」이 추가되었습니다.

SRP 자체에 대한 자세한 내용은 Unity 공식 문서를 참조하십시오.

이 렌더 파이프라인을 사용하면 Unity의 일부 이벤트 함수가 호출되지 않습니다.

Cubism SDK for Unity에서는 설정된 파라미터의 값으로 모델의 정점을 갱신하는 처리를 CubismModel.OnRenderObject()로 수행하고 있습니다.
이것은 정점의 갱신 처리를 파라미터의 값을 갱신하는 LateUpdate()보다 나중에 호출하기 위해서인데, MonoBehaviour.OnRenderObject()는 SRP의 프로젝트에서는 호출되지 않습니다.

Cubism SDK for Unity R1 이상에서는, 프로젝트가 SRP에 대응한 Unity 2018.1 이상의 경우 정점의 갱신 처리를 실시하는 함수를 PlayerLoop에 의해 LateUpdate() 후에 호출되도록 등록하고 있습니다.

        private bool WasAttachedModelUpdateFunction { get; set; }

        ...

        /// <summary>
        /// Called by Unity. Triggers <see langword="this"/> to update.
        /// </summary>
        private void Update()
        {
#if UNITY_2018_1_OR_NEWER
            if (!WasAttachedModelUpdateFunction)
            {
                _modelUpdateFunctions += OnModelUpdate;


                WasAttachedModelUpdateFunction = true;
            }
#endif

        ...

        /// <summary>
        /// Called by Unity. Destroys instance.
        /// </summary>
        private void OnDisable()
        {
#if UNITY_2018_1_OR_NEWER
            if (WasAttachedModelUpdateFunction)
            {
                _modelUpdateFunctions -= OnModelUpdate;


                WasAttachedModelUpdateFunction = false;
            }
#endif
        }
        
        /// <summary>
        /// Called by Unity. Blockingly updates <see langword="this"/> on first frame enabled; otherwise tries async update.
        /// </summary>
        private void OnRenderObject()
        {
#if !UNITY_2018_1_OR_NEWER
            OnModelUpdate();
#endif
        }
          
        ...

        /// <summary>
        /// Update model states.
        /// </summary>
        private void OnModelUpdate()
        {
            
            // 정점 업데이트 처리
            
        }
이 기사가 도움이 되었나요?
아니요
이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.