using UnityEngine; using System.Collections.Generic; using System.IO; using Newtonsoft.Json; /// /// 用于对项目所用到的数据进行管理 /// public class MainMenuModel : MonoBehaviour { //依据设计书输入数值 readonly private float DefaultBaseSpeed = 25; readonly private float DefaultTrackLength = 125; readonly private float DefaultNoteStream = 5f; readonly private float DefaultBPM = 128; readonly private float DefaultBaseBPM = 128; /// /// 存储所有拍线的时间,在加载BPM组的时候就需要初始化完成 /// public List BPMLineTime { set; get; } = new List(); /// /// 当前被渲染出来的拍线数据,用于切换选择拍线 /// public List currentBPMLine { set; get; } = new List(); /// /// 当前谱面文件的主要时间组,决定拍线的渲染方式,永远取序号为0的时间组 /// public BPMGroup MainBPMGroup { get { return BPMGroupManager.QueryBPMGroup(0); } } public Chart PersistentChartData { set; get; } public BPMGroupModel BPMGroupManager { set; get; } public ChartRuntimeModel ChartRuntimeDataManager { set; get; } public AudioSource Song { set; get; } public float SongCurrentTime { get { if (Song.clip == null) return 0; return (float)Song.timeSamples / Song.clip.frequency; } set { Song.time = value; } } private void Awake() { Song = gameObject.GetComponent(); InitMainMenuModel(); } private void InitMainMenuModel() { //启用BPM管理类 BPMGroupManager = new BPMGroupModel( DefaultNoteStream, DefaultBaseSpeed, DefaultBaseBPM, DefaultTrackLength ); //创建用于管理运行时逻辑的数据对象 ChartRuntimeDataManager = new ChartRuntimeModel(); //创建用于转换为Json对象的持久化数据对象 PersistentChartData = new Chart(); //初始化新项目的结构 NewProjectData(); } /// /// 依据时间更新所有BPM组的状态,将这个方法注册在控制层的时间变化事件中 /// public void UpdateBPMGroup(float currentTime) { BPMGroupManager.UpdateBPMGroup(currentTime); } /// /// 向管理器申请创建新的数据项,返回创建结果 /// public bool CreateBPMDataItem(int groupNum, float startTime, float currentBPM) { BPMGroupManager.CreateNewBPMGroup(groupNum, startTime, currentBPM); return BPMGroupManager.QueryBPMGroupDataItem(groupNum, startTime, currentBPM); } /// /// 向管理器申请删除指定的数据项,返回删除结果 /// public bool DeleteBPMDataItem(int groupNum, float startTime, float currentBPM) { BPMGroupManager.DeleteBPMGroup(groupNum, startTime); return !BPMGroupManager.QueryBPMGroupDataItem(groupNum, startTime, currentBPM); } /// /// 这里会返回一个包含当前所有BPM数据项的集合用于让C层持有数据库的备份,之后只能通过开发的接口更改数据,C层本身并不能直接访问BPM管理器 /// public List<(int GroupNum, float startTime, float currentBPM)> GetAllBPMDataItem() { return BPMGroupManager.GetAllBPMDataItem(); } /// /// 更新所有的玩家设置 /// public void UpdatePlayerSetting(float noteStream, float baseSpeed, float baseBPM, float trackLength) { BPMGroupManager.UpdatePlayerSetting(noteStream, baseSpeed, baseBPM, trackLength); PersistentChartData.globalConfig.baseBPM = baseBPM; PersistentChartData.globalConfig.baseSpeed = baseSpeed; PersistentChartData.globalConfig.trackLength = trackLength; PersistentChartData.globalConfig.noteStream = noteStream; } /// /// 删除指定的数据项,返回删除的情况 /// public bool DeleteNoteDataItem(RuntimeBaseNoteData obj) { ChartRuntimeDataManager.DeleteDataItem(obj); if (ChartRuntimeDataManager.GetDataItem(obj) == null) { return true; } return false; } public RuntimeNoteData CreateNewNoteDataItem(float targetTime, float xPos, float yPos, int num) { var go = BPMGroupManager.QueryBPMGroup(num); if (go == null) return null; var item = new RuntimeNoteData(targetTime, xPos, yPos, go); ChartRuntimeDataManager.AddDataItem(item); return item; } public RuntimeDragData CreateNewDragDataItem(float targetTime, float xPos, float yPos, int num) { var go = BPMGroupManager.QueryBPMGroup(num); if (go == null) return null; var item = new RuntimeDragData(targetTime, xPos, yPos, go); ChartRuntimeDataManager.AddDataItem(item); return item; } public RuntimeFlickData CreateNewFlickDataItem(float targetTime, float xPos, float yPos, int num, FlickDirection direction) { var go = BPMGroupManager.QueryBPMGroup(num); if (go == null) return null; var item = new RuntimeFlickData(targetTime, xPos, yPos, direction, go); ChartRuntimeDataManager.AddDataItem(item); return item; } public RuntimeSnakeData CreateNewSnakeDataItem(float targetTime, float xPos, float yPos, float endXPos, float endYPos, float endTime, int num, ReferencePointLocation referencePoint) { var go = BPMGroupManager.QueryBPMGroup(num); if (go == null) return null; var item = new RuntimeSnakeData(targetTime, xPos, yPos, endXPos, endYPos, endTime, referencePoint, go); ChartRuntimeDataManager.AddDataItem(item); return item; } /// /// 导出运行时模型与BPM管理模型中的数据项至持久化数据结构中 /// public void UpdateChartData() { ChartRuntimeDataManager.GetChartData(PersistentChartData); //导出BPM数据 var bpmList = BPMGroupManager.GetDataObject(); PersistentChartData.BPMList = bpmList; } private void NewProjectData() { //创建默认BPM组,编号为零 BPMGroupManager.CreateNewBPMGroup(0, 0, DefaultBPM); InitDefaultGlobalConfig(); InitDefaultMETAData(); } /// /// 以默认值配置新谱面文件的全局变量 /// private void InitDefaultGlobalConfig() { PersistentChartData.globalConfig.baseBPM = DefaultBaseBPM; PersistentChartData.globalConfig.baseSpeed = DefaultBaseSpeed; PersistentChartData.globalConfig.trackLength = DefaultTrackLength; PersistentChartData.globalConfig.noteStream = DefaultNoteStream; PersistentChartData.globalConfig.BPM = DefaultBPM; } /// /// 这里是一些测试的META数据 /// private void InitDefaultMETAData() { PersistentChartData.version = "测试版本"; //初始化谱面测试数据 PersistentChartData.META.songName = "MusCus"; PersistentChartData.META.songWriter = "NPVASTAR-T"; PersistentChartData.META.chartDesigner = "Program Team"; PersistentChartData.META.illustrator = "天辞ちゃん~BananApple~"; } /// /// 依据路径读取Chart文件,注意,读取新的文件将会覆盖当前工程 /// public void ReadChartByPath(string path) { string json = File.ReadAllText(path); PersistentChartData = JsonConvert.DeserializeObject(json); } /// /// 将谱面文件序列化json字符串 /// public string GetChartJson() { //导出前再整理一遍所有运行时数据 UpdateChartData(); string jsonString = JsonConvert.SerializeObject(PersistentChartData, Formatting.Indented); print(jsonString); return jsonString; } }