using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Dreamteck.Splines; using Lean.Pool; using Unity.Mathematics; using Unity.VisualScripting; using UnityEngine; namespace Ichni.RhythmGame { public class Displacement : AnimationBase { public TransformSubmodule targetTransformSubmodule; public FlexibleFloat positionX, positionY, positionZ; public static Displacement GenerateElement(string elementName, BaseElement targetObject, FlexibleFloat positionX, FlexibleFloat positionY, FlexibleFloat positionZ) { Displacement displacement = LeanPool.Spawn(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); displacement.NewInitialize(elementName, targetObject); displacement.positionX = positionX; displacement.positionY = positionY; displacement.positionZ = positionZ; displacement.animationReturnType = FlexibleReturnType.Before; if (targetObject.transformSubmodule != null) { displacement.targetTransformSubmodule = targetObject.transformSubmodule; } else { throw new System.Exception("Target object does not have a TransformSubmodule"); } displacement.SetTimeDuration(positionX, positionY, positionZ); return displacement; } private void Start() { targetTransformSubmodule = targetObject.transformSubmodule; } protected override void UpdateAnimation(float songTime) { positionX.UpdateFlexibleFloat(songTime); positionY.UpdateFlexibleFloat(songTime); positionZ.UpdateFlexibleFloat(songTime); if (positionX.returnType is FlexibleReturnType.MiddleExecuting || positionY.returnType is FlexibleReturnType.MiddleExecuting || positionZ.returnType is FlexibleReturnType.MiddleExecuting) { animationReturnType = FlexibleReturnType.MiddleExecuting; Vector3 currentPosition = new Vector3(positionX.value, positionY.value, positionZ.value); targetTransformSubmodule.positionOffset.Add(currentPosition); targetTransformSubmodule.positionDirtyMark = true; } else { animationReturnType = FlexibleReturnType.MiddleInterval; } //本体使用,用于判断动画是否结束 // else if (positionX.returnType is FlexibleReturnType.After or FlexibleReturnType.None && // positionY.returnType is FlexibleReturnType.After or FlexibleReturnType.None && // positionZ.returnType is FlexibleReturnType.After or FlexibleReturnType.None) // { // animationReturnType = FlexibleReturnType.After; // float3 currentPosition = new float3(positionX.value, positionY.value, positionZ.value); // targetTransformSubmodule.positionOffset.Add(currentPosition); // targetTransformSubmodule.positionDirtyMark = true; // Destroy(gameObject); // } } } }