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(new GameObject()).AddComponent();//TODO: 替换 new GameObject(); 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(); return displacement; } public override void SetTimeDuration() { positionX.Sort(); positionY.Sort(); positionZ.Sort(); List startTimes = new List(); List endTimes = new List(); if (positionX.animations.Count > 0) { startTimes.Add(positionX.animations[0].startTime); endTimes.Add(positionX.animations[^1].endTime); } if (positionY.animations.Count > 0) { startTimes.Add(positionY.animations[0].startTime); endTimes.Add(positionY.animations[^1].endTime); } if (positionZ.animations.Count > 0) { startTimes.Add(positionZ.animations[0].startTime); endTimes.Add(positionZ.animations[^1].endTime); } float startTime = startTimes.Min(); float endTime = endTimes.Max(); timeDurationSubmodule = new TimeDurationSubmodule(startTime, endTime); } protected void Update() { if (timeDurationSubmodule.CheckTimeInDuration(EditorManager.instance.songModule.songTime)) { UpdateAnimation(EditorManager.instance.songModule.songTime); } } public 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 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); // } } } }