読者です 読者をやめる 読者になる 読者になる

おもちゃラボ

Unityで遊びを作っていきます

【Unity】オブジェクトを破棄するタイミングで効果音を鳴らしたい

オブジェクトを破棄(destroy)する直前で効果音を鳴らそうとしても、オブジェクトが破棄されると、AudioSourceコンポーネントもあわせて破棄されてしまうので効果音が鳴りません。 
 
たとえば、シューティングゲームでは、ミサイルが敵にあたったタイミングで、爆発音を鳴らしますね。この場合、敵もミサイルも破棄するので、どちらのオブジェクトにAudioSourceコンポーネントをアタッチしても爆発音は鳴りません。

f:id:nn_hokuson:20170421195844p:plain:w450

この対策として、破棄するオブジェクトとは別に効果音用のオブジェクトを作っておき、そのオブジェクトで効果音を鳴らすというのが常套手段かもしれません。ただ、小さいデモ用のプロジェクトでこれをするのは、すこし面倒です。
 
そんなときに使えるのが、PlayClipAtPointメソッドです。このメソッドは、鳴らしたいオーディオクリップと座標を引数に指定すると、指定した場所に新しく一時オブジェクトを生成し、効果音を鳴らしてくれます。

引数 意味
clip 再生するためのオーディオデータ
position 音の発生源からのワールド空間内の位置
volume 再生時の音量

 
しかもしかも!効果音の再生が終わったら、一時オブジェクトは自動的に破棄されるのでゴミオブジェクトが残ることもありません。
 f:id:nn_hokuson:20170421201258j:plain

たとえばミサイルクラスで効果音を鳴らすには、次のようなプログラムになります。

public class MissileController : MonoBehaviour 
{
    // 爆発効果音
    public AudioClip explosionSE;
        
    void OnCollisionEnter2D(Collision2D other)
    {
        if( other.gameObject.tag == "Enemy" )
        {
             // オーディオを再生
             AudioSource.PlayClipAtPoint( explosionSE, transform.position);
             // ミサイルオブジェクトを破棄
             Destroy(gameObject);
        }
    }
}

  
PlayClipAtPointメソッドは案外知られていませんが、unityでサクッと試作を作りたいときには、重宝するメソッドですね!
 

シューティングゲームアルゴリズムマニアックス (C magazine)

シューティングゲームアルゴリズムマニアックス (C magazine)