欢迎光临散文网 会员登陆 & 注册

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

2023-08-18 13:30 作者:QZM茄汁面  | 我要投稿

由于在自学制作邦邦模拟器,要想游玩一张自制谱,首先需要读取谱面文件,读取成功后才能进行游戏相关的代码

光读取谱面这一部分自己就撞了很多次墙,在网络上没有发现成文的方法,就把自己的过程分享给大家,少走一些弯路

当然,毕竟我也是初学者,难免出现错误,也欢迎大家指正。


1. 修改Bestdori的谱面代码

Bestdori的谱面代码乍一看挺规整,但想直接用json读取是读出不来的

bestdori谱面代码

仔细一看就会发现:它只是一个数组,并没有Json中要求的"键名",在读取前,我们需要声明一个键名存储值内容(这里用data):

有能用的json文件后,接下来要在游戏中读取了


2. 读取前准备

2.1 谱面属性关系

首先观察谱面文件,我们可以发现,所有的节点都是有type类型的,并且都拥有beat和lane对应的值(绿条除外),其它属性均为附加选项。

直接说不容易理解,我把关系整理了出来,整体关系如下所示:

Chart

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数。本质就是循环走一遍谱面文件,当然也可以与上面的代码重合写在一起

这是很早的代码了,一致没有修改,大伙能看懂大概意思即可


至此,才算完整读取谱面文件

感谢你能看到最后,如果有用就请点个赞吧

教程:在Unity中读取Bestdori自制谱社区谱面代码的评论 (共 条)

分享到微博请遵守国家法律