教程:在Unity中讀取Bestdori自制譜社區(qū)譜面代碼

由于在自學(xué)制作邦邦模擬器,要想游玩一張自制譜,首先需要讀取譜面文件,讀取成功后才能進行游戲相關(guān)的代碼
光讀取譜面這一部分自己就撞了很多次墻,在網(wǎng)絡(luò)上沒有發(fā)現(xiàn)成文的方法,就把自己的過程分享給大家,少走一些彎路
當(dāng)然,畢竟我也是初學(xué)者,難免出現(xiàn)錯誤,也歡迎大家指正。
1. 修改Bestdori的譜面代碼
Bestdori的譜面代碼乍一看挺規(guī)整,但想直接用json讀取是讀出不來的

仔細(xì)一看就會發(fā)現(xiàn):它只是一個數(shù)組,并沒有Json中要求的"鍵名",在讀取前,我們需要聲明一個鍵名存儲值內(nèi)容(這里用data):
有能用的json文件后,接下來要在游戲中讀取了
2. 讀取前準(zhǔn)備
2.1 譜面屬性關(guān)系
首先觀察譜面文件,我們可以發(fā)現(xiàn),所有的節(jié)點都是有type類型的,并且都擁有beat和lane對應(yīng)的值(綠條除外),其它屬性均為附加選項。
直接說不容易理解,我把關(guān)系整理了出來,整體關(guān)系如下所示:

2.2 根據(jù)關(guān)系聲明對應(yīng)類腳本
2.2.1 通用值
我們首先聲明一個chart類,用于保存單個按鍵的值
對于通用邏輯,直接寫入Chart類中:
由于每個按鍵對應(yīng)一個類型,觀察屬性關(guān)系,可以知道有4個類型,我們聲明一個枚舉類型
往Chart類中添加枚舉
2.2.2 專屬值
根據(jù)type我們已經(jīng)可以單獨獲知該note屬于什么樣的類型,所以其它按鍵的值冗雜在一起也不會有什么影響
綠條內(nèi)部代碼:
※需要注意的是,綠條類本身沒有通用值,都在其子類的數(shù)組中connections存在
滑鍵方向:
3. 在Unity中讀取譜面文件
3.1 讀取json文件
在unity中,有許多可以讀取Json的類,這里使用Newtonsoft.Json
(其實第一次用了LitJson,但是會報錯)
首先需要引用命名空間
我們使用File類進行文件讀取,文件放置在持久化目錄中,路徑也設(shè)置為此處
由于我是直接把bestdori的代碼復(fù)制到j(luò)son文件中的,所以我需要添加前綴
隨后嘗試把讀取到的內(nèi)容轉(zhuǎn)換為對應(yīng)的類
3.2 排序?qū)?yīng)的類
在bestdori的代碼可以亂序,但這樣并不利于我們播放譜面,所以我們需要進行排序
3.2.1 簡單排序
在排序前我按照一定規(guī)則把所有音符都存入到了List當(dāng)中,各位在使用Sort方法時記得要包含原本的對象
3.2.2?計算精準(zhǔn)時間
在實際播放譜面時,使用beat并不方便讀取,我們需要計算每個音符單獨的精準(zhǔn)時間(絕對時間)
可以在Chart類中附加一個值:
接下來計算絕對時間:
注意(坑):beat的值是根據(jù)bpm持續(xù)變化的。也就是說,最原先的BPM值并不是整個譜面文件所使用的beat值,每當(dāng)bpm變化時,beat的值都將重新計算。變化后的beat值直接順延前期的beat值
直接說終究是不好理解,還是看圖吧:


鑒于此,我們需要先聲明4個臨時變量:
因為我們要重新為每個音符都計算絕對時間,所以使用for循環(huán)進行遍歷
因為beatdori中第1個音符類型必定是BPM,且其beat為0,為最先的音符,所以第一個音符的絕對時間必定為0。
當(dāng)后期遇到BPM類型的音符時,再重新計算BPM的值
3.2.3 獲取總Combo數(shù)
最終判斷玩家是否為全連擊時,需要用到總Combo數(shù)。本質(zhì)就是循環(huán)走一遍譜面文件,當(dāng)然也可以與上面的代碼重合寫在一起
這是很早的代碼了,一致沒有修改,大伙能看懂大概意思即可
至此,才算完整讀取譜面文件
感謝你能看到最后,如果有用就請點個贊吧