2014年1月22日水曜日

スクリプトでサウンド再生~Unity

スクリプトにてAssetsのサウンドリソースから再生するメモ。言語はC#。


■サウンドファイルの準備


サウンドファイルを用意する。ここでは以下のwavファイルを用意。

DialBtn.wav 


予めAssets内のResourcesフォルダ配下に置く。ここではSoundフォルダを作りその下に配置。
※Resources配下以外の位置に置くとうまくいかないので注意。


今回は予めUnity画面上で空のGameObjectを用意。当該スクリプトはそこに放り込んでおく。



■コード実装

適当に定数定義する:

※この時のパスは暗黙で /Resources/ がついていることになっている。

    const string SNDNAME_DialBtn = "Sound/DialBtn";



リソース生成用の型宣言:

※宣言だけなので中身はまだ無い。

    AudioClip audioClip_DialBtn;

発声チャンネルの型宣言:

    AudioSource audioSource_DialBtn

 1つで1音(1ファイル再生)。同時発生させたい場合は複数用意する。



リソースをロードしてインスタンス化:

※この時戻り値がnullならロードに失敗しているのでチェックすると良い。

    audioClip_DialBtn = Resources.Load(SNDNAME_DialBtn, typeof(AudioClip)) as AudioClip;

または、

    audioClip_DialBtn = Resources.Load<AudioClip>(SNDNAME_DialBtn);


発声チャンネルをコンポーネントに追加:

        audioSource_DialBtn = gameObject.AddComponent<AudioSource>();


おまじない:

    ガベージコレクションされないように指定らしい。
  多分発声が少ない場合などにガベコレで履きだされると発声時にラグが出る?

    GameObject.DontDestroyOnLoad(this.gameObject);



ここまでは Awake()かStart() あたりで初期化処理としておく。

発声:



    audioSource_DialBtn.clip = audioClip_DialBtn; //音色(wav)をチャンネルに紐付け
    audioSource_DialBtn.volume = 1.0f;  //ボリューム設定。0~1.0範囲
    audioSource_DialBtn.Play(); //発声

    ループ再生時は以下を指定
    audioSource_DialBtn.loop = true;



■実装について思うこと

サウンド処理については以下のような感触

  1. サウンド発声処理は一箇所に集約していいとおもう。
    →サウンドクラス化。
  2. 複数インスタンスで利用することは想像しにくい。
    →Staticクラスでもいいかもしれない。とりあえず今は非Static。
  3. 同時多重発声はチャンネルを最大数確保しておけば楽そう。
    →事前にStart()等で AudioClip型を紐付けしておいてしまってもいいかもしれない。
     発声チャンネルの確保による負荷はちょっと気になるが未確認。多分確保数よりも実際の動的な同時発生数かもしれない。
ちなみにUnityのサウンドはステレオで「位置」を表現してます。DirectSoundぽい感じ。
ドップラー効果もかかるらしい(オフもできる)。



0 件のコメント:

コメントを投稿