1
This commit is contained in:
109
Src/UnityPluginsSupport/UnitySpline/UnitySplineAnimateAsset.cs
Normal file
109
Src/UnityPluginsSupport/UnitySpline/UnitySplineAnimateAsset.cs
Normal file
@@ -0,0 +1,109 @@
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user