[ARPG阶段二] 18.两个动画的简化Blend及测试
提供简化的两个动画Blend的方法并对Blend模式测试。
首先对上一节漏了一块逻辑补一下,传进来的AudioClipList是要对其进行权重设置的。
public void SetBlendWeight(List<float> weightList)
{
for (int i = 0; i < blendClipPlayableList.Count; i++)
{
blendMixer.SetInputWeight(i, weightList[i]);
}
}
另外加了Blend要给Mixer开放三个端口,ResetMixer的时候记得清空clipList。
// 创建混合器
mixer = AnimationMixerPlayable.Create(graph,3);
public void ResetBlend(int animationCount)
{
//创建Blend混合器
graph.Disconnect(mixer, 2);
blendMixer = AnimationMixerPlayable.Create(graph, animationCount);
graph.Connect(blendMixer, 0, mixer, 2);
blendClipPlayableList.Clear();
}
有时候我们Blend的只是两个动画,不希望传一个List,所以做方法的重载,将List改写成传入两个AnimationClip,对应权重参数传一个即可。
/// <summary>
/// 播放混合动画(2个)
/// </summary>
/// <param name="clips"></param>
/// <param name="speed"></param>
/// <param name="transitionFixedTime"></param>
public void PlayBlendAnimaiton(AnimationClip clip1,AnimationClip clip2, float speed = 1, float transitionFixedTime = 0.25f)
{
ResetBlend(2);
currentisBlend = true;
CreateAndConnectBlendPlayable(clip1, 0, speed);
CreateAndConnectBlendPlayable(clip2, 1, speed);
//如果是第一次播放,不存在过度
if (clipPlayable1.Equals(default(AnimationClipPlayable))) return;
//设置过渡
if (transitionCoroutine != null) StopCoroutine(transitionCoroutine);// 避免开启多个协程
if (currentisClipPlayable1)
{
transitionCoroutine = StartCoroutine(TransitionAnimation(0, 2, transitionFixedTime));
}
else
{
transitionCoroutine = StartCoroutine(TransitionAnimation(1, 2, transitionFixedTime));
}
}
public void SetBlendWeight(float clip1Weight)
{
blendMixer.SetInputWeight(0, clip1Weight);
blendMixer.SetInputWeight(1, 1 - clip1Weight);
}
测试
之前我们写的PlayAnimation和PlayBlendAnimation都是在AnimationController里面的方法,为了让外界调用,我们需要在PlayController里再包装一层。PlayerController->PlayerView->AnimationController。
public void PlayBlendAnimaiton(string clip1Name, string clip2Name, float speed = 1, float transitionFixedTime = 0.25f)
{
AnimationClip clip1 = warriorConfig.GetAnimationByName(clip1Name);
AnimationClip clip2 = warriorConfig.GetAnimationByName(clip2Name);
view.Animation.PlayBlendAnimaiton(clip1, clip2, speed, transitionFixedTime);
}
public void SetBlendAnimationWeight(float clip1Weight)
{
view.Animation.SetBlendWeight(clip1Weight);
}
在玩家的移动状态进入时,我们对原来的播放单个动画部分改成播放Blend动画,并通过按键更改走和跑的权重来实现切换。
效果:
Unity独立游戏开发-ARPG 文章被收录于专栏
Unity独立游戏开发