开发音游编辑器
写在前面
结合之前做的一个音游Demo,谈谈自己的感受;
一开始,对音游并不是很熟悉,只是轻度玩过几款音游,再加上对乐理知识的欠缺,导致一开始面对这种需求的时候是比较懵逼的。
后来下载了几款音游,观察了一下大部分音游对节奏点的处理,然后补充的看了一些乐理知识,慢慢明白了怎么来用数据量化一首歌曲。
要做一个东西首先得把它量化。
那么要完成一首音游那就是:
节奏点数据+运动算法(恒定速度运动,在节奏点的时候正好到达判定线)
当然可以不恒定速度运动(提前做一个位置偏移,改一下速度,看起来就相对地图在做运动,然后在这个节奏点时刻上它也正好运动到我们给定的位置)
节奏点数据:
歌曲的谱子前面都会写几几拍,比如4/4拍,前面表示拍数,后面表示四分音符,其实他们之间并没有什么联系,这里我的理解就是这首歌一小节是4拍,一拍的长度是一个四分音符的长度,这里我们只管拍数,然后就是一首歌会有BPM(没分钟节拍数),还有这首歌的长度,都是我们需要的信息
然后我发现一些节奏比较快的音乐可能一个小节的拍数会比较多,可能有8拍:比如我经常听的trap音乐里面的很多beat的hit-hat都是用8拍把一个小节占满:
图:
然后这是这首歌的BPM:
比如用Beat制作软件随便做一节:
红色的地方一般都会是重音,也一般会是我们的节奏点,看样子在制作工程中,鼓点的节奏还是对齐的(是在一拍开始得地方),所以利用时刻来量化是没什么大的问题的。
然后在第一拍或者第三拍上会有808鼓的重鼓,然后发现乐理书上面讲的一般16分音符的音乐就非常少了(一拍的长度是一个16分音符)。
所以取舍了一下,我把一个小节分成了32个时间点,这样就算你是32拍的乐谱那也是够用了(主要是为了在配置音游谱面的时候能够更加细化的调节)
那我们的一个小节的时间是多长呢?
首先的算出一拍的多长:
假如我们这首歌是4/4拍的歌曲(很常见),一小节就是4拍
- 1拍的时间 = 60/BPM(一分钟60秒);
- 1 Bar(小节)的时间 = 1拍 * 4(上面的前提,是4/4拍乐谱,所以一小节是4拍);
那么其实我们之前给一拍分得32份的时间也算出来了:
DeltaTime = BarTime/32;
一首歌有多少拍:
bar = Convert.ToInt32(len / BarTime);
当然,有些音乐的前奏很长,或者是我们不想再前奏放置节奏点,所以会提供一个偏移值:
CurrentTime = OffsetTime;
这样一来其实就描述完毕了,哦,还有一个分轨问题,经常看到的音游会有4轨左右:
List1 = new KeyNode[bar * 32];
List2 = new KeyNode[bar * 32];
List3 = new KeyNode[bar * 32];
List4 = new KeyNode[bar * 32];
现在就是给每条轨道初始化每个节奏点的时刻了:
for (int i = 0; i < bar*32; i++)
{List1[i] = new KeyNode();List2[i] = new KeyNode();List3[i] = new KeyNode();List4[i] = new KeyNode();List1[i].StartTime = TimeCounter;List2[i].StartTime = TimeCounter;List3[i].StartTime = TimeCounter;List4[i].StartTime = TimeCounter;List1[i].EndTime = TimeCounter;List2[i].EndTime = TimeCounter;List3[i].EndTime = TimeCounter;List4[i].EndTime = TimeCounter;TimeCounter += DeltaTime;
}
EndTime 是因为有些节奏点是长按
预览问题
在配置节奏点的时候需要做一个边播放边预览,这里利用Unity的编辑器扩展了一下:
当然这里完全可以不用Unity编辑器,随便一个界面开发就可以实现,而且可以不用这种8格为一拍的界面,完全是可以拖拽式的界面,在哪个点需要节奏就直接往上面拖一个需要的怪物类型的点就可以了。
上面的截图功能说明:
基本信息填写功能;
- 有一个播放条,可以前后拖动,从歌曲哪一刻开始播放;
- 下面的红线就是当前时刻的节奏点在哪里;
- 导出数据和导入数据,保存节奏点数据序列化;
- 预览功能,可以在Unity里面实时预览目前已经填写的节奏点,可以利用滑动播放条来回反复听这个节奏是不是对的,调试手感;
红线为判断线,白球是已经填写的节奏点
利用一些音频软件,比如cool editor 可以看到歌曲的频谱,高低频都可以看到,将它的第几节与我们的编辑器对应起来填写
到这里就差不多完成了基础功能了,在游戏里将我们保存的数据读取后在生成怪物点就可以了,这样就可以快速生成音游的一关,YES。
以上内容如有错误还请指正!