Unity:ぶつかった時に音を鳴らす

unityのロゴ画像 Unity

3Dプロジェクトを使って、オブジェクト同士がぶつかった時に効果音を鳴らす方法を解説します。

プロジェクトの準備

3Dプロジェクトを新規作成し、3D ObjectのPlaneCubeをそれぞれ1個配置します。

※Materialで適当に色をつけています。(マテリアルの使い方はこちら

オブジェクト同士のぶつかり判定には最低限どちらか一方にRigidbodyが必要です。
今回、Cubeを落ちてくるようにしたいので、Cube を選択し、Inspectorウインドウから Add Componentボタン > Phisics > Rigidbody を追加します。

このまま実行すると1回しかはねないので、Plane物理マテリアル(Phisics Material)を追加します。

※物理マテリアルの作り方と設定はこちら

名前はYukaとしました。

物理マテリアルYukaの設定例です。
Bounciness0.93Bounce CombineMaximumとしてゴムボールみたいに跳ねるようにしてあります。

Yukaドラッグ&ドロップでシーン上のPlaneに追加します。

実行してCubeがはねれば成功です。

シーンの準備は以上です。

効果音の準備

ぶつかった時に鳴らしたい音であれば何でもOKです。
Assetsフォルダにドラッグ&ドロップして追加してください。

わたしはOtoLogicというサイトからGB アクション01という音源ファイルを利用させて頂きました。
ゲームボーイ風の音源が12種類入っていて使いやすいです。
以下からMP3形式の音源ファイルをダウンロードできます。

フリー効果音:アクションゲーム用セット|OtoLogic
フリー効果音:アクションゲーム用セット|「ジャンプする」「踏む」など、アクションゲーム制作に特化したSEをまとめています...

ダウンロードして解凍したフォルダごとAssetsフォルダにドラッグ&ドロップして追加しました。

フォルダには12種類入っていますが、今回はジャンプした時の音のようなGB-Action01-01(Jump).mp3を使ってみました。

スクリプトの作成と設定

ぶつかった時に音を鳴らす2つの方法を示します。

1つはオブジェクトの位置によって音量が変わる例、もう1つはオブジェクトの位置に関わらず同じ音量で鳴らす例です。

オブジェクトの位置によって音量が変わる例 では、例えばCubeに対して音を設定した場合、Cubeが遠くに見えている時は音が小さく、Cubeが近くにある時は音が大きく聞こえます。スクリプトはこちらの方が簡単です。

オブジェクトの位置に関わらず同じ音量で鳴らす例では、実行した時のシーンの状態がどんなであれ常に同じ音量で再生されます。スクリプトはこちらの方が少し面倒です。

スクリプト例1:オブジェクト位置によって音量が変わる

C# ScriptをAssetsに新規作成します。
名前はCollisionSound1とします。

スクリプトは以下の通りです。
ハイライト部分を入力してください。

CollisionSound1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionSound1 : MonoBehaviour
{
    // ぶつかった時の音
    public AudioClip se;
    
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        
    }

    // ぶつかった時に音を鳴らす
    void OnCollisionEnter(Collision col)
    {
        AudioSource.PlayClipAtPoint(se, transform.position);
    }
}

CollisionSound1Cubeにアタッチします。

鳴らしたい音をProjectタブの画面上に表示しておきます。

HierarchyウインドウのCubeを選択します。
InspectorウインドウのCollision Sound 1にあるSe項目に鳴らしたい音源ファイルをドラッグ&ドロップします。

実行するとCubeが床で飛び跳ねるたび(ぶつかるたび)に音が鳴るようになります。

AudioSource.PlayClipAtPointには引数が2つあります。

AudioSource.PlayClipAtPoint(鳴らしたい音源, 鳴らす位置);

鳴らしたい音源AudioClip型鳴らす位置は、Vector3型となります。

今回は、

AudioSource.PlayClipAtPoint(se, transform.position);

としてスクリプトをCubeにアタッチしたのでCubeの位置で音が鳴るようになります。(たぶん直接音源を鳴らした時よりも音量が小さいはずです)

スクリプト例2: オブジェクトの位置に関わらず同じ音量

スクリプト例1の状態がそのまま使えますので、必要部分のみ解説します。

Cubeを選択、InspectorウインドウのAdd Componentボタンから、Audio > Audio Source を追加します。

追加した状態

スクリプトCollisionSound1ハイライト部分を修正します。
9~10行目・15~16行目を追加、28行目はコメントアウトし、29行目を追加しています。

Collision Sound1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionSound1 : MonoBehaviour
{
    // ぶつかった時の音
    public AudioClip se;
    // AudioClip再生用
    AudioSource audiosource1;
    
    // Start is called before the first frame update
    void Start()
    {
        // AudioSourceコンポーネント取得
        audiosource1 = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {

    }

    // ぶつかった時に音を鳴らす
    void OnCollisionEnter(Collision col)
    {
        // AudioSource.PlayClipAtPoint(se, transform.position);
        audiosource1.PlayOneShot(se);
    }
}

見た目は変わりませんが、スクリプト例1より音量が大きくなっています。

AudioSource.PlayOneShotには、鳴らす位置の設定はありませんので、引数は鳴らしたいAudioClipのみです。

audiosource1.PlayOneShot(se);

その代わり、オブジェクトに設定したAudioSourceコンポーネントを取得する必要があります。

void Start()
{
    // AudioSourceコンポーネント取得
    audiosource1 = GetComponent<AudioSource>();
}

ぶつかった時の音の鳴らし方を2通り紹介しました。
必要に応じて使い分けてみてください。

以上、Unity:ぶつかった時に音を鳴らすでした。

コメント

タイトルとURLをコピーしました