こんばんは!
ヨシサブロウです
最近、レベルデザインをやっていましてなかなかプログラムの記事がかけなくてすみません。
今回は
様々な状況の複雑な足音を鳴らす方法
を書いていきます。
単純な地面によって変わる足音の鳴らし方はいろいろな所で紹介されているので、そちらを参考にしてください!
ただ地面で足音が変わるだけじゃ嫌なんだ!
落ち葉を踏んでいるとかビニール袋を踏んでいるとかでも音を変えたいんだ!
という人向けの記事です。
地面によって変えるだけのプログラムもこれを読めば書けるようにはなると思いますが。
どんな足音を鳴らしていくのかと言いますと
- どんな種類の靴を履いているのか
- プレイヤーの体重はどれぐらいなのか
- 武器の重さは
- どんな地形なのか(コンクリート、土、砂など)
- 何の上を踏んだのか(落ち葉、枯れ枝、ゴミ、ビニール袋など)
これを全てひっくるめた足音を鳴らしていきます。
まず、前提条件として
僕は、音の混ぜ合わせはサウンドディレクターの藪本くんにWwiseの方で処理をしてもらっています。
無料で、ある程度まで使えるので
音をゲームに入れるならば絶対に使ったほうがいいです!
導入方法はこちらの記事にあります。
僕のブログでも連携方法を紹介していきます!
それでは早速
まずは、どんな地形を踏んでいるのか
の判断の方法から説明していきます。
(簡易足音の実装はこれだけで十分です)
地形に当てているマテリアルに物理マテリアルを追加していきます。
本来、物理マテリアルはその物理マテリアルが設定されているオブジェクトの摩擦力や反発力などを設定できる物なのですが
今回は物理マテリアルに設定する事ができる
”サーフェイスタイプ”
を読み取ることでどんな地形なのかを判別していきます。
サーフェイスタイプは、コリジョンのオブジェクトタイプみたいな感じで色々種類を分けるために使う物です
オブジェクトタイプなどと同様にプロジェクト設定からサーフェイスタイプを追加していきます。
ここに好きに設定してください!
Wwiseとの連携を考えると英語で設定したほうが無難です。
そしてコンテンツブラウザーで物理マテリアルを作ってサーフェイスタイプを設定してください。
これをそれぞれの地形のマテリアルに設定していってください。
これで地形の方のセットはおしまいです。
このサーフェイスタイプを取得するには
LineTraceでちょちょっとできます
TraceTypeはVisibilityで大丈夫です。
僕はTraceTypeを作るのが趣味なので作りました
このGet Surface Typeで何を踏んでいるかを確かめます。
これで取得ができるようになりました。
しかし!!複雑な足音を鳴らしたい貴方は
LineTraceByChannelではなくMultiLineTraceByChannelを使ってください
同時にいろいろ踏み踏みしているときでもコイツで判断していきます。
何を踏み踏みしているのかはまた、それぞれのオブジェクトに物理マテリアルを適応させるだけで大丈夫です。
しかしそれをそのままTraceで検知してしまうと
*ペンタブをいただいたのでウキウキで使ってます。初めてのペンタブです
踏んでいるものは
- ビニール
- 落ち葉
- 岩
- 土
となってしまいます!!
岩の上に乗ったから土の音が鳴ってしまってはダメですよね!
ですので、LineTraceは流れる向きがあることを利用してそれを解決します!
この場合だと検出される順番は
- ビニール
- 落ち葉
- 岩
- 土
です。
なので基本となる地形マテリアルを決めておいてそのマテリアルを検知したらそれより下のマテリアルは検知しないようにします。
今回ならば
岩と土
を基本地形マテリアルにしておけば
岩を通過した時点で土は検出されません。
Ground Arrayはマテリアルのサーフェイスタイプの配列です。後ほど説明します。
このCheck_Surfaceで基本地形マテリアルかどうかをチェックしています。
変態マクロマンなので、またマクロを使っています。
Check_Surfaceの中身です。
とりあえず仮実装として
- コンクリート
- 土
- 石
を基本地形として、それらのどれかが来たらマクロSetSurfaceを実行して先程のLoopをBreakしています。
変数GroundTypeについては後述。
マクロSetSurfaceも後ほど公開します。
これで、基本岩と土が一緒に鳴ることはなくなりました。
次に音の構成に入っていきます。
大まかに分けると音は
みたいな感じに鳴っています。
*体重の重さで、靴の音や地面の音の種類そもそもを変えたりなどしていますが。。。
靴の音は
- 靴の種類
- 基本地形
で判断して一つの音を鳴らしています。
完全に靴が当たった音だけですね
地面の音は
- 基本地形
- 踏んでいるモノ
をそれぞれ鳴らしています。
複数音なります。
それぞれの音を決定する時に体重を参考にして決定していくと
どんな状態の足音でも鳴らすことができます。
(簡単にするならば、体重で音量を変えるだけでも大丈夫ですが、ある程度の体重ごとに音を分けたほうがリアルです)
音を同時にならすのはWwiseでやるとすごく綺麗になります。
一応Unreal Engine 4 でもサウンドキューを使えばできると思います。
(あまり使った事が無いので要検証です)
それでは以上を踏まえた上で全体のプログラムの説明に入っていきます。
*Wwiseで鳴らす事を前提として書いていますが、仕組みがわかればUE4だけで完結させることができますのでわかりやすいように書いていきます。
変数
- Body / Float / 体重を入れます
- Weapon / Float /武器の重さを入れます
- Shoes / Name / 履いている靴の名前を入れます(Wwiseを使用しない場合はIntでも大丈夫です)
- Grounds_Array / EPhycial Surface(Array / 物理マテリアルのサーフェイスを配列で入れます
- GroundType / Name / 基本地形の名前を入れています(Wwiseを使用しない場合はIntでも大丈夫です)
プログラムの全体図
思ったのですが、プログラムの全体図がまず見れたほうがわかりやすいですよね。
今までのやつも全体図上げていきますね
*僕のWwiseが少し調子が悪くて連携テストができていないのでちょこちょこWwiseの所は変わるかもです。変わったら記事にします
赤で囲っているのはWwise特有のイベントです。何をしているかの説明を書くのでUE4のみでもできると思います。
マクロCheack_Surface あ、これスペル間違えてますねCheck
マクロSet_Surface
それでは説明していきます。
前提として、キャラクターの方からBody Weapon Shoes は入れ込んでいます
走っているアニメーションからの通知を受けた時に
プレイヤーの総体重をSetRTPCValueします。
これはWwiseに数値を渡すノードなのでUE4のみの場合は
この数値でほげほげしてください
Set SwitchはWwiseに靴の名前を送っているだけなのでUE4のみの場合はここで靴の音をサウンドキューに設定してください。
そしてLineTraceですね。
LineTraceが出る若干のズレが気になる方は上の2つをLineTraceの後に持ってきても大丈夫です。
前回の足音のステップの時に踏んでいたもの(GroundsArray)をClear Arrayで綺麗にしてからTraceにHitしたモノを回していきます。
まずはCheck_Surfaceしていきましょう
基本地形が当たった場合だけ、それをGroundTypeに格納してからSetSurfaceをしてこのループをブレイクさせます。
それ以外の場合はSetSurfaceに直行です(あれ、マクロの外に出す必要無かったな・・・変えておこう)
SetSurfaceでは
まずは、今当たったモノがもうすでに配列GroundsArrayに格納されていないかどうかを調べます。
格納されていない場合のみ、GroundsArrayに格納してそれをWwiseに送ります。
*Wwiseを使わない場合は配列にサーフェイスをNameに変えて入れてまとめて再生してください。やり方は後述
PrintStringでは今踏んだモノを出力しています。
ループが終了したら
GroundTypeの中に入っている基本地形をWwiseに教えます。
UEのみの場合はこれをBoolでまた分けてサウンドキューに教えます。
そして最後にすべてを再生します。
WwiseなのでPost Eventですが
UE4では
ここらへんのノードとBoolなどでお願いします。
Audio はAudioComponentです。
ただ、やはり音を混ぜ合わせる時はWwiseをおすすめします。
と言うより音はやはりWwiseの方が良いと思います。
それではまた!