using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame.Beatmap; using Sirenix.OdinInspector; using UniRx; namespace Ichni.RhythmGame { public partial class Track : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule { public TransformSubmodule transformSubmodule { get; set; } public TimeDurationSubmodule timeDurationSubmodule { get; set; } public TrackPathSubmodule trackPathSubmodule { get; set; } public TrackTimeSubmodule trackTimeSubmodule { get; set; } public TrackRendererSubmodule trackRendererSubmodule { get; set; } public static Track GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, GameElement parentElement) { Track track = Instantiate(GameManager.instance.basePrefabs.track, parentElement.transform).GetComponent(); track.Initialize(elementName, id, tags, isFirstGenerated, parentElement); if (parentElement is ElementFolder folder) { folder.trackList.Add(track); } return track; } [Button] public override void SetDefaultSubmodules() { transformSubmodule = new TransformSubmodule(this); timeDurationSubmodule = new TimeDurationSubmodule(this); trackPathSubmodule = new TrackPathSubmodule(this, TrackSpaceType.CatmullRom, TrackSamplingType.TimeDistributed, false, false); trackTimeSubmodule = null; trackRendererSubmodule = null; } private void Update() { if (!GameManager.instance.audioManager.isUpdating) { return; } if (timeDurationSubmodule.CheckTimeInDuration(GameManager.instance.songTime)) { (trackTimeSubmodule as TrackTimeSubmoduleMovable)?.UpdateTrackPart(); } } private void LateUpdate() { if(trackPathSubmodule != null) trackPathSubmodule.refreshedThisFrame = false; } public override void AfterInitialize() { base.AfterInitialize(); if (trackPathSubmodule != null && trackPathSubmodule.pathNodeList.Count > 3) { trackPathSubmodule.ClosePath(); } if(trackRendererSubmodule != null) { trackRendererSubmodule.meshGenerator.autoUpdate = false; } } public override void BeforeStart() { switch (trackPathSubmodule.trackSpaceType) { case Track.TrackSpaceType.CatmullRom: trackPathSubmodule.GenerateCatmullRomSpline(); break; case Track.TrackSpaceType.Linear: trackPathSubmodule.GenerateLinearSpline(); break; case Track.TrackSpaceType.BSpline: trackPathSubmodule.GenerateBSpline(); break; } base.BeforeStart(); } public override void Refresh() { base.Refresh(); trackPathSubmodule?.Refresh(); trackTimeSubmodule?.Refresh(); trackRendererSubmodule?.Refresh(); } public override void OnDelete() { if (parentElement is ElementFolder folder) folder.trackList.Remove(this); } } public partial class Track { public override void SaveBM() { matchedBM = new Track_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM); } } public partial class Track { public enum TrackSpaceType { CatmullRom = 0, BSpline = 1, Linear = 3 } public enum TrackSamplingType { TimeDistributed = 0, DistanceDistributed = 1 } } namespace Beatmap { public class Track_BM : GameElement_BM { public Track_BM() { } public Track_BM(string elementName, Guid elementGuid, List tags, GameElement_BM attachedElement) : base(elementName, elementGuid, tags, attachedElement) { } public override void ExecuteBM() { matchedElement = Track.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid)); } } } }