【Unity】PlayClipAtPointとは?指定した座標から音声を鳴らすメソッド

Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「PlayClipAtPointってなに?」

「オブジェクトを破壊した後に音声を流したい!」

というお悩みの方に向けた内容となっています。

Unityで音を流す際、一般的にはAudioSourceを使ってPlayPlayOneShotを使いますが、他にもPlayClipAtPointというメソッドがあります。

このPlayClipAtPointメソッドは、指定した座標に新しく音を流すためのオブジェクトを作成し、音声を流した後にオブジェクト自体を破壊する処理を行うメソッドです。

そのため、ゲームオブジェクトを破壊した後に音声を流したいという場合は、PlayClipAtPointメソッドを使うと非常に便利です。

そこでこのページでは、Unityで指定した座標から音を流すことができるPlayClipAtPointメソッドについて、どんなメソッドなのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

PlayClipAtPointとは?

まずは、PlayClipAtPointメソッドがどういうメソッドなのか紹介していきます。

ゲーム内の指定された位置から音を流すメソッド

PlayClipAtPointメソッドは、ゲーム内で指定された位置から音を流すことができるメソッドです。

通常、Unityで音声を流す場合は、オブジェクトにAudioSourceコンポーネントを紐づけて、その中で定義されているPlayメソッドやPlayOneShotメソッドを使うことになります。

このPlayやPlayOneShotは、AudioSourceコンポーネントが紐づいているゲームオブジェクトの座標の位置から音を流すという処理が行われます。

一方で、PlayClipAtPointメソッドは、新しく音声用のAudioSourceが付いたオブジェクトを指定した位置に作成して、そのオブジェクトから音を流すことになります。

そして音を流し終わったら、その音声用のオブジェクトは消去されることになります。

そのため、PlayClipAtPointメソッドを使うことで、ゲームオブジェクトとは別の位置から音を流すことができるようになります。

オブジェクトが破壊された際のSEとして使われる

PlayClipAtPointメソッドは、ゲームオブジェクトが破壊された際に音を流すといった場合に使われることが多いです。

Playメソッドの場合、AudioSourceを紐づけているゲームオブジェクトが破壊されてしまうと、音を流すことができないため、別のオブジェクトで準備しておく必要があります。

しかし、PlayClipAtPointメソッドであれば、ゲームオブジェクトが破壊されると同時に、音声用のオブジェクトが作成されて音を流すということができるため、破壊されるオブジェクトに対してのスクリプト内でPlayClipAtPointメソッドを記述しておくことができます。

また、破壊されたゲームオブジェクトの座標位置から音声を流すことも簡単にできるため、オブジェクトが破壊された際のSEとして非常に便利に使えます。

PlayClipAtPointの使い方

ここからは、PlayClipAtPointメソッドの使い方を紹介していきます。

引数にAudioClipと座標を指定する

PlayClipAtPointは、以下のように記述して使います。

AudioSource.PlayClipAtPoint(AudioClip clip, Vector3 position, float volume);

引数の「clip」流したい音声をAudioClipで選択、「position」音声用のオブジェクトを作成する座標の位置を設定、「volume」音声を再生する際の音量を指定します。

なお、volumeは省略することも可能です。

例えば、2Dゲームでマウスをクリックしたら、そのマウスのカーソル位置で音声を流すという処理を作ってみます。

空のオブジェクトを作成して、以下のようなスクリプトをアタッチしておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    public AudioClip clip;  // 流したい音声データ
    Vector3 position;   // 音声用のオブジェクトを作成する位置

    void Update()
    {
        // マウスをクリックした場合
        if (Input.GetMouseButtonDown(0))
        {
            position = Camera.main.ScreenToWorldPoint(Input.mousePosition); // マウスカーソルの位置を取得
            AudioSource.PlayClipAtPoint(clip, position);    // 音声用のオブジェクトを作成する
        }
    }
}

マウスをクリックした場合の処理の中の14行目で、PlayClipAtPointメソッドを記述しています。

このPlayClipAtPointメソッドの引数の中で、音声データをAudioClip型の変数で指定して、音声用のオブジェクトの座標位置をマウスカーソルの位置に指定しています。

マウスカーソルの位置は13行目のように、ScreenToWorldPointメソッドを使ってあげることで取得できます。

また、5行目で宣言したAudioClipの変数には、まだ音声データが入っていないので、空のオブジェクトを選択してインスペクターウィンドウから、音声データを選択もしくはドラッグ&ドロップで指定してあげます。

これで実際にゲームを実行してみると、

マウスをクリックする度に「One shot audio」という新しいオブジェクトがマウスカーソルの位置に生成されて、音声が終わるとオブジェクトが削除されているのが分かります。

オブジェクトの破壊後に音声を流す処理を作る

PlayClipAtPointメソッドは、前述の通り、オブジェクトが破壊された際の音を流す処理でも使われます。

ここでは、オブジェクトを配置して、スペースキーを押したらそのオブジェクトが破壊されると同時に、音声が流れるという処理を作っていきます。

ゲーム内にオブジェクトを配置して、そのオブジェクトに以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    public AudioClip clip;  // 流したい音声データ

    void Update()
    {
        // スペースキーを押した場合
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Destroy(gameObject);    // オブジェクトを破壊する処理
            AudioSource.PlayClipAtPoint(clip, transform.position);    // 音声用のオブジェクトを作成する
        }
    }
}

スペースキーを押した場合の処理の中の12行目で、Destroyメソッドを使ってオブジェクトを破壊する処理を行います。

そして破壊された際、音声が流れるように13行目でPlayClipAtPointメソッドを記述しています。

PlayClipAtPointで生成されるオブジェクトの座標は、破壊されたゲームオブジェクトの座標と同じにしたいので、「transform.position」を指定しています。

あとは、先ほどと同様に、オブジェクトを選択してインスペクターウィンドウから、音声データを変数に渡しておきます。

実際にゲームを動かしてみると、

スペースキーを押すとゲームオブジェクトが削除された後に、音声用のオブジェクトが作成されて音声が流れ、その後このオブジェクトも削除されているのが分かります。

まとめ

このページでは、UnityのPlayClipAtPointメソッドについて、どういう処理を行うメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

PlayClipAtPointメソッドとは、指定した座標に新しくオブジェクトを作成して、その場所で音を流した後、オブジェクトを消去する処理を行うメソッドです。

このPlayClipAtPointは、音声用のオブジェクトを作成してくれるので、ゲームオブジェクトを破壊した後に音を流したいという場合に、非常に便利に使えるメソッドです。

Unityで音声を流す場合は、PlayメソッドやPlayOneShotメソッドが使われることが多いですが、オブジェクト破壊の際のSEなどはPlayClipAtPointメソッドが使いやすいです。

最後までお読みいただきまして、ありがとうございました!

コメント