Playable是一个方便节点图操作的API,它允许你可以精确的以编程方式控制动画和音频。我们目前计划在视频上也使用同样的API。本篇文章将对Playable API进行介绍。
注意:
1、本文中的范例适用于Unity 5.4版本。
2、Playable API仍然处于测试阶段,我们还在努力使其更灵活和易用。Playable API在最终集成到将来的发行版本前会有所改变。

示例:播放剪辑
Playable系统的主要目标是:万事从简。现在让我们从最基础的播放一个剪辑开始操作。

210025wvwguiwsuyj4i29m.png
[C#] 纯文本查看 复制代码#using UnityEngine.Experimental.Director; ... AnimationClip clip ; // assign to your clips AnimationClipPlayable playable = AnimationClipPlayable.Create(clip); GetComponent<Animator>().Play(playable);
很简单是吧?我们可以很方便的控制时间和速度,就像这样:
[C#] 纯文本查看 复制代码playable.speed = speed; playable.time = time;创建一个动态混合树
通过BlendTrees可以在不同的AnimationClips,甚至在的BlendTrees之间混合动画值。Mecanim的BlendTrees非常强大,但是它们需要在编辑器中构建。通过Playable,就可以在运行中创建和控制BlendTrees。我们可以通过AnimationMixerPlayable来实现:
[C#] 纯文本查看 复制代码AnimationClip backwardClip; // assign to your clips AnimationClip forwardClip; // assign to your clips AnimatorMixerPlayable backForward = AnimationMixerPlayable.Create(); AnimationClipPlayable backwardPlayable = AnimationClipPlayable.Create(backwardClip); AnimationClipPlayable forwardPlayable = AnimationClipPlayable.Create(forwardClip); backForward.AddInput(backwardPlayable); backForward.AddInput(forwardPlayable); GetComponent<Animator>().Play(backForward);注意:请确保总权重等于1.0f。

自定义Playable : Crossfade

211228xpgzdg8z6w53rrrp.png
在设计Playable API时,我们一个关键目标是确保系统具有可扩展性。

CustomAnimationPlayable允许你编写自己的Playable逻辑。秘诀就是在Playable图形被游戏循环遍历到的时候PrepareFrame回调被自动调用。PrepareFrame是CustomPlayable的混合/加权逻辑发生的地方。

在下面的例子中,我们实现了CrossFade Playable,它看起来和表现的很像老的动画系统的CrossFade:
[C#] 纯文本查看 复制代码class CrossFadePlayable : CustomAnimationPlayable { private float m_TransitionDuration = 1.0f; private float m_TransitionTime = Mathf.Infinity; private float m_TransitionStart = 0.0f; private bool m_InTransition = false; private AnimationMixerPlayable mixer; public CrossFadePlayable() { mixer = AnimationMixerPlayable.Create(); Playable.Connect(mixer,this); mixer.AddInput(Playable.Null); mixer.AddInput(Playable.Null); } public void Play(AnimationPlayable playable) { Playable.Connect(playable, mixer, 0, 0); } public void Crossfade(AnimationPlayable playable, float transitionDuration) { Playable.Connect(playable, mixer, 0, 1); m_TransitionDuration = transitionDuration; m_TransitionTime = 0.0f; m_TransitionStart = Time.time; m_InTransition = true; } public override void PrepareFrame(FrameData info) { if (m_TransitionTime lt; = m_TransitionDuration) { m_TransitionTime = Time.time - m_TransitionStart; float weight = Mathf.Clamp01(m_TransitionTime / m_TransitionDuration); mixer.SetInputWeight(0, 1.0f - weight); mixer.SetInputWeight(1, weight); } else if (m_InTransition) { AnimationPlayable destinationPlayable = mixer.GetInput(1).CastTo(); mixer.RemoveAllInputs(); Playable.Connect(destinationPlayable,mixer, 0, 0); mixer.SetInputWeight(0, 1.0f); m_InTransition = false; } } }我们同时还在做另外一个名字将会叫做ProcessFrame的CustomPlayable回调。在动画中,通过它可以直接向动画流中写入并且可以使用户拥有他们自己的IK,程序性动画,物理系统,实时动作捕捉,等等。

通过AnimatorControllerPlayable组合一切

210026hcspprccckcxca6f.png
API另外一个很棒的特性就是节点图中可以有AnimatorControllers了。是的!这就意味着可以在StateMachines之间做混合了!允许对象和道具提供它们自己的动画StateMachine。

例如:有一样武器并且你想让武器可以“教”玩家怎么使用它。这个武器将向玩家提供AnimatorController (StateMachine),并且可以让玩家的动画混合到这个状态机上。
[C#] 纯文本查看 复制代码public class WeaponCollider : MonoBehaviour { public RuntimeAnimatorController WeaponStateMachine; private AnimatorControllerPlayable controllerPlayable; public void OnTriggerEnter(Collider other) { controllerPlayable = AnimationControllerPlayable.Create(WeaponStateMachine); other.gameObject.GetComponent<Animator>().CrossFade(controllerPlayable); } }CharacterPlayableHandler是CrossFade Playable之上的一个简单接口。

眼见为实
在运行时可视化Playable节点图是非常重要的。为了实现这个,我们创建了GraphVisualizer,这是一个可以预览Playable节点图的开源编辑器套件。

你可以在BitBucket下载它: https://bitbucket.org/Unity-Technologies/playablegraphvisualizer。

下载中包含了范例,并且非常容易使用!

关于音频
在GDC的开放日中我们展示了针对音频的Playable API,它的工作方式与当前的动画Playable API相似。

通过这个API可以在Unity内对音频进行有效的,低级别的控制。它不仅可以让程序员对Unity内的音频做一些新鲜有趣的事情,并且可以在编辑器内作为未来音频工具的基础。

我们本来希望提供关于Audio Playables的代码实例,但是Playable API现在还在不停的调整中,所以需要等待API完成才能向大家展示Audio Playables!

总结
我们希望这篇文章能让你对Playables感到兴奋,就像我们所说的,这是我们正在进行的工作,还有一些我们想要在它走出试验阶段之前修改和改进的东西。

所以,请试用并且告诉我们对它的想法! GDC, 动画, 音频, 新功能锐亚教育

锐亚教育 锐亚科技 unity unity教程