【Unity】スクリプトから動的に音声を再生する方法。非アクティブ化と重複再生の対応。

2022年8月25日

どうも、だらはです。
今回はスクリプトから音声を再生する方法について紹介していこうと思います。
具体的な関数は、PlayOneShotを使います。
(音声を重複再生したくなければPlayを使用)

スポンサーリンク

手順

では、早速スクリプトを紹介……と行きたいところですが、気を付けないと重大な出戻りに成りかねないので先ずは注意点から。
それは、本来音源にしたいオブジェクトとは別に音源を準備することです。

例えるならば、本来音源にしたいオブジェクトがキャラクタだとすると、別の音源とはスピーカーです。
下図1では、CrownDropがキャラクタでSoundObjがスピーカーに相当します。
CrownかDropをクリックすると、SoundObjに音声(AudioClip)が渡されるようにスクリプトを組むのです。

ゲームオブジェクトの設定について、以下の図を参考に設定してみて下さい。

◆図1

◆図2

◆CrownとDrop(キャラクタ)にアタッチするスクリプト

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

public class SampleAudio : MonoBehaviour
{
    AudioSource audioSource;
    AudioSource audioSourceMy;

    void Start()
    {
        audioSourceMy = GetComponent<AudioSource>();
        audioSource = GameObject.Find("SoundObj").GetComponent<AudioSource>();
    }

    public void StartSound()
    {
        audioSource.PlayOneShot(audioSourceMy.clip);
    }
}

このスクリプトでは、CrownDropをクリックするとEventTriggerによりStartSound()が実行されるように作ってあります。

EventTriggerの使い方は別の記事にまとめましたので良ければ参考して頂けたらと思います。

AudioClipをスピーカーへ渡すような設計としたのには理由があります。
それは、音源の非アクティブ化を想定しているからです。
仮にキャラクタが音源となる設計にしたとき、キャラクタが非アクティブとなったときに音声が途中で途切れてしまいます。(シューティングゲームの弾やシーンの遷移ボタンなどで多用されると思います)

普段からこの使い方を徹底すると出戻りが少なくて良いと思います:)

まとめ

いかがでしたでしょうか。

  • 本来音源にしたいオブジェクトとは別に音源を準備する。
  • 音声再生にはPlayOneShot(AudioClip clip)を使う。

これに気をつければ、簡単にスクリプトから音声を再生することができます!

以上、だらはでした。

スポンサーリンク

応用

Posted by daraha_gm