不同工作流程的动态创建差异
最終更新: 2024年11月28日
各SDK动态相关特征
Workflow for Unity | Original Workflow(Native、Web、Unity、Java) | |
使用机制 | Mecanim | CubismMotionManager(Native、Web、Java)、CubismMotionController(Unity)、Mecanim(Unity) |
动态退出后未指定元素的行为 | 重置为初始值 | 动态退出时的值 |
保护部件之间的完整性 | 无 | 有 |
动态切换 | 使用线性插值进行切换 Mecanim指定的动态单位 |
参数为缓动插值 部件不透明度为线性插值 可以在3个区中注册渐变值 |
Unity和Mecanim的特点
Workflow for Unity中的动态控制由Unity的内置功能Mecanim完成。
使用的组件是Animator,它在图形环境中以状态转换的形式创建动态操作。
在状态转换切换控制中使用可以在Animator中设置的参数,要控制此参数,请在脚本、AnimationClip中使用Animator控制曲线等。
BlendTree可以相互混合动态,这是OWSDK所没有的。
当用于表情混合等时,此功能非常强大。
有关Mecanim的更多信息,请参考Unity官方手册的动画。
使用UnitySDK创建动态时的注意事项
部件一致性
最需要注意的是切换部件的一致性。
即使在Unity上,Original Workflow方法通过姿势功能自动保持一致性,但在Workflow for Unity中,需要注意动态到Animator上的状态转换,以保持部件的一致性。
·为所有切换部件输入一致的值。
如果设置了Write Defaults,未指定的参数和部件的值将返回到初始值,这可能会导致意外动作。
另外,在使用层功能时,可能会受到其他层的影响。
·不要在BlendTree中放入有切换的动态。
该部件的值可能会影响不彻底,显示可能会失真。
切换动态时的直线插值
而Native SDK在切换动态时使用缓动(EaseInOutSine)插值作为插值方式,Unity中Mecanim提供的插值方法是线性插值。
这种插值方法在透明度等方面看起来并不陌生,但在旋转变形器等线性插值中却给人一种机械的印象。
Original Workflow的特点
在Original Workflow中,使用Cubism Viewer(for OW)在.model3.json中注册,并通过代码调用来控制动态。
非图形环境,而是通过姿势功能自动实时地保持切换部件的一致性。
最终动态也可以用作状态转换使用,因为它具有在动态退出后保持值的特点。
还可以使用允许单独指定构图方法的表情动态。
程序修改
所有作为Original Workflow特点列出的项目都是在直接使用SDK中包含的Framework和范例时的特性。
如果您直接使用Framework或基于范例创建程序,将继承上述特性。
但是,由于Cubism SDK中除Core之外的所有程序都已公开,因此可以根据应用程序的规格变更SDK端的实装。
最后,请遵循使用Live2D模型的程序的规格。
使姿势功能正常动作
姿势功能是一种从动态到相应部件的规范监控,并将最先找到非零操作的部件识别为显示部件的方法。
与使用Workflow for Unity操作时一样,需要为所有切换部件设置一个值。
确保将隐藏设置为0也很重要,因为即使是很小的值也会在它们保留时做出反应。
不能进行动态中姿势功能以外的部件不透明度操作
由于部件的不透明度是通过姿势功能进行操作的,如果部件没有指定部件操作,即使在动态中进行了指定,操作也不会得到应用。
操作单个部件的显示/隐藏时,需要准备一对空部件。
动态调用特性
优先顺序
使用CubismMotionManager播放动态时,有一个设置播放优先顺序的项目。
您还可以为将来的播放预约优先级。
可以通过将播放和预约的优先顺序与动态播放请求的优先顺序进行比较来选择播放。
csmBool CubismMotionManager::ReserveMotion(csmInt32 priority) { if ((priority <= _reservePriority) || (priority <= _currentPriority)) { return false; } _reservePriority = priority; return true; }
渐变指定的优先顺序
在Original Workflow方法中,您可以在三个区中注册渐变时间。
循环设置
目前Cubism Animator中无法设置循环,因此导入Motion文件时的循环设置基本固定为False。
SDK for Unity使用Unity的动画播放机制,因此依赖于.motion3.json设置。
CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size) { CubismMotion* ret = CSM_NEW CubismMotion(); ret->Parse(buffer, size); ret->_sourceFrameRate = ret->_motionData->Fps; ret->_loopDurationSeconds = ret->_motionData->Duration; // NOTE:Editor不支持带循环的动态输出 // ret->_loop = (ret->_motionData->Loop > 0); return ret; }
要从动态文件中导入设置,请将上面注释的部分变更为以下内容并进行返回。
ret->_isLoop = (ret->_motionData->Loop > 0);
注意
由于ret->_loop不是正确的变量名,取消注释并将描述变更为ret->_isLoop。
另外,由于Editor中的设置当前不可用,您需要直接在文本编辑器中加工.motion3.json以变更动态文件中的设置。
此外,如果您在循环时将淡入设置指定为false,它的动作将类似于Editor。
要在循环时变更淡入设置,请将以下内容追加到之前指定的循环设置中。
ret->IsLoopFadeIn(false);
请注意,目前在动态文件中没有关于循环时淡入设置的设置项目。
在您想使用渐变进行切换,但不希望渐变在空闲时有效时,Loop设置是一个有效的设置。
不使用Loop设置的范例的闲置动作被设计为仅在没有动作的动态时才开始播放闲置动态。
因此,当创建一个从范例直接派生的程序时,有必要考虑使闲置动态的切换不明显。