using System.Collections; using System.Collections.Generic; using Dreamteck.Splines; using Ichni.RhythmGame.Beatmap; using Unity.VisualScripting; using UnityEngine; namespace Ichni.RhythmGame { public partial class TrackPathSubmodule : TrackSubmodule { public SplineComputer path; public List pathNodeList; public Track.TrackSpaceType trackSpaceType; public Track.TrackSamplingType trackSamplingType; public bool isClosed; public TrackPathSubmodule(Track track, Track.TrackSpaceType trackSpaceType, Track.TrackSamplingType trackSamplingType, bool isClosed) : base(track) { this.path = track.AddComponent(); track.trackPathSubmodule = this; this.pathNodeList = new List(); this.trackSpaceType = trackSpaceType; this.trackSamplingType = trackSamplingType; this.isClosed = isClosed; SetUpSplineComputer(this.trackSpaceType, this.trackSamplingType); //闭合路径在PathNode生成时执行,在初始化的情况下,PathNode数量为0,不会执行闭合操作 } } public partial class TrackPathSubmodule { private void SetUpSplineComputer(Track.TrackSpaceType trackSpaceType, Track.TrackSamplingType trackSamplingType) { path.type = (Spline.Type)(int)trackSpaceType; path.sampleMode = (SplineComputer.SampleMode)(int)trackSamplingType; path.space = SplineComputer.Space.Local; } public void ClosePath(bool close) { if (close) { path.Close(); } else { path.Break(); } isClosed = close; } public void SetTrackSpaceType(int spaceType) { trackSpaceType = (Track.TrackSpaceType)spaceType; path.type = (Spline.Type)spaceType; } public void SetPathNode(PathNode point) { path.SetPoint(point.index, point.node, SplineComputer.Space.Local); } } public partial class TrackPathSubmodule { override public void SaveBM() { matchedBM = new TrackPathSubmodule_BM(attachedGameElement, this); } } namespace Beatmap { public class TrackPathSubmodule_BM : Submodule_BM { public Track.TrackSpaceType trackSpaceType; public Track.TrackSamplingType trackSamplingType; public bool isClosed; public TrackPathSubmodule_BM() { } public TrackPathSubmodule_BM(GameElement attachedElement, TrackPathSubmodule trackPathSubmodule) : base( attachedElement) { this.trackSpaceType = trackPathSubmodule.trackSpaceType; this.trackSamplingType = trackPathSubmodule.trackSamplingType; this.isClosed = trackPathSubmodule.isClosed; } public override void ExecuteBM() { attachedElement = GameElement_BM.GetElement(attachedElementGuid); Track track = attachedElement as Track; track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed); } public override void DuplicateBM(GameElement attached) { Track track = attachedElement as Track; track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed); } } } }