using System.Collections.Generic; using UnityEngine; [System.Serializable] public class SongMetadata { public string title; public string artist; public float bpm; } [System.Serializable] public class BeatSageInfoDat { public string _songName; public string _songAuthorName; public float _beatsPerMinute; } [System.Serializable] public class BeatSageRoot { public string _version; public List _notes; } [System.Serializable] public class BeatSageNote { public float _time; public int _lineIndex; public int _lineLayer; public int _type; public int _cutDirection; } public static class BeatSageConverter { public static List Convert(string rawJson, float bpm) { var result = new List(); var root = JsonUtility.FromJson(rawJson); if (root?._notes == null) { Debug.LogWarning("[BeatSageConverter] Parse failed or no notes."); return result; } foreach (var note in root._notes) { // Only process normal notes (0=red, 1=blue); skip bombs (3) etc. if (note._type != 0 && note._type != 1) continue; result.Add(new NoteData { time = (note._time * 60f) / bpm, position = note._lineIndex, lineLayer = note._lineLayer, colorType = note._type, cutDirection = note._cutDirection, }); } Debug.Log($"[BeatSageConverter] Converted {result.Count} notes."); return result; } public static string ToMapJson(List notes) { return JsonUtility.ToJson(new MapData { target = notes }, true); } public static SongMetadata ParseInfoDat(string json) { var info = JsonUtility.FromJson(json); if (info == null) return null; return new SongMetadata { title = (info._songName ?? "").Trim(), artist = (info._songAuthorName ?? "").Trim(), bpm = info._beatsPerMinute, }; } }