修noteprefab和submodule

This commit is contained in:
SoulliesOfficial
2025-05-10 23:28:21 -04:00
parent 9e65c7eea0
commit ab2f79090e
19 changed files with 163 additions and 78 deletions

File diff suppressed because one or more lines are too long

View File

@@ -45,9 +45,12 @@ namespace Ichni.RhythmGame
this.baseColorDirtyMark = false;
this.emissionColorDirtyMark = false;
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
}
}
public ColorSubmodule(GameElement attachedGameElement, Color originalBaseColor) : base(attachedGameElement)
@@ -64,8 +67,11 @@ namespace Ichni.RhythmGame
this.baseColorDirtyMark = false;
this.emissionColorDirtyMark = false;
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
}
}
public ColorSubmodule(GameElement attachedGameElement, Color originalBaseColor, bool emissionEnabled,
@@ -83,8 +89,11 @@ namespace Ichni.RhythmGame
this.baseColorDirtyMark = false;
this.emissionColorDirtyMark = false;
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveColorSubmodule).colorSubmodule = this;
(attachedGameElement as IHaveColorSubmodule).SetColorObserver();
}
}
public override void SaveBM()

View File

@@ -37,14 +37,17 @@ namespace Ichni.RhythmGame
effectCollection.Add("Miss", new List<EffectBase>());
effectCollection.Add("AfterJudge", new List<EffectBase>());
}
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
}
}
public EffectSubmodule(GameElement attachedGameElement, Dictionary<string, List<EffectBase_BM>> effectList_BM) : base(attachedGameElement)
{
effectCollection = new Dictionary<string, List<EffectBase>>();
foreach (var effect in effectList_BM)
{
List<EffectBase> effectList = new List<EffectBase>();
@@ -62,10 +65,14 @@ namespace Ichni.RhythmGame
effectList.Add(effectBM.ConvertToGameType(attachedGameElement));
}
}
effectCollection.Add(effect.Key, effectList);
}
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveEffectSubmodule).effectSubmodule = this;
}
}
}

View File

@@ -12,7 +12,11 @@ namespace Ichni.RhythmGame
public NoteJudgeTriggerSubmodule(GameElement attachedGameElement) : base(attachedGameElement)
{
connectedNotes = new List<NoteBase>();
(attachedGameElement as IHaveNoteJudgeTriggerSubmodule).noteJudgeTriggerSubmodule = this;
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveNoteJudgeTriggerSubmodule).noteJudgeTriggerSubmodule = this;
}
}
public override void SaveBM()

View File

@@ -13,18 +13,24 @@ namespace Ichni.RhythmGame
public GameElement attachedGameElement;
public BaseElement_BM matchedBM { get; set; }
/// <summary>
/// 在生成时检测是否已经有重复的submodule
/// </summary>
public bool HaveSameSubmodule { get; set; }
public SubmoduleBase(GameElement attachedGameElement)
{
this.attachedGameElement = attachedGameElement;
HaveSameSubmodule = attachedGameElement.submoduleList.Any(x => x.GetType() == this.GetType());
if (attachedGameElement.submoduleList.Any(x => x.GetType() == this.GetType()))
if (HaveSameSubmodule)
{
Debug.LogWarning("存在重复的Submodule");
LogWindow.Log($"There are repeated submodule on Game Element {attachedGameElement.elementName}", Color.yellow);
Debug.LogAssertion($"存在重复的Submodule: {GetType()},此操作无效");
LogWindow.Log($"There are repeated submodule {GetType()} on Game Element {attachedGameElement.elementName}", Color.red);
return;
}
this.attachedGameElement.submoduleList.Add(this);
}

View File

@@ -16,19 +16,26 @@ namespace Ichni.RhythmGame
public TimeDurationSubmodule(GameElement attachedGameElement) : base(attachedGameElement)
{
isOverridingDuration = false;
startTime = -32767;//TODO: 换为-delay
endTime = 32767;//TODO: 换为songLength
startTime = -32767; //TODO: 换为-delay
endTime = 32767; //TODO: 换为songLength
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
}
}
public TimeDurationSubmodule(GameElement attachedGameElement, bool isOverridingDuration, float startTime, float endTime) : base(attachedGameElement)
public TimeDurationSubmodule(GameElement attachedGameElement, bool isOverridingDuration, float startTime, float endTime) :
base(attachedGameElement)
{
this.isOverridingDuration = isOverridingDuration;
this.startTime = startTime;
this.endTime = endTime;
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveTimeDurationSubmodule).timeDurationSubmodule = this;
}
}
public bool CheckTimeInDuration(float time, float offset = 0.2f)

View File

@@ -30,7 +30,7 @@ namespace Ichni.RhythmGame
public bool scaleDirtyMark;
public bool eulerAnglesOffsetLock;
public TransformSubmodule(GameElement attachedGameElement) : base(attachedGameElement)
{
this.originalPosition = Vector3.zero;
@@ -51,8 +51,11 @@ namespace Ichni.RhythmGame
eulerAnglesOffsetLock = false;
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
}
}
public TransformSubmodule(GameElement attachedGameElement,
@@ -75,13 +78,16 @@ namespace Ichni.RhythmGame
scaleDirtyMark = true;
eulerAnglesOffsetLock = false;
attachedGameElement.transform.localScale = currentScale;
attachedGameElement.transform.localEulerAngles = currentEulerAngles;
attachedGameElement.transform.localPosition = currentPosition;
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
if (!HaveSameSubmodule)
{
(attachedGameElement as IHaveTransformSubmodule).transformSubmodule = this;
(attachedGameElement as IHaveTransformSubmodule).SetTransformObserver();
}
}
public override void SaveBM()

View File

@@ -53,6 +53,7 @@ namespace Ichni.RhythmGame
this.tags = tags;
EditorManager.instance.beatmapContainer.gameElementList.Add(this);
submoduleList = new List<SubmoduleBase>();
if (isFirstGenerated)
{
SetDefaultSubmodules();

View File

@@ -17,7 +17,7 @@ namespace Ichni.RhythmGame
public List<string> holdStartAudioList;
private NoteBase note => attachedGameElement as NoteBase;
public NoteAudioSubmodule(NoteBase attachedGameElement, string defaultAudio) : base(attachedGameElement)
{
generalJudgeAudioList = new List<string>();
@@ -26,14 +26,17 @@ namespace Ichni.RhythmGame
badAudioList = new List<string>();
missAudioList = new List<string>();
holdStartAudioList = new List<string>();
generalJudgeAudioList.Add(defaultAudio);
this.note.noteAudioSubmodule = this;
if (!HaveSameSubmodule)
{
this.note.noteAudioSubmodule = this;
}
}
public NoteAudioSubmodule(NoteBase attachedGameElement, List<string> generalJudgeAudioList,
List<string> perfectAudioList, List<string> goodAudioList, List<string> badAudioList,
public NoteAudioSubmodule(NoteBase attachedGameElement, List<string> generalJudgeAudioList,
List<string> perfectAudioList, List<string> goodAudioList, List<string> badAudioList,
List<string> missAudioList, List<string> holdStartAudioList) : base(attachedGameElement)
{
this.generalJudgeAudioList = generalJudgeAudioList;
@@ -42,8 +45,11 @@ namespace Ichni.RhythmGame
this.badAudioList = badAudioList;
this.missAudioList = missAudioList;
this.holdStartAudioList = holdStartAudioList ?? new List<string>();
this.note.noteAudioSubmodule = this;
if (!HaveSameSubmodule)
{
this.note.noteAudioSubmodule = this;
}
}
}

View File

@@ -10,24 +10,30 @@ namespace Ichni.RhythmGame
{
public List<NoteJudgeUnit> judgeUnitList;
private NoteBase note => attachedGameElement as NoteBase;
public NoteJudgeSubmodule(NoteBase attachedGameElement) : base(attachedGameElement)
{
judgeUnitList = new List<NoteJudgeUnit>();
this.note.noteJudgeSubmodule = this;
if (!HaveSameSubmodule)
{
this.note.noteJudgeSubmodule = this;
}
}
public NoteJudgeSubmodule(NoteBase attachedGameElement, List<NoteJudgeUnit_BM> judgeUnitList_BM) : base(attachedGameElement)
{
judgeUnitList = new List<NoteJudgeUnit>();
foreach (NoteJudgeUnit_BM judgeUnitBM in judgeUnitList_BM)
{
judgeUnitList.Add(judgeUnitBM.ConvertToGameType(attachedGameElement));
}
this.note.noteJudgeSubmodule = this;
if (!HaveSameSubmodule)
{
this.note.noteJudgeSubmodule = this;
}
}
}

View File

@@ -20,6 +20,12 @@ namespace Ichni.RhythmGame
{
Flick flick = Instantiate(EditorManager.instance.basePrefabs.flickNote, parentElement.transform)
.GetComponent<Flick>();
if (EditorManager.instance.useNotePrefab)
{
isFirstGenerated = false;
}
flick.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
flick.exactJudgeTime = exactJudgeTime;
flick.availableFlickDirections = directions;

View File

@@ -22,6 +22,12 @@ namespace Ichni.RhythmGame
{
Hold hold = Instantiate(EditorManager.instance.basePrefabs.holdNote, parentElement.transform)
.GetComponent<Hold>();
if (EditorManager.instance.useNotePrefab)
{
isFirstGenerated = false;
}
hold.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
hold.exactJudgeTime = exactJudgeTime;
hold.holdEndTime = holdEndTime;

View File

@@ -16,6 +16,12 @@ namespace Ichni.RhythmGame
GameElement parentElement, float exactJudgeTime)
{
Stay stay = Instantiate(EditorManager.instance.basePrefabs.stayNote, parentElement.transform).GetComponent<Stay>();
if (EditorManager.instance.useNotePrefab)
{
isFirstGenerated = false;
}
stay.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
stay.exactJudgeTime = exactJudgeTime;

View File

@@ -17,6 +17,12 @@ namespace Ichni.RhythmGame
{
Tap tap = Instantiate(EditorManager.instance.basePrefabs.tapNote, parentElement.transform)
.GetComponent<Tap>();
if (EditorManager.instance.useNotePrefab)
{
isFirstGenerated = false;
}
tap.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
tap.exactJudgeTime = exactJudgeTime;

View File

@@ -25,8 +25,7 @@ namespace Ichni.RhythmGame
Track.TrackSamplingType trackSamplingType, bool isClosed, bool isShowingDisplay) : base(track)
{
this.path = track.AddComponent<SplineComputer>();
this.track.trackPathSubmodule = this;
this.pathNodeList = new List<PathNode>();
this.trackSpaceType = trackSpaceType;
this.trackSamplingType = trackSamplingType;
@@ -43,6 +42,11 @@ namespace Ichni.RhythmGame
this.trackDisplay.size = 0.1f;
this.SetDisplay(isShowingDisplay);
if (!HaveSameSubmodule)
{
this.track.trackPathSubmodule = this;
}
}
}

View File

@@ -25,12 +25,16 @@ namespace Ichni.RhythmGame
public TrackRendererSubmodule(Track track, bool enableEmission, float emissionIntensity, bool zWrite) : base(track)
{
this.track.trackRendererSubmodule = this;
this.enableEmission = enableEmission;
this.emissionIntensity = emissionIntensity;
this.materialThemeBundleName = String.Empty;
this.materialName = String.Empty;
this.zWrite = zWrite;
if (!HaveSameSubmodule)
{
this.track.trackRendererSubmodule = this;
}
}
public void ApplyMaterial(string materialThemeBundleName, string materialName)

View File

@@ -11,8 +11,10 @@ namespace Ichni.RhythmGame
public TrackTimeSubmodule(Track track) : base(track)
{
this.track = track;
this.track.trackTimeSubmodule = this;
if (!HaveSameSubmodule)
{
this.track.trackTimeSubmodule = this;
}
}
public override void SaveBM()

View File

@@ -312,7 +312,10 @@ namespace Ichni
e.submoduleList.ForEach(s =>
{
s.SaveBM();
clip.Add(s.matchedBM);
if (s.matchedBM != null)
{
clip.Add(s.matchedBM);
}
});
});

View File

@@ -4,32 +4,24 @@
"value" : [
{
"__type" : "Ichni.RhythmGame.Beatmap.Tap_BM,Assembly-CSharp",
"exactJudgeTime" : 12.3,
"exactJudgeTime" : 1.5,
"elementName" : "New Tap",
"tags" : [
],
"elementGuid" : {
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
},
"attachedElementGuid" : {
"value" : "9abab7b8-d2af-4e43-8c1b-4ef6607fca38"
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"isOverridingDuration" : true,
"startTime" : -2,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp",
"judgeUnitList" : [
],
"attachedElementGuid" : {
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.NoteAudioSubmodule_BM,Assembly-CSharp",
@@ -52,7 +44,15 @@
],
"attachedElementGuid" : {
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp",
"judgeUnitList" : [
],
"attachedElementGuid" : {
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMNoteVisual_BM,Assembly-CSharp",
@@ -63,10 +63,10 @@
],
"elementGuid" : {
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
},
"attachedElementGuid" : {
"value" : "f9eb34bd-f4ad-4427-999d-aa8f6c6e4263"
"value" : "2e799f8e-1dab-46ab-967f-c8d7c99bf4fe"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
@@ -86,7 +86,7 @@
"z" : 1
},
"attachedElementGuid" : {
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
@@ -94,7 +94,7 @@
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
@@ -113,7 +113,7 @@
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
@@ -154,7 +154,7 @@
]
},
"attachedElementGuid" : {
"value" : "6d4dbf74-1140-44b5-a253-80b06a4546c6"
"value" : "585fe6cd-3c41-47ee-b6d2-147fdc2b182d"
}
}
]