110 lines
2.7 KiB
C#
110 lines
2.7 KiB
C#
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<SplineContainer> spline;
|
|
public AnimationCurve curve;
|
|
public bool isNormalized;
|
|
public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
|
|
{
|
|
var playable = ScriptPlayable<UnitySplineAnimateBehaviour>.Create(graph,template);
|
|
|
|
var behaviour = playable.GetBehaviour();
|
|
|
|
behaviour.splineContainer = spline.Resolve(graph.GetResolver());
|
|
|
|
behaviour.isNormalized = isNormalized;
|
|
|
|
return playable;
|
|
}
|
|
public ClipCaps clipCaps => ClipCaps.None;
|
|
}
|
|
}
|