基础内容11 - SAVE LOAD EXPORT

This commit is contained in:
SoulliesOfficial
2025-02-08 23:09:50 -05:00
parent 7ab738cb68
commit e3a8450a27
61 changed files with 1229 additions and 237 deletions

View File

@@ -39,7 +39,7 @@ namespace Ichni.RhythmGame
this.elementName = name;
this.elementGuid = elementGuid;
this.tags = tags;
EditorManager.instance.elementList.Add(this);
EditorManager.instance.beatmapContainer.gameElementList.Add(this);
submoduleList = new List<SubmoduleBase>();
if (isFirstGenerated)
{
@@ -123,7 +123,7 @@ namespace Ichni.RhythmGame
#if UNITY_EDITOR
Debug.Log("Delete " + elementName + "(" + elementGuid + ")");
#endif
EditorManager.instance.elementList.Remove(this); //从保存列表中剔除
EditorManager.instance.beatmapContainer.gameElementList.Remove(this); //从保存列表中剔除
this.parentElement.childElementList.Remove(this);
Destroy(gameObject); //销毁
}
@@ -167,20 +167,19 @@ namespace Ichni.RhythmGame
{
return element_BM;
}
Debug.LogAssertion("Element not found or do not have id");
return null;
}
public static GameElement GetElement(Guid id)
{
return GetElementBM(id)?.matchedElement;
if(identifier.TryGetValue(id, out GameElement_BM element_BM))
{
return element_BM.matchedElement;
}
return null;
}
/// <summary>
/// 从存档类中生成游戏物体
/// </summary>
public abstract void ExecuteBM();
/// <summary>
/// 复制物体

View File

@@ -39,12 +39,14 @@ namespace Ichni.RhythmGame
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
//(attachedElement as NoteElement).noteJudgeSubmodule = new NoteJudgeSubmodule(attachedElement);
(attachedElement as NoteBase).noteJudgeSubmodule = new NoteJudgeSubmodule(attachedElement as NoteBase);
attachedElement.submoduleList.Add((attachedElement as NoteBase).noteJudgeSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
//(attached as NoteElement).noteJudgeSubmodule = new NoteJudgeSubmodule(attached);
(attached as NoteBase).noteJudgeSubmodule = new NoteJudgeSubmodule(attached as NoteBase);
attached.submoduleList.Add((attached as NoteBase).noteJudgeSubmodule);
}
}

View File

@@ -7,7 +7,7 @@ using UnityEngine;
namespace Ichni.RhythmGame
{
public abstract partial class NoteBase : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule, IHaveEffectSubmodule
public abstract partial class NoteBase : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule
{
[Title("Basic Info")]
public float exactJudgeTime;
@@ -23,7 +23,6 @@ namespace Ichni.RhythmGame
[Title("Submodules")]
public TransformSubmodule transformSubmodule { get; set; }
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public EffectSubmodule effectSubmodule { get; set; }
public NoteJudgeSubmodule noteJudgeSubmodule { get; set; }
[Title("In-Game Info")]
@@ -59,12 +58,10 @@ namespace Ichni.RhythmGame
{
transformSubmodule = new TransformSubmodule(this);
timeDurationSubmodule = new TimeDurationSubmodule(this);
effectSubmodule = new EffectSubmodule(this, EffectSubmodule.EffectSubmodulePreset.Note);
noteJudgeSubmodule = new NoteJudgeSubmodule(this);
submoduleList.Add(transformSubmodule);
submoduleList.Add(timeDurationSubmodule);
submoduleList.Add(effectSubmodule);
submoduleList.Add(noteJudgeSubmodule);
}
@@ -93,24 +90,27 @@ namespace Ichni.RhythmGame
isJudged = true;
}
}
effectSubmodule.effectCollection["Generate"].ForEach(e => e.UpdateEffect());
effectSubmodule.effectCollection["GeneralJudge"].ForEach(e => e.UpdateEffect());
switch (EditorManager.instance.currentJudgeType)
if (noteVisual != null)
{
case NoteJudgeType.Perfect:
effectSubmodule.effectCollection["Perfect"].ForEach(e => e.UpdateEffect());
break;
case NoteJudgeType.Good:
effectSubmodule.effectCollection["Good"].ForEach(e => e.UpdateEffect());
break;
case NoteJudgeType.Bad:
effectSubmodule.effectCollection["Bad"].ForEach(e => e.UpdateEffect());
break;
case NoteJudgeType.Miss:
effectSubmodule.effectCollection["Miss"].ForEach(e => e.UpdateEffect());
break;
noteVisual.effectSubmodule.effectCollection["Generate"].ForEach(e => e.UpdateEffect());
noteVisual.effectSubmodule.effectCollection["GeneralJudge"].ForEach(e => e.UpdateEffect());
switch (EditorManager.instance.currentJudgeType)
{
case NoteJudgeType.Perfect:
noteVisual.effectSubmodule.effectCollection["Perfect"].ForEach(e => e.UpdateEffect());
break;
case NoteJudgeType.Good:
noteVisual.effectSubmodule.effectCollection["Good"].ForEach(e => e.UpdateEffect());
break;
case NoteJudgeType.Bad:
noteVisual.effectSubmodule.effectCollection["Bad"].ForEach(e => e.UpdateEffect());
break;
case NoteJudgeType.Miss:
noteVisual.effectSubmodule.effectCollection["Miss"].ForEach(e => e.UpdateEffect());
break;
}
}
}

View File

@@ -4,7 +4,7 @@ using UnityEngine;
namespace Ichni.RhythmGame
{
public abstract class NoteVisualBase : SubstantialObject
public abstract class NoteVisualBase : SubstantialObject, IHaveEffectSubmodule
{
public NoteBase note;
@@ -13,5 +13,14 @@ namespace Ichni.RhythmGame
public List<GameObject> notePartList;
public List<GameObject> effectPartList;
public EffectSubmodule effectSubmodule { get; set; }
protected override void SetDefaultSubmodules()
{
base.SetDefaultSubmodules();
effectSubmodule = new EffectSubmodule(this, EffectSubmodule.EffectSubmodulePreset.Note);
submoduleList.Add(effectSubmodule);
}
}
}

View File

@@ -39,6 +39,8 @@ namespace Ichni.RhythmGame
private void Update()
{
Debug.Log(timeDurationSubmodule == null);
if (timeDurationSubmodule.CheckTimeInDuration(EditorManager.instance.songModule.songTime))
{
(trackTimeSubmodule as TrackTimeSubmoduleMovable)?.UpdateTrackPart();

View File

@@ -98,7 +98,7 @@ namespace Ichni.RhythmGame
public override void ExecuteBM()
{
CrossTrackPoint.GenerateElement(elementName, elementGuid, tags, false,
matchedElement = CrossTrackPoint.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid) as ElementFolder, trackSwitch, trackPercent);
}

View File

@@ -71,7 +71,7 @@ namespace Ichni.RhythmGame
public override void ExecuteBM()
{
TrackHeadPoint.GenerateElement(elementName, elementGuid, tags, false,
matchedElement = TrackHeadPoint.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid) as Track);
}

View File

@@ -98,7 +98,7 @@ namespace Ichni.RhythmGame
public override void ExecuteBM()
{
TrackPercentPoint.GenerateElement(elementName, elementGuid, tags, false,
matchedElement = TrackPercentPoint.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid) as Track, trackPercent.ConvertToGameType());
}

View File

@@ -19,7 +19,7 @@ namespace Ichni.RhythmGame
public TrackPathSubmodule(Track track, Track.TrackSpaceType trackSpaceType, Track.TrackSamplingType trackSamplingType, bool isClosed) : base(track)
{
this.path = track.AddComponent<SplineComputer>();
track.trackPathSubmodule = this;
this.track.trackPathSubmodule = this;
this.pathNodeList = new List<PathNode>();
this.trackSpaceType = trackSpaceType;
this.trackSamplingType = trackSamplingType;
@@ -100,12 +100,14 @@ namespace Ichni.RhythmGame
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed);
track.submoduleList.Add(track.trackPathSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
Track track = attachedElement as Track;
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed);
track.submoduleList.Add(track.trackPathSubmodule);
}
}

View File

@@ -14,7 +14,6 @@ namespace Ichni.RhythmGame
public TrackRendererSubmodule(Track track) : base(track)
{
this.track = track;
this.track.trackRendererSubmodule = this;
}
@@ -78,12 +77,14 @@ namespace Ichni.RhythmGame
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmodule(track);//TODO: Implement Material
track.submoduleList.Add(track.trackRendererSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmodule(track);//TODO: Implement Material
track.submoduleList.Add(track.trackRendererSubmodule);
}
}
}

View File

@@ -39,9 +39,7 @@ namespace Ichni.RhythmGame
this.trackTotalTime = trackEndTime - trackStartTime;
this.visibleTrackTimeLength = visibleTrackTimeLength;
this.animationCurveType = animationCurveType;
track.timeDurationSubmodule.startTime = trackStartTime;
track.timeDurationSubmodule.endTime = trackEndTime + visibleTrackTimeLength;
//timeDurationSubmodule 根据下辖Note的时间来设置
}
public void UpdateTrackPart()
@@ -98,12 +96,14 @@ namespace Ichni.RhythmGame
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackTimeSubmodule = new TrackTimeSubmoduleMovable(track, trackStartTime, trackEndTime, visibleTrackTimeLength, animationCurveType);
track.submoduleList.Add(track.trackTimeSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackTimeSubmodule = new TrackTimeSubmoduleMovable(track, trackStartTime, trackEndTime, visibleTrackTimeLength, animationCurveType);
track.submoduleList.Add(track.trackTimeSubmodule);
}
}
}
@@ -123,9 +123,6 @@ namespace Ichni.RhythmGame
this.animationCurveType = animationCurveType;
this.headPercent = 0;
this.tailPercent = 1;
track.timeDurationSubmodule.startTime = -999;
track.timeDurationSubmodule.endTime = 999;
//timeDurationSubmodule 根据下辖Note的时间来设置
}
@@ -158,12 +155,14 @@ namespace Ichni.RhythmGame
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackTimeSubmodule = new TrackTimeSubmoduleStatic(track, trackTotalTime, animationCurveType);
track.submoduleList.Add(track.trackTimeSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackTimeSubmodule = new TrackTimeSubmoduleStatic(track, trackTotalTime, animationCurveType);
track.submoduleList.Add(track.trackTimeSubmodule);
}
}
}