Howdy, Stranger!

It looks like you're new here. Sign in or register to get started.

If you have any questions, reports, suggestions, or requests about Live2D, please send them to this forum.
※We cannot guarantee statements or answers from Live2D staff. Thank you for your understanding in advance.
 
Live2D Cubism
Cubism Products and Downloads
Cubism product manuals and tutorials
Cubism Editor Manual    Cubism Editor Tutorial    Cubism SDK Manual    Cubism SDK Tutorial
[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.

多层级播放动画跳动问题

edited December 2023 in Help
在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];
}
}
}


Sign In or Register to comment.