リズムゲームにおける、おもしろさを生み出す演出

清水史人氏(以下、清水):それでは始めていきます。

(会場拍手)

株式会社Aimingの清水史人と申します。Twitterとかでは「@fumilin/ふみ」って名前で活動しています。個人制作で今まで2つほどリズムゲームを作っています。

作っているリズムゲームの1本は、二次創作でありますが、いわゆるオーソドックスなアイドル系のリズムゲームになります。このゲームを作ったなかで「こうしたらおもしろくなった」と自分で感じた点や実装について紹介できればと思います。

その前にリズムゲームのおもしろさとはなにかを知る必要があります。@geekdrumsさんの『ワンダールクス』の4つのレイヤーの例がわかりやすそうです。

これをリズムゲームについて当てはめてみると、このような感じになっています。

おもしろさってけっこう主観的なんですが、どちらを選択するかなどの駆け引きとして表現することが多いみたいです。リズムゲームでは駆け引きはあまりなく、どのキャラを強化するかなど、そういうことしかないのかなと思います。そもそも曲に対して叩くという行為がおもしろいので、そこを伸ばしていくのがよいのかなと思っています。

あとは背景の演出というのも入れてみると大きいもので、実際作っていて、ここが入るとすごくおもしろいなと感じました。

カメラワークをインタラクティブに変化させる

背景の情報のレイヤーをおもしろくすることなんですが、個人的には固定の演出ではなくインタラクション性のある演出だとおもしろいのかなと思います。すごく難しいところなんですが、例えばキャラの並び順を変えたらダンスが変ったり、要所要所で成功とか失敗の演出が入ったり、確率発動のスキルのカットイン的なものが出たり、プレイ結果によって表情やエフェクトなどが変わるといったところがおもしろさの1つかなと思います。

「ありすのステージ」で取り入れているものとしては、他のゲームではあまりありませんがカメラワークを毎回変化させています。ただし、「この画面ではこのカットで見せたい」ということもあるので、それらは別途指定するようにしています。

あとはサビ前でウインクする目がランダムだったり、ステージ終了時にスコアによって表情が変ったり。あとはカメラワーク切り替えのタイミングをタップなどの入力。タップの入力に合わせることによりタップしたらカメラワークが変わったと思わせるようなことも狙っていたりします。

カメラワークが毎回変わる例の紹介動画です。

ここではどの角度でもよくて、特定のカットは見せたいので同じようなカメラワークになるようにしています。ここはまたどこでもいいので状況に応じて変ったりするようにしていて。最後のキメのところは指を上げたところに視点が向くように制御しています。

では、実際どうやって制御したかといいますと、『ユニティちゃんライブステージ!』の実装がベースになっています。『ユニティちゃんライブステージ!』は、あらかじめステージ上に20個ぐらいの点が置いてあって、自分と近くないところをランダムに選んで、そこに2秒間隔で飛ぶ、みたいな実装になっています。

そこから改造した点としては、切り替えタイミングを2秒ではなくて、「このタイミングで飛んでください」と外から指定できるようにしたり(登壇者注:後ほどユニティちゃんライブステージの実装を確認した所、切り替えタイミングは3.42秒に1回(2小節に1回)、切り替えタイミングとカメラポジションの指定はアニメーション経由で指定できるようです)。

あとは、ジャンプカットではなくてつないでカメラが動くようなことも入れています。それは、自分もあまりカメラについて詳しくないんですが、30度ルールとか20パーセントルールに該当しそうな場合、ジャンプカットに適さない場合にそのようにしています。あとは「ここだとつないでカメラを動かしたい」というときもつないで動かしています。

あとは、注視点をキャラ以外に設定できるようにしたり、あとは「この画面ではここから表示させたい」というのをつけたり、逆に「ここから表示したくない」というのをつけたりしています。あとはポストエフェクトのかかり具合を場所によって調整できるようにしています。

具体的なコードの図で、これ個人開発なのと試行錯誤していたのもあってマスターデータ化していなくてすごい見苦しい感じなんですけど、曲に合わせて小節指定をしていたりしていて、だいたい2小節に1回飛ぶようにしています。

「見せたいこの場所ではこの3ポイントのどこか」とか「この場所ではここから何メートル以内にはカメラが動かないように」。ダンスモーションで移動するときに移動先にカメラがあるとちょっとめり込んだりするので、そういったことを避けるようにしています。

表情を音楽に合わせて変える

カメラのほかに、BGMと同期しているものもいくつかあります。例えば口パクなんですがあるんですけど、口パクはボカロのVSQXというデータを書き出してこのタイミングでこの口だっていうのを出して。例えば「ゆ」だったら「う」、「め」だったら「え」みたいな対応表を出してその口にしています。例外もいくつかあって。例えば「ちゃ」とかはちょっと笑顔な口になるようにとかはしています。

表情も一部スクリプトから制御してあります。基本的には表情はアニメーションをつけてもらっているのでそれを表示するんですが、「ここではウインクを逆にしたい」とか「ここではスコアによって笑顔にしたい」とか、そういうことを外から触っています。

どうやっているかというと、ブレンドシェイプになにも値が入っていないときだけ有効になるようにして、アニメーション側でデータがないときにこれらが有効になるようにしてます。

これはデータの入力時に、歌詞のタイミングがあると「ここで表情を変えたいな」というのがつけやすかったので、コメントとして残してあったりします。

あとBGMとの同期とかでいうと、キャラのダンスとかライトの演出があるんですけど、アニメーターのスピードでアニメーションクリップの速度を変更すると、ちょうど1小節がタイムラインの1になって演出つけやすいのでおすすめです。

また、時間によってBGMとアニメーションの再生がズレていくことがあります。そんなときはカメラが飛ぶタイミングでアニメーションの時間を補正することによってバレずに戻せるので、そういうタイミングで補正かけるのがおすすめです。

音ズレの原因と対策

長くなってしまいましたが、タップ音が気持ちいいというのも重要というお話をここからします。タップであればタップのエフェクト、長押しであれば長押しのエフェクトとかがあったほうがいいという話と、鳴ってることがわかるような音というのが重要です。

あと、ズレていると気分が悪いので合わせる必要があります。基本的にはタップしたらすぐ鳴らせばいいんですが、素材が原因でズレることがあったり、端末によってレイテンシの問題でズレることがあります。

レイテンシの問題については、UnityではDSP Buffer Sizeを小さくしたり、System Sample Rateを大きくしたりすると改善することがあります。

「ありすのステージ」ではiOSとかAndroidはベストレイテンシの256、Windowsはちょっとぷちぷちすることがあったのでデフォルトの1024にしてあります。System Sample Rateはデフォルトの、モバイルはデフォルトで24000なんですが、44100にしてあります。

Androidはこれでもぜんぜん解決しなくて、おそらくネイティブプラグインとか使うとちょっとましになるのかもしれないんですが、ちょっと沼で自分もよくわからないので、興味ある方は下のリンクを見ていただくと、どういう理由で遅れているとかがわかるのでおすすめです。

これはDSP Buffer Sizeを変えてみた動画です。今、64にしたときにちょっと音が崩れました。そういうことがあるという話と、遅くすると鳴り始めるまで遅いという動画になります。

音ズレはどこまで許容できるか?

対策なんですが、譜面を早く流すというのが主流みたいです。あとはタップ音を鳴らさないという実装もあると思います。「ありすのステージ」はとくになにもしていなくて、iOSメインなのでなにもしなくていいかなといった感じです。

遅れてきて聞こえる例を出します。まずなんにもしない場合なんですけど。

これクリック音つけて鳴らすとほとんどズレてなくて、±10msぐらいの間に収まっています。遅れて聞こえているとどうなるかというのを、1フレームずつ遅らせると……。

人によると思うんですけど、個人的には3フレーム遅れるとちょっときついかなっていう感じがします。ただ、実際はプレイしながらなのでもう少し許せるかなと思います。

あとは、最後に「曲に合わせて鳴らせばいいの?」って話なんですけど、実はそういうことでもなくて。例えば同時押しとかは、同時に押されたほうが気持ちいいので、遅らせたことがいいこともあります。

具体的には、「ありすのステージ」では2フレーム間だけ猶予を取って降着優先で鳴らすようにしてあります。比較の動画です。これが同時に鳴らしたときです。これが1フレームずれて鳴った場合で。

ちょっとなんか……。まぁ実際触ってみないとわからないところなんですけど(笑)。

(会場笑)

参加者:1フレームの遅れはわからない(笑)。

清水:実際、同時押しが「あれ?」って思ったら、遅らせて鳴らして同時に鳴らしたほうがいいです。

以上です。自分さっきのずっと流れていた曲の宣伝をしたかったので、ちょっと下に書きました。

(会場笑)

ありがとうございました。

(会場拍手)