150 lines
4.5 KiB
C#
150 lines
4.5 KiB
C#
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<string> tags, bool isFirstGenerated, GameElement parentElement)
|
|
{
|
|
Track track = Instantiate(GameManager.instance.basePrefabs.track, parentElement.transform).GetComponent<Track>();
|
|
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<string> tags, GameElement_BM attachedElement)
|
|
: base(elementName, elementGuid, tags, attachedElement)
|
|
{
|
|
|
|
}
|
|
|
|
public override void ExecuteBM()
|
|
{
|
|
matchedElement = Track.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid));
|
|
}
|
|
}
|
|
}
|
|
} |