关于Cubism SDK for Unity中的参数操作

最終更新: 2020年1月31日

使用Cubism SDK for Unity操作模型参数的值时,需要在Unity的Event函数MonoBehaviour.LateUpdate()到MonoBehaviour.OnPreRender()的时间点进行。

Unity中Event函数的执行顺序请参考 此处 。

播放AnimationClip的处理是在Unity的Event函数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中的动作

从2018年1月起,Unity追加了“Scriptable Render Pipeline(SRP)”,这是一种允许您使用C#脚本控制渲染设置和执行的机制。

有关SRP的详细信息,请参考Unity官方文档

使用此渲染管道时,不会调用Unity的部分Event函数。

在Cubism SDK for Unity中,从设置的参数值更新模型顶点的处理由CubismModel.OnRenderObject()执行。
这是因为在更新参数值的LateUpdate()之后调用了顶点更新处理,而在SRP项目中没有调用MonoBehaviour.OnRenderObject()。

在Cubism SDK for Unity R1或更高版本中,如果项目是支持SRP的Unity 2018.1或更高版本,则更新顶点的函数注册为在LateUpdate()之后由PlayerLoop调用。

        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()
        {
            
            // 顶点的更新处理
            
        }
请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。