Timeline搭配贝塞尔曲线

先前产品有个需求,沿时间线播放一个线性移动问题的动画,干脆用官方自带的画贝塞尔的Spline搭配Timeline实现了,现在闲下来打算整理一下的。突然发现自己又造轮子了,而且别人用的是更简便的方法,不需要自己定义轨道等等繁琐的配置,只要实现一个ITimeControl即可。

原帖:[Unity2022] 同步样条线和时间线。非常详细。

但他这里还是太简单了一些,速度全程匀速,持续时间也是要靠手动输入。
下面还是用PlayableAsset实现

PlayableAsset

效果:
Spline

这里改用一个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/
作者
KuanMi
发布于
2023年1月29日
许可协议