add the connections and sendToTest.cs for connecting with the game test

This commit is contained in:
2025-11-03 16:14:30 +08:00
parent 4ebe6183d3
commit 7837c6adf0
22 changed files with 5552 additions and 324 deletions
+49 -15
View File
@@ -58,7 +58,7 @@ public class NoteSpawner : MonoBehaviour
float travelTime = (60f / bpm) * 4;
float spawnTime = note.time - travelTime;
float delay = spawnTime - (Time.time - startTime) + spawnOffset;
Debug.Log($"delay: {delay}");
if (GameConfig.verboseLogs) Debug.Log($"delay: {delay}");
if (delay > 0)
yield return new WaitForSeconds(delay);
@@ -92,7 +92,7 @@ public class NoteSpawner : MonoBehaviour
return;
}
Debug.Log($"生成短音符:颜色={noteData.color}, 按键={key}, 轨道={noteData.trackIndex}");
if (GameConfig.verboseLogs) Debug.Log($"生成短音符:颜色={noteData.color}, 按键={key}, 轨道={noteData.trackIndex}");
GameObject note = notePool.GetNote(noteData.color);
if (note == null)
@@ -108,8 +108,10 @@ public class NoteSpawner : MonoBehaviour
if (noteScript != null)
{
float noteSpawnTime = Time.time;
noteScript.Setup(key, noteData.trackIndex, CalculateSpeed(), noteData.time, noteData.color, judgeConfig);
Debug.Log($"到达时间:{noteSpawnTime + (60f / bpm) * 4}");
// pass realtime hit time to Note.Setup
float realtimeHit = startTime + noteData.time;
noteScript.Setup(key, noteData.trackIndex, CalculateSpeed(), realtimeHit, noteData.color, judgeConfig);
if (GameConfig.verboseLogs) Debug.Log($"到达时间:{noteSpawnTime + (60f / bpm) * 4}");
}
else
{
@@ -143,12 +145,17 @@ public class NoteSpawner : MonoBehaviour
float segmentInterval = (60f / bpm) / 4f;
int segmentCount = Mathf.CeilToInt(noteData.length / segmentInterval);
Transform spawnPoint = spawnPoints[noteData.trackIndex];
// 修正:scheduledEndTime 应为游戏时间轴上的绝对时间(noteData.time + noteData.length
float scheduledEndTime = noteData.time + noteData.length;
if (segmentCount < 1) segmentCount = 1; // 至少一个片段
// 如果用节拍计算的片段间隔与实际长度不整除,实际用于分段的间隔应当按实际长度均分,
// 以确保尾部音符排在最后一个中段之后并且到达时间等于谱面结束时间。
float actualSegmentInterval = noteData.length / segmentCount; // 实际用于中段间隔
// 生成唯一 id
int holdNoteId = Random.Range(100000, 999999);
Transform spawnPoint = spawnPoints[noteData.trackIndex];
// scheduledEndTime 使用谱面时间(note.time + length),但转换为实时
float scheduledEndTime = startTime + (noteData.time + noteData.length);
// 生成唯一 id(改为自增计数器,避免随机冲突)
int holdNoteId = ++holdNoteIdCounter;
// 生成 Start 段
GameObject startObj = notePool.GetStartNote(noteData.color);
@@ -163,7 +170,8 @@ public class NoteSpawner : MonoBehaviour
HoldNote holdNote = startObj.GetComponent<HoldNote>();
if (holdNote != null)
{
holdNote.Setup(holdNoteId, noteData.trackIndex, CalculateSpeed(), noteData.time, 0f, false, scheduledEndTime, noteData.color, key, "start", judgeConfig);
// pass realtime hit time (startTime + note.time) and delay 0
holdNote.Setup(holdNoteId, noteData.trackIndex, CalculateSpeed(), startTime + noteData.time, 0f, false, scheduledEndTime, noteData.color, key, "start", judgeConfig);
}
else
{
@@ -171,12 +179,10 @@ public class NoteSpawner : MonoBehaviour
return;
}
// 生成 Middle 和 End 段
// 生成 Middle 片段(1 .. segmentCount-1
for (int i = 1; i < segmentCount; i++)
{
float segmentDelay = i * segmentInterval;
bool isEndSegment = (i == segmentCount - 1);
string partType = isEndSegment ? "end" : "middle";
float segmentDelay = i * actualSegmentInterval; // 使用实际间隔
GameObject segObj = notePool.GetHoldNoteSegment(noteData.color);
if (segObj == null)
@@ -191,13 +197,41 @@ public class NoteSpawner : MonoBehaviour
HoldNote holdSeg = segObj.GetComponent<HoldNote>();
if (holdSeg != null)
{
holdSeg.Setup(holdNoteId, noteData.trackIndex, CalculateSpeed(), noteData.time, segmentDelay, isEndSegment, scheduledEndTime, noteData.color, key, partType, judgeConfig);
// 中段都标记为 middlepass realtime base time and segmentDelay
holdSeg.Setup(holdNoteId, noteData.trackIndex, CalculateSpeed(), startTime + noteData.time, segmentDelay, false, scheduledEndTime, noteData.color, key, "middle", judgeConfig);
}
else
{
Debug.LogError("长音符片段缺少 HoldNote 组件!");
}
}
// 始终在中段之后生成一个明确的 End 段(尾部音符)
GameObject endObj = notePool.GetHoldNoteEndSegment(noteData.color);
if (endObj == null)
{
Debug.LogError("对象池返回空 hold note 片段(end)!");
return;
}
endObj.transform.position = spawnPoint.position;
endObj.transform.rotation = Quaternion.identity;
// 为便于识别,将实例名追加后缀
if (GameConfig.verboseLogs)
endObj.name = endObj.name + "_end";
if (GameConfig.verboseLogs) Debug.Log($"生成尾部音符: {endObj.name} (holdId={holdNoteId}, color={noteData.color})");
HoldNote holdEnd = endObj.GetComponent<HoldNote>();
if (holdEnd != null)
{
// 将 delay 设置为整个 hold 长度 (或 segmentCount * actualSegmentInterval),确保尾部在最后中段之后
float endDelay = segmentCount * actualSegmentInterval; // 通常等于 noteData.length
holdEnd.Setup(holdNoteId, noteData.trackIndex, CalculateSpeed(), startTime + noteData.time, endDelay, true, scheduledEndTime, noteData.color, key, "end", judgeConfig);
}
else
{
Debug.LogError("长音符 end 部分缺少 HoldNote 组件!");
}
}