我不理解,这check那check就是出不来

Signed-off-by: TRAfoer <lhf190@outlook.com>
This commit is contained in:
2025-10-03 18:21:40 +08:00
parent b9c23e3af8
commit ba1824d5d6
25 changed files with 197808 additions and 181369 deletions

View File

@@ -14,7 +14,7 @@ namespace Ichni.RhythmGame
{
public partial class Hold : NoteBase
{
public static List<Hold> holdingHoldList = new();
//public static List<Hold> holdingHoldList = new();
public float holdEndTime;
public float holdingTime;
@@ -65,7 +65,6 @@ namespace Ichni.RhythmGame
{
EditorManager.instance.projectManager.notePrefabManager.LoadNotePrefab(hold, GetNoteTypeName(hold) + "_Prefab");
}
return hold;
}
@@ -157,17 +156,24 @@ namespace Ichni.RhythmGame
public partial class Hold
{
protected override void Update()
// 添加类级别缓存
private static HashSet<Hold> holdingHoldSet = new HashSet<Hold>(); // 替换List为HashSet
public override void UpdateNote()
{
if (Keyboard.current.hKey.wasPressedThisFrame)
{
foreach (KeyValuePair<string, List<EffectBase>> effect in noteVisual.effectSubmodule.effectCollection)
// 优化避免字典枚举和Lambda
var effectCollection = noteVisual.effectSubmodule.effectCollection;
foreach (var pair in effectCollection)
{
effect.Value.ForEach(x => x.Disrupt());
var effects = pair.Value;
for (int i = 0; i < effects.Count; i++)
{
effects[i].Disrupt();
}
}
}
if (holdEndTime < exactJudgeTime)
{
LogWindow.Log("Hold end time is earlier than exact judge time.", Color.red);
@@ -192,7 +198,6 @@ namespace Ichni.RhythmGame
{
isHolding = false;
isFinalJudged = true;
//noteAudioSubmodule?.PlayNoteJudgeAudios(EditorManager.instance.currentJudgeType);//有待商榷
}
}
@@ -206,56 +211,74 @@ namespace Ichni.RhythmGame
}
}
// 优化避免LINQ查询
if (noteJudgeSubmodule != null && !EditorManager.instance.cameraManager.isSceneCameraActive)
{
foreach (NoteJudgeUnit unit in noteJudgeSubmodule.judgeUnitList.Where(unit => unit.isShowingJudge))
var judgeUnits = noteJudgeSubmodule.judgeUnitList;
for (int i = 0; i < judgeUnits.Count; i++)
{
unit.UpdateJudge();
var unit = judgeUnits[i];
if (unit.isShowingJudge)
{
unit.UpdateJudge();
}
}
}
if (noteVisual != null)
{
noteVisual.effectSubmodule.effectCollection["Generate"].ForEach(e => e.UpdateEffect(exactJudgeTime));
noteVisual.effectSubmodule.effectCollection["StartHold"].ForEach(e => e.UpdateEffect(exactJudgeTime));
noteVisual.effectSubmodule.effectCollection["Holding"].ForEach(e => e.UpdateEffect(exactJudgeTime));
// 优化:缓存常用引用,避免重复字典查找
var effectSubmodule = noteVisual.effectSubmodule;
var effectColl = effectSubmodule.effectCollection;
// 优化手动遍历避免Lambda
UpdateEffectList(effectColl["Generate"], exactJudgeTime);
UpdateEffectList(effectColl["StartHold"], exactJudgeTime);
UpdateEffectList(effectColl["Holding"], exactJudgeTime);
UpdateEffectList(effectColl["GeneralJudge"], holdEndTime);
UpdateEffectList(effectColl["AfterJudge"], holdEndTime);
noteVisual.effectSubmodule.effectCollection["GeneralJudge"].ForEach(e => e.UpdateEffect(holdEndTime));
switch (EditorManager.instance.currentJudgeType)
// 优化switch语句
var judgeType = EditorManager.instance.currentJudgeType;
switch (judgeType)
{
case NoteJudgeType.Perfect:
noteVisual.effectSubmodule.effectCollection["Perfect"].ForEach(e => e.UpdateEffect(holdEndTime));
UpdateEffectList(effectColl["Perfect"], holdEndTime);
break;
case NoteJudgeType.Good:
noteVisual.effectSubmodule.effectCollection["Good"].ForEach(e => e.UpdateEffect(holdEndTime));
UpdateEffectList(effectColl["Good"], holdEndTime);
break;
case NoteJudgeType.Bad:
noteVisual.effectSubmodule.effectCollection["Bad"].ForEach(e => e.UpdateEffect(holdEndTime));
UpdateEffectList(effectColl["Bad"], holdEndTime);
break;
case NoteJudgeType.Miss:
noteVisual.effectSubmodule.effectCollection["Miss"].ForEach(e => e.UpdateEffect(holdEndTime));
UpdateEffectList(effectColl["Miss"], holdEndTime);
break;
}
noteVisual.effectSubmodule.effectCollection["AfterJudge"].ForEach(e => e.UpdateEffect(holdEndTime));
if (EditorManager.instance.cameraManager.haveGameCamera)
{
noteScreenPosition = EditorManager.instance.cameraManager.gameCamera.gameCamera.WorldToScreenPoint(noteVisual.noteVisualPosition);
}
}
// 优化持有列表的添加和移除
// 优化使用HashSet避免Contains的GC
if (isHolding)
{
if (!holdingHoldList.Contains(this))
holdingHoldList.Add(this);
holdingHoldSet.Add(this);
}
else
{
if (holdingHoldList.Contains(this))
holdingHoldList.Remove(this);
holdingHoldSet.Remove(this);
}
}
// 辅助方法避免Lambda产生的GC
private void UpdateEffectList(List<EffectBase> effects, float time)
{
for (int i = 0; i < effects.Count; i++)
{
effects[i].UpdateEffect(time);
}
}

View File

@@ -22,6 +22,7 @@ namespace Ichni.RhythmGame
[Title("NoteVisual")]
public NoteVisualBase noteVisual;
public float NoteAppearTime => noteVisual ? noteVisual.NoteAppearTime : -1;
[Title("Submodules")]
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
@@ -33,9 +34,22 @@ namespace Ichni.RhythmGame
[FormerlySerializedAs("isJudged")] public bool isFirstJudged;
public override int HierarchyPriority => -10;
public override void Initialize(string name, Guid elementGuid, List<string> tags, bool isFirstGenerated, GameElement parentElement)
{
base.Initialize(name, elementGuid, tags, isFirstGenerated, parentElement);
NoteManager.instance.AddNote(this);
}
public override void AfterInitialize()
{
base.AfterInitialize();
}
/// <summary>
/// 在MovableTrack上更新Note的位置注意HoldNote需要重写这个方法
/// </summary>
public virtual void UpdateNoteInMovableTrack()
{
TrackTimeSubmoduleMovable trackTimeSubmoduleMovable = track.trackTimeSubmodule as TrackTimeSubmoduleMovable;
@@ -75,7 +89,7 @@ namespace Ichni.RhythmGame
foreach (SampleWindow i in SampleWindow.instances.Where(i => i.gameElement)) i.OnceSpawnNote();
}
protected virtual void Update()
public virtual void UpdateNote()
{
var editor = EditorManager.instance;
var cameraManager = editor.cameraManager;
@@ -91,13 +105,13 @@ namespace Ichni.RhythmGame
if (isFirstJudged && songTime < exactJudgeTime)
{
isFirstJudged = false;
noteVisual.GetComponent<Collider>().enabled = !isFirstJudged;
if (noteVisual != null) noteVisual.GetComponent<Collider>().enabled = !isFirstJudged;
}
else if (!isFirstJudged && songTime >= exactJudgeTime)
{
noteAudioSubmodule?.PlayNoteJudgeAudios(editor.currentJudgeType);
isFirstJudged = true;
noteVisual.GetComponent<Collider>().enabled = !isFirstJudged;
if (noteVisual != null) noteVisual.GetComponent<Collider>().enabled = !isFirstJudged;
}
// 判定单元更新
@@ -235,6 +249,11 @@ namespace Ichni.RhythmGame
foreach (SampleWindow i in SampleWindow.instances.Where(i => i.gameElement)) i.OnceSpawnNote();
}
NoteManager.instance.RemoveNote(this);
if (noteVisual != null)
{
noteVisual.OnDelete();
}
}
public int CompareTo(NoteBase other)

View File

@@ -1,7 +1,9 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor;
using UniRx;
using UnityEngine;
using UnityEngine.Serialization;
@@ -21,7 +23,10 @@ namespace Ichni.RhythmGame
public List<GameObject> effectPrefabList;
public virtual Vector3 noteVisualPosition => noteMain.transform.position;
public NoteGenerateEffect generateEffect;
public float NoteAppearTime => generateEffect is null ? note.exactJudgeTime : note.exactJudgeTime - generateEffect.generateTime;
public EffectSubmodule effectSubmodule { get; set; }
public SelectSubmodule selectSubmodule { get; set; }
@@ -34,8 +39,19 @@ namespace Ichni.RhythmGame
noteVisual.isHighlighted = isHighlighted;
noteVisual.SetHighlight();
noteVisual.SetEditorSubmodules();
Observable.NextFrame().Subscribe(_ =>
{
noteVisual.AfterInitialize();
});
return noteVisual;
}
public override void AfterInitialize()
{
base.AfterInitialize();
generateEffect ??= effectSubmodule.effectCollection["Generate"].First(i => i is NoteGenerateEffect) as NoteGenerateEffect;
if (generateEffect == null) throw new Exception("NoteVisual必须有一个生成特效。");
}
public override void SetDefaultSubmodules()
{
@@ -48,7 +64,7 @@ namespace Ichni.RhythmGame
{
selectSubmodule ??= new SelectSubmodule(this, note);
}
public override void SetUpInspector()
{
base.SetUpInspector();
@@ -63,7 +79,7 @@ namespace Ichni.RhythmGame
inspector.GenerateToggle(this, settingsSubcontainer, "Highlight", nameof(isHighlighted))
.AddListenerFunction(SetHighlight);
}
public virtual void Recover()
{