using System.Collections; using System.Collections.Generic; using System.Linq; using Unity.Mathematics; using UnityEngine; namespace Ichni.RhythmGame { public class TimeDurationSubmodule: SubmoduleBase { public bool isOverridingDuration; //是否手动设置了时间区间,开启时,子物体的时间区间将被忽略 public float startTime, endTime; //起止时间 public TimeDurationSubmodule(BaseElement attachedElement) : base(attachedElement) { isOverridingDuration = false; startTime = -999;//TODO: 换为-delay endTime = 999;//TODO: 换为songLength } public TimeDurationSubmodule(BaseElement attachedElement, bool isOverridingDuration, float startTime, float endTime) : base(attachedElement) { this.isOverridingDuration = isOverridingDuration; this.startTime = startTime; this.endTime = endTime; } public bool CheckTimeInDuration(float time, float offset = 0.2f) { return time >= startTime - offset && time <= endTime + offset; } public void SetDuration(float startTime, float endTime) { this.startTime = startTime; this.endTime = endTime; } public void SetDuration(params FlexibleFloat[] flexibleFloats) { List startTimes = new List(); List endTimes = new List(); foreach (FlexibleFloat flexibleFloat in flexibleFloats) { flexibleFloat.Sort(); if (flexibleFloat.animations.Count > 0) { startTimes.Add(flexibleFloat.animations[0].startTime); endTimes.Add(flexibleFloat.animations[^1].endTime); } } startTime = startTimes.Min(); endTime = endTimes.Max(); } public void SetDurationFromChildren(List children) { List durations = new List(); if (children.Count == 0) { return; } foreach (var child in children) { durations.Add(new float2(child.startTime, child.endTime)); } startTime = durations.Min(duration => duration.x); endTime = durations.Max(duration => duration.y); } public override void SaveBM() { matchedBM = new Beatmap.TimeDurationSubmodule_BM(attachedElement, this); } } namespace Beatmap { public class TimeDurationSubmodule_BM : Submodule_BM { public bool isOverridingDuration; public float startTime, endTime; public TimeDurationSubmodule_BM() { } public TimeDurationSubmodule_BM(BaseElement attachedElement, TimeDurationSubmodule timeDurationSubmodule) : base(attachedElement) { isOverridingDuration = timeDurationSubmodule.isOverridingDuration; startTime = timeDurationSubmodule.startTime; endTime = timeDurationSubmodule.endTime; } public override void ExecuteBM() { attachedElement = GetElement(attachedElementGuid); attachedElement.timeDurationSubmodule = new TimeDurationSubmodule(attachedElement, isOverridingDuration, startTime, endTime); } public override void DuplicateBM(BaseElement attached) { attached.timeDurationSubmodule = new TimeDurationSubmodule(attached, isOverridingDuration, startTime, endTime); } } } }