Net.Like.Xue.Tokyo/Assets/BITKit/UnityPluginsSupport/UnitySpline/UnitySplineAnimateAsset.cs

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;
}
}