[UE4][ue4jam2018]サウンドの反省
概要
ue4jamで作ったミニゲームのサウンド実装についての反省。
・衝突地点の物理マテリアルで再生するサウンドを選択した
・物理計算クラスとゲーム管理クラスを分離したかったのでコールバック的な実装にした(C++)
前提
・ゴルフのミニゲーム
・小さいステージを次々クリアしていく
・地形はLandscapeで生成
・地面の種類はMaterial Layerでペイント
・草、濃い草、土の三種類
・ゴールは専用Actor
・ボールのバウンド音を鳴らしたい
・「衝突」の情報が必要
・衝突速度
・衝突した地面の種類
やったこと
・衝突地点の物理マテリアル情報を使った
・いわゆる足音選択で使われる手法
・UE4で、地面の種類に応じた足音を鳴らすようにしてみる その1
・反射の物理挙動にも、物理マテリアルのパラメータを使っている(物理挙動実装の反省)。
・コールバックでサウンド再生の呼び出し(C++)
・ゲーム管理クラスが、物理計算クラスの実体作成時にstd::functionで衝突時のコールバック関数を登録する
・コールバック関数は衝突速度とバウンド率を引数に持つ。
・バウンド率の値を見て再生するサウンドの種類を決定。
・今回は地形別にバウンド率が異なったのでこれで選択できたが…
・衝突時の速度で音量を決定。一定の速度以下だった場合は何も再生しないようにした。
・1ステージが数秒で終わるので、テンポが良いBGM、SEをアサインする
・魔王魂さんのノリノリな曲をBGMにして効果音ラボさんの小気味よいスタート音・ゴール音いれた
良かった点
・閾値で足切り+速度でボリューム調整するだけでも、結構それっぽい音になった
・ホールイン音もそこそこ気持ちいい
・BGMとSEのノリが良すぎて、ステージ間、およびリザルトへの画面遷移トランジション演出を作らずに済んだ
なんか演出入れないでもテンポいい感じになった
・これは全部ステージを1レベルで作った関係でローディングが発生してない、というのもある(ステージ作成の反省)
悪かった点
・サウンド選択でSurfaceTypeを使わずにバウンド率を参照したせいで、
ステージ調整においてバンド率を調整すると、地面とサウンドがかみ合わなくなる危険が出てしまった
・「転がり音」が再生されない
・そもそも転がり挙動がないんだけれども…
今後の課題
・衝突サウンド選択は普通にSurfaceType使う
・なんで参考サイトもSurfaceType使っているのにわざわざ変えたんだろう…
・期間に対する焦りで目が曇っていた。
・C++側からは EPhysicalSurface::SurfaceType1 という感じに見えるが、
サウンド再生をBP側に移譲すれば中身を意識せず済むはず。
・SurfaceType で大まかな種類を決めて、 Speedの大きさでもさらに詳細に選択していくのはアリだろう
・転がり音の再生について
・ボールの挙動に「転がりモード」を定義して転がる音をループ再生するパターン
・物体への入射角と速度と物理材質をみて、放物軌道から、地面に沿った軌道に変える
・シミュレータが作りたいわけではないので、十分だろう
・この際、音も切り替えればよい
・小さい音を連続で再生するパターン
・たとえば、質点を立体的に配置して球とみなすような実装にした場合は、こっちが使える可能性が高まる
・魔王魂さんと効果音ラボさんには今後もお世話になりたい
以上