まず
Unityでリズムゲーム作っててめちゃくちゃ嫌だったこと。
それは、「ソフランなどと言ったギミックの情報が全く無いこと」でした。
色んなギミック譜面が作れるリズムゲームを作りたかったのに、一切その情報が無い。
なんでなん?みんな上から下に流れるだけで十分なん??自作音ゲーの譜面を弐寺みたいにソフランさせたり、太鼓みたいに超高速でノーツ飛ばしたり、Ar〇aeaみたいに訳分からん動きさせたりしたくならないんか???
この記事は、「自作リズムゲームにギミックを搭載したい!でも何も分からん!!」な人達の助けになったら良いなという目的で作りました。悩んでる時間あったら手動かして欲しいしね。
目標とする挙動
作り方
下の画像で赤いノーツは等倍速度、青いノーツには0.25倍のソフランをかけたものです。
要はこういう配置になれば宜しいのです。
ノーツの座標の出し方
私がやったやり方としてはこんな感じ↓
-
ノーツがある小節を調べる。
-
小節の座標と時間を調べる。
-
ソフランの値を取得する。
-
ノーツの時間から小節の時間を引く(これで小節内での時間になる)。
-
4.で出た値を基準速度とソフランでかける。
-
ノーツ座標が出てくるのでそれを使用する。
float softLanding; //ソフランの値 float baseSpeed; //基準となるスクロール速度 float measureTiming; //小節の開始時刻 float measurePos; //小節の座標 float noteTiming; //ノーツの判定時間 float notePos; //ノーツの座標 var distance = (noteTiming - measureTiming); notePos = measurePos + (distance * baseSpeed * softLanding);
レーンのスクロールの仕方
小節の1拍目の座標から次の小節の座標まで、Lerpで動かしてあげるのです。
正規化の方法が地味に分からなかった。数学難しい……
float musicTime; //曲の再生位置
float measurePosBegin; //小節の座標
float measurePosEnd; //次の小節の座標
float normalize; //正規化
normalize = (musicTime- measurePosBegin) / (measurePosEnd - measurePosBegin);
Vector3.Lerp(measurePosBegin, measurePosEnd, normalize);
これらをListとかifやforを駆使して実装すれば、それっぽいものになると思います。
見て、ノーツがぴょんぴょんしてるよ!かわいいね
終わり
書いてて思いましたけど、このコードまだまだ改装出来そうですね。
「小節とノーツの座標取得二度手間では?」とか、「baseSpeedを少し弄れば太鼓のソフランも実装出来そう」とか。
因みにスクロール方法ですが、今のままだと1/64拍子とかにしたら目に見えてカクついてしまう(処理落ちではない)ので、そこ含めて次リズムゲーム作った際には別の方法を模索してみようと思います。
もっとみんなリズムゲーム作れ、そして情報共有しろ