[Notice of Holidays]
Please note that our staff will not be available from 2024/Dec/28 - 2025/Jan/5 JST.
The Live2D Creators Forum will remain open during the holidays.
Submissions that require a response will be answered after we reopen for business.
Please note that it will take longer than usual to respond to your request.
在unity 是 使用live2d 的 CubismMotionController 播放多层级动画问题, 首先我先说明我之前遇到的问题
因为美术 需要两个动画同时播放 互不干扰,当然这需要动画之间修改的参数 并没有相同的 所以我理所当然的使用了多层级播放动画,
首先 第一层动画 我循环播放着 idle 动画, 第二层 则播放一些交互动画 例如用户点击 时 播放一下触摸动画 用户说话时播放一下口型动画
而 在实际应用的时候 我发现 当我在第二层 切换播放动画时候 在切换过程中 会导致第一层动画 发生跳动的问题。
解决方案:
经过一系列的排查 最后 查到是CubismFadeController 组件在作怪,原因是 因为在切换第二层动画时, CubismFadeController会播放过渡效果, 而在播放过渡效果的时候 会将 所有参数给重置
这行代码: _parameterStore.RestoreParameters();
导致第一层动画控制的param值发生重置 从而出现跳动的问题,而我的解决方法就是不让他全部重置,而是找出当前播放过度效果控制的param列表 传参过去 告诉_parameterStore 只需要将这些参数进行重置
以下是我修改过的地方
CubismFadeController.cs
public void OnLateUpdate()
{
.......
// _parameterStore.RestoreParameters(); [源代码 注释掉]
List parameters = new List();
for (var i = 0; i < _fadeStates.Length; ++i)
{
if (_isFading[i])
{
var motions = _fadeStates[i].GetPlayingMotions();
foreach (var motion in motions)
{
var fadeMotion = motion.Motion;
parameters.AddRange(fadeMotion.ParameterIds);
}
}
}
_parameterStore.RestoreParameters(parameters);
.......
}
CubismParameterStore.cs
public void RestoreParameters(List parameters)
{
// Fail silently...
if (!enabled)
{
return;
}
// restore parameters value
if (_parameterValues != null)
{
for (var i = 0; i < _parameterValues.Length; ++i)
{
if (parameters.Contains(DestinationParameters[i].Id))
{
DestinationParameters[i].Value = _parameterValues[i];
}
}
}
// restore parts opacity
if (_partOpacities != null)
{
for (var i = 0; i < _partOpacities.Length; ++i)
{
DestinationParts[i].Opacity = _partOpacities[i];
}
}
}
1 ·