如何做好一个音游

2.5k 词

嗯,该从哪里讲起呢。

先从节拍开始吧。

首先我们要知道的一件事是,音乐是有节拍的,比如以四分音符为一拍,每小节有3拍,是不是回到了音乐课?

当然我并不是要讲音乐课,我们首先需要的是一个节拍系统,这个系统其实你可以命名为Conductor(指挥家),核心点在于三件事,节拍的计算,歌曲的BPM,时间。

冰与火之舞作者的实现
https://forums.tigsource.com/index.php?topic=49041.0

BPM为每分钟的节拍数,所以如果我们60.f/BPM会得到一个每秒有多少拍子

当我们在Unity/Unreal/FMOD/Wwise中其实是有一个时间来计算当前歌曲的播放时间我们记为T。

所以T/60.f/BPM 我们可以得到一个当前处于歌曲的第几拍,同时也可以得到所有的拍子数量,这样我们可以使用任意一个int值来存下来。

由此,其实一个节拍系统就完成了。很简单不是吗?

所以其实任意的玩法都是可以支撑的

因为它只是一个按照歌曲固定位置的int,像第一拍我们记为1,第二拍为2等等

所以节奏天国不是偷懒的玩法啊,拼一拼完事了(暴论hh)

音乐能够传递感情,但感情是需要传递的媒介

比如一个良好的设计的玩法

冰与火之舞能够很好的支持所有音符,2分/8分/16分诸如此类,我认为它对于音乐的节拍是容纳值是很好的,所以它是一个很精妙的玩法,其实它的玩法我把它归类为跑步,按音乐跑步的节奏谁不喜欢呢?音游这么久都没有一个新的玩法,不是没有,而是很多“不合适”。这样的角度量换算其实很合适,路程->角度。

Geometry Dash也是跑酷结合,但更是跑酷不是吗。而且如果你把传统下落的音符,换个视角,换成玩家控制的几何,你会发现好像就是音符不动,现在改成动轨道了。

其实我怀疑他们都来自于同一个游戏Thumper😄,毕竟上GDC演讲了,知名度很高。

Osu与Cytus的玩法是缩圈,但其实都是把音符下落的距离换算了一下,换成了圆圈的距离到中心半径R,收缩的速度其实就是上面的 拍每秒 所以是路程-> R

举这几个例子是因为他们比较出名,当然音游远不止这些(算上街机)

所以你发现了吗?其实关键的玩法是一个把拍子跟固定的轨迹结合在一起的新玩法,因为计算公式的原因,让人很容易想到路程与速度所以创新的玩法是很困难的.

比如一个很好的剧情(象征)/社区氛围/文化

雷亚几乎所有的音游都是这样,由音乐以及剧情或者说”音乐文化”组成的。可能听起来比较虚,但其实举个例子,MushDash,二次元,嗯哼~(擦边啦),而且关键发家早啊,没人做手机音游的时候,你搞一个,这不稳吃螃蟹!

如果说MushDash成在二次元,那个屁股肉成功3分靠二次元3分靠免费4分靠运气,我不认可他是个非常优秀的音游

FridayNight Funkin/Osu二创是非常多的,逐渐的就形成了一个社区氛围,圈外人说实话根本看不懂,说实话,我也看不懂 :)但就是因为这小部分狂热粉丝

比如一个精致的画面

目前其实更多的音游在向这方面做,因为前面两个是很困难的,玩法上光看独立游戏每年多少“神作”就能看出来,新玩法几年出一个?(而且探究下历史其实是有的,有的兄弟,有的)

社区上等几年,黄花菜都凉了,还不一定能成,倒复刻个deemo还具有可行性,但赚钱吗?他为什么不玩deemo玩你的,没错,螃蟹被人吃了!

JustShape是个很好的例子,现在很多手机音游都是这样,taptap排行榜一共显示50个,音游一个才34个,几乎全是一个模子刻出来的,卷画面,duangduang的特效

所以就像游戏里面的背景音乐一样,更多的反而不要关注音乐方面

听起来可能听抽象,但这个确实是我实现完RhythmShooter这个音游的核心玩法的感悟,因为该实现的节拍,偏移,音乐等等其实都实现了,但玩起来真的感觉,没那么重要。

关于音游的技术难点

再加上这个吧,音游核心的实现应该没有什么技术难点了,难点更需要关注你自己的特殊玩法

https://indienova.com/indie-game-development/how-to-add-an-event-subscribable-audio-system-to-your-game-project/

讲个有趣的

1
2
3
4
5
6
7
8
9
10
11
// NOTE:
// 同一帧里“生成”一个敌人,再马上做一次 Physics.Raycast,新的 Collider 已经被注册到场景里了;
// 不管在任何方向上?在当前方向上?,就会被立刻击中,造成一种穿透并且击中了刚生成敌人的bug
// “前面生成的敌人被穿透”,但可能你认为“先生成的”就是“视觉上靠近摄像机的”。
// 但其实 Unity 并不会自动把“先生成的对象”摆在“前面”。
// 如果你在一个半圆范围内随机生成敌人,他们的位置是随机的,哪怕一个敌人在逻辑上“先生成”,但空间位置上可能在队尾,Raycast 命中它也合理。
IEnumerator EnableColliderNextFrame(Collider col)
{
yield return null; // 等待一帧
if (col != null) col.enabled = true;
}

还有一个有趣的问题是,Unity中导入张带透明部分的贴图,你是否需要把他设置为Sprite?

其实是要看你的需要来,假如他是UI的贴图,并不需要放在场景里面移动的话,你大可以放心把他设置为Sprite,Unity不是自己也说了(括弧2D and UI)

但如果你需要让它放在一个mesh在场景中的话,最好是设置为默认,因为默认是开启mipmap的,假如你不开启mipmap的话,你的透明边缘部分会发生奇怪的闪烁。

以上,就是当了回音游制作人的心得OVO

有兴趣的朋友可以下载下玩一玩~
https://pan.baidu.com/s/1rDvvK_4FJQyyfs8g-c3mqg?pwd=i2vv

留言