Files
ichni_Creator_Studio/Assets/ThemeBundles/DepartureToMultiverse/Scripts/NoteEffect/DTMNoteGenerateExtend.cs
TRAfoer 725009e354 大幅优化
Signed-off-by: TRAfoer <lhf190@outlook.com>
2025-10-05 11:45:32 +08:00

138 lines
4.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse
{
public class DTMNoteGenerateExtend : NoteGenerateEffect
{
private Hold hold;
private DTMNoteVisualHold noteVisualHold;
public float targetStartPercent, targetEndPercent;
public float startPercent, endPercent;
public DTMNoteGenerateExtend(NoteVisualBase noteVisual, float generateTime, float effectTime)
{
this.note = noteVisual.note;
this.hold = note as Hold;
this.noteVisual = noteVisual;
this.noteVisualHold = noteVisual as DTMNoteVisualHold;
this.generateTime = generateTime;
this.effectTime = effectTime;
}
private void UpdateHold()
{
hold.trackPositioner.SetPercent(startPercent);
noteVisualHold.meshGenerator.SetClipRange(startPercent, endPercent);
noteVisualHold.headPoint.SetPercent(startPercent);
noteVisualHold.tailPoint.SetPercent(endPercent);
}
public override void UpdateEffect(float triggerTime)
{
EffectState state = CheckEffectState(triggerTime);
float songTime = EditorManager.instance.songInformation.songTime;
triggerTime -= generateTime;
if (state == EffectState.Before)
{
if (nowEffectState != EffectState.Before)
{
nowEffectState = EffectState.Before;
effectProgressPercent = 0;
}
Recover();
}
else if (state == EffectState.Middle)
{
if (nowEffectState == EffectState.Before)
{
PreExecute();
}
nowEffectState = EffectState.Middle;
effectProgressPercent = (songTime - triggerTime) / effectTime;
Execute();
}
else if (state == EffectState.After && nowEffectState != EffectState.After)
{
if (nowEffectState != EffectState.Middle)
PreExecute();
nowEffectState = EffectState.After;
effectProgressPercent = 1;
Adjust();
}
}
public override void Recover()
{
if (noteVisualHold.noteMain.activeSelf)
noteVisualHold.noteMain.SetActive(false);
}
public override EffectBase_BM ConvertToBM()
{
return new DTMNoteGenerateExtend_BM(effectTime, generateTime);
}
public override void PreExecute()
{
TrackTimeSubmoduleMovable trackTimeSubmoduleMovable = hold.track.trackTimeSubmodule as TrackTimeSubmoduleMovable;
targetStartPercent = trackTimeSubmoduleMovable.GetTrackPercent(hold.exactJudgeTime);
targetEndPercent = trackTimeSubmoduleMovable.GetTrackPercent(hold.holdEndTime);
startPercent = targetStartPercent;
endPercent = targetStartPercent;
noteVisual.noteMain.SetActive(true);
UpdateHold();
}
public override void Execute()
{
float e = AnimationCurveEvaluator.Evaluate(AnimationCurveType.OutQuad, effectProgressPercent);
startPercent = targetStartPercent;
endPercent = Mathf.Lerp(targetStartPercent, targetEndPercent, e);
UpdateHold();
}
public override void Adjust()
{
startPercent = targetStartPercent;
endPercent = targetEndPercent;
UpdateHold();
}
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("DTM Note Generate Expand");
var subcontainer = container.GenerateSubcontainer(3);
var generateTimeField = inspector.GenerateInputField(this, subcontainer, "Generate Time", nameof(generateTime));
var effectTimeField = inspector.GenerateInputField(this, subcontainer, "Effect Time", nameof(effectTime));
}
}
namespace Beatmap
{
public class DTMNoteGenerateExtend_BM : NoteGenerateEffect_BM
{
public DTMNoteGenerateExtend_BM()
{
}
public DTMNoteGenerateExtend_BM(float effectTime, float generateTime) :
base(effectTime, generateTime)
{
}
public override EffectBase ConvertToGameType(GameElement attachedGameElement)
{
return new DTMNoteGenerateExtend(attachedGameElement as NoteVisualBase, generateTime, effectTime);
}
}
}
}