using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using Unity.Mathematics; using UnityEngine; using UnityEngine.Playables; using UnityEngine.Splines; using UnityEngine.Timeline; namespace BITKit.Spline { public class UnitySplineAnimateBehaviour : PlayableBehaviour { public SplineAnimate splineAnimate { get; set; } public SplineContainer splineContainer { get; set; } public Transform additiveTransform { get; set; } public bool isNormalized; public override void OnBehaviourPlay(Playable playable, FrameData info) { if (splineAnimate) splineAnimate.Updated += OnSplineAnimateUpdated; } public override void OnBehaviourPause(Playable playable, FrameData info) { if (splineAnimate) splineAnimate.Updated -= OnSplineAnimateUpdated; } private void OnSplineAnimateUpdated(Vector3 position, Quaternion rotation) { if (splineAnimate == null) return; if (BITAppForUnity.IsEditor&& BITAppForUnity.IsPlaying is false) { var transform = splineAnimate.transform; var parent = transform.parent; var localPosition = position; var localRotation = rotation; if (parent != null) { localPosition = transform.parent.worldToLocalMatrix.MultiplyPoint3x4(position); localRotation = Quaternion.Inverse(parent.rotation) * localRotation; } transform.localPosition = localPosition; transform.localRotation = localRotation; } } public override void ProcessFrame(Playable playable, FrameData info, object playerData) { splineAnimate = playerData as SplineAnimate; if (!splineAnimate) { Debug.LogException(new NullReferenceException("SplineAnimate is null")); return; } var time = (float)playable.GetTime(); splineAnimate.Container = splineContainer; if (BITAppForUnity.IsEditor is false && BITAppForUnity.IsPlaying is false) { } else { if (isNormalized) { splineAnimate.NormalizedTime =info.deltaTime; } else { splineAnimate.ElapsedTime =time; } } } } [Serializable] [DisplayName("SplineAnimate Clip")] public class UnitySplineAnimateAsset : PlayableAsset,ITimelineClipAsset { private UnitySplineAnimateBehaviour template = new(); public ExposedReference spline; public AnimationCurve curve; public bool isNormalized; public override Playable CreatePlayable(PlayableGraph graph, GameObject owner) { var playable = ScriptPlayable.Create(graph,template); var behaviour = playable.GetBehaviour(); behaviour.splineContainer = spline.Resolve(graph.GetResolver()); behaviour.isNormalized = isNormalized; return playable; } public ClipCaps clipCaps => ClipCaps.None; } }