Unity AudioSource メソッド比較技術資料

Unity の AudioSource クラスは、ゲーム内で音声を再生するための主要なコンポーネントです。特に以下の3つのメソッドが頻繁に使用されます:

  • PlayClipAtPoint
  • PlayOneShot
  • Play

それぞれのメソッドは異なる用途と特性を持っており、適切な選択がパフォーマンスとユーザー体験に大きく影響します。本資料では、これら3つのメソッドの違い、使用シナリオ、利点と注意点について詳しく解説します。


AudioSource メソッドの種類

PlayClipAtPoint

AudioSource.PlayClipAtPoint は、指定したワールド座標でオーディオクリップを一時的に再生する静的メソッドです。内部的には一時的な GameObjectAudioSource を生成し、音を再生します。

PlayOneShot

AudioSource.PlayOneShot は、既存の AudioSource コンポーネントからオーディオクリップを重ねて再生するインスタンスメソッドです。複数の音を同時に効率的に再生できます。

Play

AudioSource.Play は、AudioSource.clip に設定されたオーディオクリップを再生するインスタンスメソッドです。主に長時間再生する音声(BGMなど)に使用されます。


各メソッドの詳細

PlayClipAtPoint 詳細

メソッドの種類: 静的メソッド

構文:

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

特徴:

  • 指定した位置で音を再生。
  • 3Dサウンドとして再生され、音源の位置に基づいて音量やパンニングが調整。
  • 一時的な GameObjectAudioSource を内部的に生成。
  • 再生後は自動的に GameObject が破棄される。

使用シナリオ:

  • 一度きりの3D音(例:爆発音、足音)。
  • オブジェクト破壊時の音再生。

PlayOneShot 詳細

メソッドの種類: インスタンスメソッド

構文:

audioSource.PlayOneShot(AudioClip clip, float volumeScale = 1.0f);

特徴:

  • 既存の AudioSource から音を再生。
  • 複数の音を同時に効率的に再生可能。
  • AudioSource の設定に依存(例:2D/3Dサウンド)。
  • 再生後も AudioSource は継続して存在。

使用シナリオ:

  • 短時間で複数回再生する効果音(例:ジャンプ音、攻撃音)。
  • 同じ AudioSource から複数の音を重ねて再生したい場合。

Play 詳細

メソッドの種類: インスタンスメソッド

構文:

audioSource.Play();

特徴:

  • AudioSource.clip に設定されたオーディオクリップを再生。
  • 主に長時間再生する音声(BGMなど)に使用。
  • AudioSource の設定に依存。
  • ループ設定も可能。

使用シナリオ:

  • BGMの再生。
  • ゲームの状態に応じて再生・停止する音声。

比較表

特徴PlayClipAtPointPlayOneShotPlay
メソッドの種類静的メソッドインスタンスメソッドインスタンスメソッド
AudioSourceの必要性不要(内部で一時的に生成)必要(既存のAudioSourceが必要)必要(既存のAudioSourceが必要)
3Dサウンドのサポート自動で3Dサウンドとして再生AudioSourceの設定に依存(spatialBlendAudioSourceの設定に依存(spatialBlend
一時的なGameObject生成ありなしなし
AudioClipの設定方法メソッド引数として指定メソッド引数として指定AudioSource.clip に設定
音の再生制御制限あり(再生後の操作不可)高い(音量調整などは可能)高い(再生、停止、ループなど詳細に制御可能)
同時再生の効率低い(多数の一時的なGameObjectが生成される)高い(同一AudioSource上で効率的に再生可能)低い(同一AudioSourceでの複数再生は不可)
使用に適したシナリオ一度きりの音の再生、オブジェクト破壊時の音再生継続的な音の管理、複数音の同時再生長時間再生するBGM、条件付きの音再生

PlayOneShot と GameObject の Destroy 時の使用

問題点

PlayOneShot を使用して音を再生中に、音を再生している GameObject を破壊すると、AudioSource が同時に破壊されるため、再生中の音も即座に停止してしまいます。これにより、音が途中で途切れることになります。

例:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public AudioClip jumpClip;
    private AudioSource audioSource;

    void Start()
    {
        audioSource = GetComponent<AudioSource>();
        if (audioSource == null)
        {
            audioSource = gameObject.AddComponent<AudioSource>();
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }

    void Jump()
    {
        // ジャンプロジック
        // ...

        // ジャンプ音を再生
        audioSource.PlayOneShot(jumpClip, 1.0f);

        // オブジェクトを破壊
        Destroy(gameObject);
    }
}

上記の例では、ジャンプ時に音を再生し、その直後に GameObject を破壊しています。結果として、音は途中で停止します。

解決策

音の再生が途中で止まらないようにするための主な方法は以下の通りです。

1. 音を再生する専用の GameObject を使用する

音を再生するための専用 GameObject を作成し、その AudioSource を用いて音を再生します。これにより、元の GameObject を破壊しても音の再生は継続されます。

実装例:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public AudioClip jumpClip;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }

    void Jump()
    {
        // ジャンプロジック
        // ...

        // 音を再生するための新しいGameObjectを作成
        GameObject audioObj = new GameObject("JumpSound");
        AudioSource audioSource = audioObj.AddComponent<AudioSource>();
        audioSource.PlayOneShot(jumpClip, 1.0f);

        // 音の再生が終わったら自動的に破棄されるように設定
        Destroy(audioObj, jumpClip.length);

        // 元のGameObjectを破壊
        Destroy(gameObject);
    }
}

2. AudioSource を Persistent に設定する

DontDestroyOnLoad を使用して、音を再生する GameObject をシーン間で破壊されないように設定します。これにより、音の再生が GameObject のライフサイクルに影響されません。

AudioManager クラスの実装例:

using UnityEngine;

public class AudioManager : MonoBehaviour
{
    public static AudioManager Instance;
    private AudioSource audioSource;

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
            audioSource = gameObject.AddComponent<AudioSource>();
        }
        else
        {
            Destroy(gameObject);
        }
    }

    public void PlaySound(AudioClip clip, float volume = 1.0f)
    {
        audioSource.PlayOneShot(clip, volume);
    }
}

使用例:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public AudioClip jumpClip;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }

    void Jump()
    {
        // ジャンプロジック
        // ...

        // AudioManagerを通じて音を再生
        AudioManager.Instance.PlaySound(jumpClip, 1.0f);

        // 元のGameObjectを破壊
        Destroy(gameObject);
    }
}

3. PlayClipAtPoint を使用する

PlayClipAtPoint は音を再生するために一時的な GameObject を生成するため、元の GameObject を破壊しても音は最後まで再生されます。この方法は単発の音再生に適しています。

実装例:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public AudioClip jumpClip;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }

    void Jump()
    {
        // ジャンプロジック
        // ...

        // PlayClipAtPointを使用して音を再生
        AudioSource.PlayClipAtPoint(jumpClip, transform.position, 1.0f);

        // 元のGameObjectを破壊
        Destroy(gameObject);
    }
}

ベストプラクティス

  • シーン全体でのオーディオ管理:
    • AudioManager クラスを導入し、音の再生と管理を一元化することで、コードの可読性とメンテナンス性を向上させる。
  • 用途に応じたメソッドの選択:
    • 一度きりの3D音: PlayClipAtPoint を使用。
    • 複数の音を効率的に再生: PlayOneShot を使用。
    • 長時間再生する音声(BGMなど): Play を使用。
  • パフォーマンスの最適化:
    • PlayClipAtPoint は一時的な GameObject を生成するため、頻繁に呼び出す場合はパフォーマンスに影響を与える可能性がある。必要に応じて AudioManager を活用。
  • 音の制御性の確保:
    • 音の再生後に停止や音量調整が必要な場合は、PlayOneShotPlay を適切に使用し、AudioSource のプロパティを活用。

まとめ

Unity の AudioSource クラスは、ゲーム内での音声再生において非常に強力なツールです。以下に各メソッドの適切な使用シナリオと選択の指針をまとめます。

  • PlayClipAtPoint
    • 用途: 一度きりの3D音(例:爆発音、足音)。
    • 利点: 簡潔に音を再生可能。オブジェクト破壊時でも音が継続。
    • 注意点: 頻繁な使用はパフォーマンスに影響。
  • PlayOneShot
    • 用途: 複数回または同時に再生する短時間の音(例:ジャンプ音、攻撃音)。
    • 利点: 同一 AudioSource で複数の音を効率的に再生可能。音の制御性が高い。
    • 注意点: 音を再生する AudioSource が破壊されると音も停止。
  • Play
    • 用途: 長時間再生する音声(例:BGM)。
    • 利点: ループ再生や詳細な再生制御が可能。
    • 注意点: 同一 AudioSource での複数クリップの同時再生は不可。

選択の指針:

  • 一時的な音再生: PlayClipAtPoint を活用。
  • 複数の音を効率的に再生: PlayOneShot を適切に管理。
  • 長時間の音声再生: Play を使用し、必要に応じて AudioSource を制御。

プロジェクトの要件や使用シナリオに応じて、最適な音声再生方法を選択し、効率的かつ効果的なオーディオ管理を実現しましょう。

Audio,Unity

Posted by hidepon