【Unity】同じオブジェクトの上で場所によって足音を変える

投稿者: | 2021-04-03

同じオブジェクトの上を歩くときに、場所によって足音を変えてみます。

まず、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で使うマテリアルを一つにしても問題ありません。

コメントを残す

メールアドレスが公開されることはありません。