SHOTech Blog

プログラミングに関する記録です

流行りのBeat Saberに曲を追加する件

皆さん、Beat Saberやってますか?

知らない方はこれを見てもらえばよいと思います。

www.youtube.com


リリースから1カ月で10万本売れたらしいです。

STEAMで2千円で売られてます。

先日PSVRでの発売もされると発表があり、今後が楽しみです。

ちなみに、このゲーム結構体動かすのでエクササイズになるんじゃないかと思ってたら、運動量はテニス並みだという記事見つけました。やっぱりね。どおりで汗かくと思ったよ。

www.moguravr.com

 

今回は、このBeat Saberに曲を追加する話です。

 購入当初は10曲くらいしか入ってないんですね。

 人によってはすぐに遊び終わりそうだなと思ってましたが、今日曲が追加できるということを初めて知りました。

55sedori.com

 やり方はこのサイトに書いてありました。

結構アニソンとかもあってテンション上がりました。

トーキョーグールのOPをダウンロードして中身を確認すると

f:id:syota-y1989:20180628035908p:plain

ファイルはたったこれだけ

  • 音楽ファイル(.ogg)
  • ゲームで使用するサムネイル画像
  • ゲームで音楽情報を表示するためのinfo.JSONファイル
  • 難易度別のJSONファイル

試しにhard.jsonを開いてみると

{"_version":"1.5.0","_beatsPerMinute":135,"_beatsPerBar":16,"_noteJumpSpeed":10,"_shuffle":0,"_shufflePeriod":0.5,"_events":[ { "_time":15.75, "_type":0, "_value":1 }, { "_time":15.75, "_type":1, "_value":1 }, { "_time":19, "_type":2, "_value":1 }, { "_time":23, "_type":3, "_value":1 }, { "_time":31, "_type":4, "_value":1 } ],"_notes":[ {"_time":20,"_lineIndex":1,"_lineLayer":0,"_type":0,"_cutDirection":1},{"_time":20,"_lineIndex":2,"_lineLayer":0,"_type":1,"_cutDirection":1}, {"_time":21.5,"_lineIndex":3,"_lineLayer":1,"_type":1,"_cutDirection":0},{"_time":21.5,"_lineIndex":0,"_lineLayer":1,"_type":0,"_cutDirection":0}, {"_time":23,"_lineIndex":1,"_lineLayer":0,"_type":0,"_cutDirection":1},{"_time":23,"_lineIndex":2,"_lineLayer":0,"_type":1,"_cutDirection":1},

 という感じで文字列がたくさん書いてあります。

最初にテンポとかゴニョゴニョ書いてあって

  • events
  • notes
  • obstacles

という大きく3つの要素で構成されているようです。

exentsの内容はこのページに書いてありました。

steamcommunity.com

あとはノーツと壁の設定ですが、構造が簡単そうだったので自分用に整理しました。

{"_time":20,"_lineIndex":1,"_lineLayer":0,"_type":0,"_cutDirection":1}

 どうもこれがノーツを定義しているようです。

要素は下記5つ

  • time
  • LineIndex
  • LineLayer
  • type
  • cutDirection

 timeは時間、おそらく曲が開始してからの時間(単位は不明ですが)だというのは想像できるので、後の要素を調べてみました。

f:id:syota-y1989:20180628032919p:plain

 これが画面ですね。

 

f:id:syota-y1989:20180628032932p:plain

 LineIndexは左から順に0,1,2,3

0始まりというのはなんだかとっても配列っぽいです。

 

f:id:syota-y1989:20180628032944p:plain

 LineLayerは高さの層のようです。

これも一番下から0,1,2

f:id:syota-y1989:20180628032958p:plain

 これがcutDirection。切る方向ですね。

赤か青かはTypeで判断しているようです。0が赤で、1が青。

2は何も出てこなかったので不明ですが、3は切ってはいけないとげとげですね。

別の音楽では壁を使っているものがあったので、それもわかりました。

f:id:syota-y1989:20180628033020p:plain

obstaclesというのがNotsの次にあるので、同じように設定すれば良いみたいです。

{"_time":5,"_lineIndex":0,"_type":0,"_duration":1,"_width":1},

 一番左端から幅1、長さ1の壁です。横に移動してよけるタイプですね。

  • lineIndex:壁の発生ポイント
  • type:0は横、1はしゃがんで避ける
  • duration:長さ(画面上は奥行きに当たります)
  • width:壁の幅。typeが1の場合widthは4のことが多いです。

 

f:id:syota-y1989:20180628033036p:plain

 幅2だとこのくらい

f:id:syota-y1989:20180628033050p:plain

{"_time":20,"_lineIndex":0,"_type":1,"_duration":1,"_width":4},

 これはType1のしゃがんでよけるタイプの壁ですね。

 

はい、ここまでわかれば後は簡単です。

切りたいタイミングを設定していくだけですね。

やることは簡単ですが、1つ1つ設定していくのはかなり面倒ですけどね。

とりあえずEXCEL?何かツールがあれば楽なんだけどな。

 

ともあれ、中身がわかってしまえば自分でも作れるはず!

明日から作成開始します。