关于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() { // 顶点的更新处理 }