Timeline搭配贝塞尔曲线
序
先前产品有个需求,沿时间线播放一个线性移动问题的动画,干脆用官方自带的画贝塞尔的Spline搭配Timeline实现了,现在闲下来打算整理一下的。突然发现自己又造轮子了,而且别人用的是更简便的方法,不需要自己定义轨道等等繁琐的配置,只要实现一个ITimeControl即可。
原帖:[Unity2022] 同步样条线和时间线。非常详细。
但他这里还是太简单了一些,速度全程匀速,持续时间也是要靠手动输入。
下面还是用PlayableAsset实现
PlayableAsset
效果:
这里改用一个AnimatedValue
配合timeline自带的动画曲线,可以实现不同位置的不同速度。
其他什么运动方向之类的就不再赘述了。
直接贴代码吧
using System;
using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Splines;
using UnityEngine.Timeline;
[Serializable]
public class MyPlayableAsset : PlayableAsset, ITimelineClipAsset
{
[Serializable]
public class MyBehaviour : PlayableBehaviour
{
[SerializeField] private ExposedReference<SplineContainer> _splineContainer;
[SerializeField] private ExposedReference<Transform> target;
public float AnimatedValue = 0;
public override void ProcessFrame(Playable playable, FrameData info, object playerData)
{
base.ProcessFrame(playable, info, playerData);
var spline = _splineContainer.Resolve(playable.GetGraph().GetResolver());
var targetTransform = target.Resolve(playable.GetGraph().GetResolver());
var position = spline.EvaluatePosition(AnimatedValue);
targetTransform.position = position;
}
}
public MyBehaviour template = new MyBehaviour();
public override Playable CreatePlayable(PlayableGraph graph, GameObject go)
{
return ScriptPlayable<MyBehaviour>.Create(graph, template);
}
public ClipCaps clipCaps
{
get { return ClipCaps.Extrapolation; }
}
}
Timeline搭配贝塞尔曲线
https://www.kuanmi.top/2023/01/29/SplineLine/