こんにちは、作者です。
今日はテストの話も仕事の話も全然関係ありません。
趣味全開の話でも書こうかと思います。
bm98の曲データを読み込んでOculus Questの音ゲーにした話
近頃は業務前にOculus Questでボクササイズのゲームを行うことが日課です。
簡単にいうと、音楽に合わせて弾が飛んでくるので、それを打つべし打つべしするゲームです。
で、やっているとだんだん同じ曲なども増えてきて飽きてきちゃったりするのですね。
そこでふとこんなことを思いました。
そんなわけで、さっそく木曜の夜から作ってみました。
木曜の夜~日曜日午前中くらいまでで作成です。
これができるようになったらたぶんマッハオラができます。もしくは北斗百裂拳。
まだプレイ画面しかないしOculus questなので配布ができず自己満足にしかなりませんが、githubは置いておきます。
気が向いたらリザルト画面や曲選択画面を付けようと思います。
https://github.com/jam0824/unitybm98v2
www.youtube.com
曲データはビートまりお様の「約束-HappyHyperStarmiX-」を拝借しております。
bm98の曲データを利用
音楽に合わせて打つべし打つべしのボクササイズゲームを作るにも、まず必要なのは曲や譜面データ。
そこで思い浮かんだのが「bm98」でした。
その昔「ビートマニア」というゲームが流行り、そのオマージュのフリーゲームとして「bm98」がありました。(もう20年は前)
https://ja.wikipedia.org/wiki/BMS_(%E9%9F%B3%E6%A5%BD%E3%82%B2%E3%83%BC%E3%83%A0)
有志が曲データを作ってネットで配布していました。
作者もその昔めちゃくちゃハマっていて、そのことを思い出したわけです。
そんなわけで、bm98の楽譜データ(bms)を読み込んで曲データを詰めた弾を飛ばし、叩くとその弾から音が流れるようなものをVRで作ってみました。
開発の流れ
- 「bm98の譜面データ読み込んだろ」と思いつく
- 譜面データの構成のお勉強はじめる(http://www.charatsoft.com/develop/otogema/page/04bms/bms.htm
- むしろ音符の勉強をする
- なんとなくわかったので譜面をフレームに変換するアルゴリズム考える
- そのアルゴリズムで計算通りに音が配置されるかコード上でテスト
- ただのオートプレイの音楽再生機を作る(プロトタイプ1)
- オブジェクトを飛ばしてドンピシャのとこで音を鳴らすために時間やら距離やら速度のお勉強を思い出す。(結果オブジェクト生成タイミングさえ合わせればオッケーだった)
- 雑に壁を作ってそこにオブジェクトをぶつけて曲がイイカンジに鳴るか検証
- Oculus Questの環境を作って結合。システムテスト。この時点で原型がほぼ完成(プロトタイプ2)
- 見栄えをリッチにするために飛ばす弾とかステージをunity assets storeでお買い物
- カッコイイエフェクトをつけまくって悦に浸る
- Oculus Questでシステムテスト。フレームレートがガタ落ちで真の戦い開始
- テクスチャのクオリティ下げたりオブジェクト削ったりいらないcolliderをけしたりエフェクト削ったりエフェクト時間を短くしたり音のオブジェクト消える距離を短くしたりとあらゆる削減を実施。oculus quest既定の72FPS確保する
- beat saberが流行ってることを思い出して急きょ仕様変更して刀のオブジェクトを買う
- プレイしたけどやっぱり拳で語りたくなったので刀を破棄する
- bm98には「BGA(BackGroundAnimation)」というのがあるので、fpsと相談しながらそれに対応する。スクリーンっぽく配置
- コンボ表示を追加。Oculus Questでテストプレイしながら表示位置調整
- 最終テストプレイ。もう腕が上がりません
テスト
http://www.charatsoft.com/develop/otogema/page/04bms/bms.htm
bmsデータの変換の仕様としては、これの「メインデータ」の01,02,04,10~19に対応。
この辺の変換周りは、「特定フレームで、指定した音データが含まれているか」「3/4拍子になったときに音符間の長さが想定する計算結果と一致するか」みたいなユニットテストでいけます。
けど、ゲームはオブジェクト(3Dモデルとか)の操作がとても多い。
例えば弾にコントローラーがぶつかったとき。
- 弾がぶつかったらその弾は消える。
- その弾が抱えている音は鳴り終わるまで消えちゃダメ。(このバグに引っかかりましたw)
- 弾が消えるときにはエフェクトが生成される。
こういったところはコードでのテストでは見にくく、システムテストでOculus questを通して見た方が早い。
(けどヘッドセット被ってるとlogcat見づらい…!)
あとPCの画面上での表示とVR空間上の表示はかなり印象が異なったりするので、ヘッドセットをかぶってUIを確認して位置調整をしたり。
結果的に、ほとんどOculus Questをかぶってシステムテストレベルで確認となってしまい。。。
いつも「システムテストでまとめて見ちゃダメだよー」と言っている人なのにっ><
で。
テストプレイ後半は15分の休憩を入れないと息が……息が……!!
(最初はもっと簡単な曲でテストしてんですけれどね)
ゲーム系のテストは難しい……!