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