同じオブジェクトの上を歩くときに、場所によって足音を変えてみます。
まず、Blenderで中央に大理石のマテリアルのある床を作りました。
UV展開する
足音を変えるときにUVテクスチャ座標を使うので、プロパティの+ボタンをクリックして、そのためのUVマップを追加します。
この二番目のUVマップを選択して新しくUV展開します。このときは、別のマテリアルを使うアイランドがX(U)座標ではっきりと分かれるように展開しました。
境界の辺を複数選択すると、Xが0.693のところでアイランドが分かれているのがわかります。
これをFBX形式でエクスポートしてUnityでインポートします。
Unityのインポート設定
インポート設定では、Read/Write Enabledのチェックを入れて、Generate Lightmap UVsのチェックを外します。
FBXファイルを開いてメッシュを選択すると、インスペクタでUVレイアウトを確認できます。
プレビューのドロップダウンからUV Layoutを選ぶと、1つ目のUVマップが表示されます。
その左のドロップダウンでChannel 1を選択すると2つ目のUVレイアウトが見れます。
Generate Lightmap UVsのチェックを入れると、このレイアウトが表示されなくなり、ライトマップ用に自動生成されたUVに変わるようです。
一つ目のUVマップをこのように展開すると、UV2を使う必要はないかもしれません。
スクリプトで足音を変える
スタンダードアセットのFirstPersonControllerクラスで足音を変えられるようにします。まず足音を変えるメソッドを追加します。
[SerializeField] private AudioClip[] m_FootstepSounds; // デフォルトの足音
AudioClip[] footstepSounds;
[SerializeField] AudioClip[] m_FootstepSounds_flooring; // フローリングの足音
[SerializeField] AudioClip[] m_FootstepSounds_marble; // 大理石の足音
[SerializeField] AudioClip[] m_FootstepSounds_carpet; // カーペットの足音
// 足音を変える
void SwitchFootStepAudio(RaycastHit hitInfo)
{
switch(hitInfo.collider.tag)
{
case "Floor":
if(hitInfo.textureCoord2.x >= 0.693f)
{
footstepSounds = m_FootstepSounds_marble;
}
else
{
footstepSounds = m_FootstepSounds_flooring;
}
break;
case "Carpet":
footstepSounds = m_FootstepSounds_carpet;
break;
default:
footstepSounds = m_FootstepSounds;
break;
}
}
足元にレイを飛ばして、そのヒット情報を引数に渡すことにしました。タグで床を判別して、床なら二番目のUVテクスチャ座標のX座標を境にして足音を変えます。
0.693以上で大理石、それ未満ではフローリングの足音を代入しています。タグがカーペットのときはカーペットの足音を入れます。
そして、足音を鳴らすメソッドの中で足元へレイを飛ばします。
private void PlayFootStepAudio()
{
//...
// 足元にレイを飛ばす
RaycastHit hitInfo;
if(Physics.Raycast(transform.position,Vector3.down,out hitInfo,2f,~(1 << 9)))
{
SwitchFootStepAudio(hitInfo);
}
// ...
m_AudioSource.clip = footstepSounds[n];
// m_AudioSource.clip = m_FootstepSounds[n];
// ...
}
このメソッドはもともと、デフォルトの配列m_FootstepSoundsの中の音声を連続しないように再生するものですが、音声配列の変数を新しく宣言したものに変えて、足音を変えるメソッドでその中身を入れ替えるようにしました。
レイがプレイヤーに当たらないように、プレイヤーの体に新しいレイヤーを付けて、~(1 << 9)でそのレイヤーだけ無視するようにしています。
床やカーペットのオブジェクトには、タグとコライダーを付けています。
これで場所によって足音を変えられました。
足音の音声を作る
足音の音声はフリー素材からUnity用の足音の音源を作るの方法で簡単に作れます。
4つくらいずつ作ってスクリプトにアタッチしています。
マテリアルを統合する
UV座標によって音を変えているので、Blenderで一つのテクスチャにベイクして、Unityで使うマテリアルを一つにしても問題ありません。