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 partial class Displacement : AnimationBase { public TransformSubmodule targetTransformSubmodule; public FlexibleFloat positionX, positionY, positionZ; public static Displacement GenerateElement(string elementName, Guid id, List tags, BaseElement targetObject, FlexibleFloat positionX, FlexibleFloat positionY, FlexibleFloat positionZ) { Displacement displacement = Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent(); displacement.Initialize(elementName, id, tags); displacement.targetObject = 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.SetParent(targetObject); displacement.timeDurationSubmodule.SetDuration(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); // } } } public partial class Displacement { public override void SaveBM() { matchedBM = new Beatmap.Displacement_BM(elementName, elementGuid, tags, parentElement.matchedBM, positionX.ConvertToBM(), positionY.ConvertToBM(), positionZ.ConvertToBM()); } } namespace Beatmap { public class Displacement_BM : BaseElement_BM { public FlexibleFloat_BM positionX, positionY, positionZ; public Displacement_BM() { } public Displacement_BM(string elementName, Guid elementGuid, List tags, BaseElement_BM attachedElement, FlexibleFloat_BM positionX, FlexibleFloat_BM positionY, FlexibleFloat_BM positionZ) : base(elementName, elementGuid, tags, attachedElement) { this.positionX = positionX; this.positionY = positionY; this.positionZ = positionZ; } public override void ExecuteBM() { Displacement.GenerateElement(elementName, elementGuid, tags, GetElement(attachedElementGuid), positionX.ConvertToGameType(), positionY.ConvertToGameType(), positionZ.ConvertToGameType()); } public override BaseElement DuplicateBM(BaseElement parent) { return Displacement.GenerateElement(elementName, elementGuid, tags, parent, positionX.ConvertToGameType(), positionY.ConvertToGameType(), positionZ.ConvertToGameType()); } } } }