教程:在Unity中读取Bestdori自制谱社区谱面代码

由于在自学制作邦邦模拟器,要想游玩一张自制谱,首先需要读取谱面文件,读取成功后才能进行游戏相关的代码
光读取谱面这一部分自己就撞了很多次墙,在网络上没有发现成文的方法,就把自己的过程分享给大家,少走一些弯路
当然,毕竟我也是初学者,难免出现错误,也欢迎大家指正。
1. 修改Bestdori的谱面代码
Bestdori的谱面代码乍一看挺规整,但想直接用json读取是读出不来的

仔细一看就会发现:它只是一个数组,并没有Json中要求的"键名",在读取前,我们需要声明一个键名存储值内容(这里用data):
有能用的json文件后,接下来要在游戏中读取了
2. 读取前准备
2.1 谱面属性关系
首先观察谱面文件,我们可以发现,所有的节点都是有type类型的,并且都拥有beat和lane对应的值(绿条除外),其它属性均为附加选项。
直接说不容易理解,我把关系整理了出来,整体关系如下所示:

2.2 根据关系声明对应类脚本
2.2.1 通用值
我们首先声明一个chart类,用于保存单个按键的值
对于通用逻辑,直接写入Chart类中:
由于每个按键对应一个类型,观察属性关系,可以知道有4个类型,我们声明一个枚举类型
往Chart类中添加枚举
2.2.2 专属值
根据type我们已经可以单独获知该note属于什么样的类型,所以其它按键的值冗杂在一起也不会有什么影响
绿条内部代码:
※需要注意的是,绿条类本身没有通用值,都在其子类的数组中connections存在
滑键方向:
3. 在Unity中读取谱面文件
3.1 读取json文件
在unity中,有许多可以读取Json的类,这里使用Newtonsoft.Json
(其实第一次用了LitJson,但是会报错)
首先需要引用命名空间
我们使用File类进行文件读取,文件放置在持久化目录中,路径也设置为此处
由于我是直接把bestdori的代码复制到json文件中的,所以我需要添加前缀
随后尝试把读取到的内容转换为对应的类
3.2 排序对应的类
在bestdori的代码可以乱序,但这样并不利于我们播放谱面,所以我们需要进行排序
3.2.1 简单排序
在排序前我按照一定规则把所有音符都存入到了List当中,各位在使用Sort方法时记得要包含原本的对象
3.2.2 计算精准时间
在实际播放谱面时,使用beat并不方便读取,我们需要计算每个音符单独的精准时间(绝对时间)
可以在Chart类中附加一个值:
接下来计算绝对时间:
注意(坑):beat的值是根据bpm持续变化的。也就是说,最原先的BPM值并不是整个谱面文件所使用的beat值,每当bpm变化时,beat的值都将重新计算。变化后的beat值直接顺延前期的beat值
直接说终究是不好理解,还是看图吧:


鉴于此,我们需要先声明4个临时变量:
因为我们要重新为每个音符都计算绝对时间,所以使用for循环进行遍历
因为beatdori中第1个音符类型必定是BPM,且其beat为0,为最先的音符,所以第一个音符的绝对时间必定为0。
当后期遇到BPM类型的音符时,再重新计算BPM的值
3.2.3 获取总Combo数
最终判断玩家是否为全连击时,需要用到总Combo数。本质就是循环走一遍谱面文件,当然也可以与上面的代码重合写在一起
这是很早的代码了,一致没有修改,大伙能看懂大概意思即可
至此,才算完整读取谱面文件
感谢你能看到最后,如果有用就请点个赞吧