8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

2DのオブジェクトDestroy時にSEを再生したかった話

Posted at

忙しい人向け結論

2DオブジェクトのDestoryと共にSE再生はできない。
常設オブジェクトでSE再生させた。

#UnityでのSE再生の実装

  1. AudioSourceコンポーネントを付与してAudioClipに再生したい音源を登録する
  2. 鳴らしたいタイミングで以下のように呼び出す
[SerializeField] AudioSource _audio = null;

void PlaySe()
{
	// 該当の音を1回だけ再生する
	_audio.PlayOneShot( _audio.clip );
}

これで音が鳴らず、ハマったときに調査した項目です。
※Unity再起動、PCの音量設定は確認済み。

##Mute Audioの設定

Gameウィンドウの「MuteAudio」が押された状態(下記画像参照)だとすべての音が鳴りません。

2019-05-06.png

##AudioSourceのSpatialBlendの設定

今回作成中のゲームは2Dゲームでした。
AudioSourceコンポーネント内の「SpatialBlend」が1=完全に3Dに寄った状態になると
SE再生時にカメラとの距離を考慮した3D空間のような立体的なサウンド再生になるようです。
この設定により、音は鳴るのですが、異常に小さい音で鳴ってました。

Unityリファレンス:AudioSource.spatialBlend

2Dの場合この考慮は不要になるので、常に一定の音量で鳴らせるように0=完全に2Dに寄った状態にします。

2019-05-06.png

##音を鳴らすタイミング

「ブロック崩しゲームのブロックが消えるときにSEを鳴らす」ことを目的としていました。
オブジェクトに任意のスクリプトとAudioSourceコンポーネントが付与されていて、
オブジェクト削除時に自身のAudioSourceコンポーネントを再生しようとします。

[SerializeField] AudioSource _audio = null;

void DestroyObject()
{
	// 該当の音を1回だけ再生する
	_audio.PlayOneShot( _audio.clip );

	// オブジェクトを削除する
	Destroy( this.gameObject );
}

この場合、再生した直後にオブジェクト本体が消えてしまうため、SEは再生されません。

###PlayClipAtPointによる再生

PlayClipAtPointを利用すると、AudioSourceコンポーネントを動的にシーンに配置して、
なおかつSE再生が終了すると自滅してくれます。
Unityリファレンス:AudioSource.PlayClipAtPoint

[SerializeField] AudioSource _audio = null;

void DestroyObject()
{
	// // 該当の音を1回だけ再生する
	// _audio.PlayOneShot( _audio.clip );

	// SE再生専用オブジェクトが一時的に作られるので、音が鳴る
	AudioSource.PlayClipAtPoint( _audio.clip, transform.position);

	// オブジェクトを削除する
	Destroy( this.gameObject );
}

3Dゲームなら、この方法で問題ないと思います。
この方法で作成されたAudioSourceの設定がAudioSource.spatialBlend=1になっています。

前述したように、2Dゲームの場合、このパラメータは0であって欲しいのですが、
PlayClipAtPointからこの値を設定する術がありません。(2018.3.2f1利用しています)
PlayClipAtPointにて作成されたオブジェクトにアクセスして~というのもFindで重い検索をするわけにもいかず…

###別のSEオブジェクトを用意して再生した

ここまでの実装はオブジェクトAが自身がDestroyされる直前にSEを再生しようとしていました。
実装を変更して、オブジェクトB(常設)がオブジェクトAのDestroy呼び出し時に、オブジェクトBがSEを再生する形で対応しました。

これで今回のケースは解決しました。
PlayClipAtPointの2D版ないんですかね???

8
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?