質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2767閲覧

弾幕ゲーム PlayClipAtPointで再生している効果音が音割れするため、AudioMixerを利用したい

pppooo

総合スコア3

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/13 17:28

現在、Unityでシューティングゲームを作っています。
敵が弾を撃つ際、

C#

1public AudioClip shotSound; 23AudioSource.PlayClipAtPoint(shotSound, Camera.main.transform.position);

このようにして効果音を再生していたのですが、制作を進めていくうちに、敵が大量に同時に弾を発射した際に音が割れてしまう問題が発生しました。
調べると、AudioMixerというものを使うと音割れに対処できることが分かり試しました。
しかし更に調べると、PlayClipAtPointコマンドはAudioMixerに対応していないことが分かりました。
なんとかできないか調べてみると、

AudioMixerに対応したPlayClipAtPoint風スクリプト

というものを公開しているサイト様に辿り着きました。しかし、そのスクリプトの使い方が分かりません。

前提・実現したいこと

PlayClipAtPointで再生している効果音が、同時に大量に発生させた際に音割れしてしまう。
解決策になりそうな方法を見つけたが、どのようにすればこのスクリプトをPlayClipAtPointの代わりのように使えるのか分からないため、教えてほしい。

該当のソースコード

弾を撃つスクリプトの末尾に上記のスクリプトをまるまるコピー&ペーストし、

c#

1private void PlayAt3D(AudioClip audio,GameObject Model,float ClipVolume) 2{ 3// 「GameObject名 & "-Audio"」 という名前のゲームオブジェクトを作成 4GameObject Model_tmp = new GameObject(Model.name + "-Audio"); 5 6//GameObjectにAudioSourceをアタッチ 7AudioSource audio_tmp = new AudioSource(); 8audio_tmp = Model_tmp.AddComponent<AudioSource>(); 9 10//オーディオソースの設定 11audio_tmp.clip = audio; 12audio_tmp.transform.position = Model.transform.position; 13audio_tmp.spatialBlend = 1;//3D音響にするプロパティ(1だと3D、0だと2D) 14audio_tmp.loop = false;//ループオフ 15audio_tmp.volume = ClipVolume; 16audio_tmp.outputAudioMixerGroup = (指定したいオーディオミキサーのアウトプット); 17 18//再生 19audio_tmp.Play(); 20//クリップ長+0.1秒でオブジェクトを破棄 21Destroy(Model_tmp, audio.length + 0.1f);} 22}

さらに

AudioSource.PlayClipAtPoint(shotSound, Camera.main.transform.position);

の部分を

PlayAt3D();

と書き換えてみたところ、2つのエラーが発生しました。

発生している問題・エラーメッセージ

1つ目は

PlayAt3D(); 必要な仮パラメーター`audio`に対応する特定の引数が存在しません。

というエラーなのですが、いまいちどうしてやればいいのか見当がつきません。

2つ目は、

audio_tmp.outputAudioMixerGroup = (指定したいオーディオミキサーのアウトプット); 現在のコンテキストに`指定したいオーディオミキサーのアウトプット`という名前は存在しません。

というエラーです。ここがおかしいのは分かるのですが、
参考サイト様で(指定したいオーディオミキサーのアウトプット)となっているところに何を入れればいいのかまるで分かりません。
アウトプットさせたいGroupsのことかなと思い"Master"と入れるなどしてみましたが、String型はダメと言われ弾かれました。
「オーディオミキサーのアウトプット」とはどのようにして指定してやればいいものなのでしょうか?

どうか解決策をご教授お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

敵が大量に同時に弾を発射した際に音が割れてしまう問題が発生しました。
調べると、AudioMixerというものを使うと音割れに対処できることが分かり試しました。

多分 AudioMixer の Duck Volume のことを言ってるんだと思いますけど、それで解決するかどうかは疑問です。これって効果音が鳴っている間 BGM のボリュームを落とすとかそういう役割に使うので、そこらじゅうの Audio Source から同時に音が鳴った時にどうにかするという役割は持ってませんよ。どこの何を見て AudioMixer でその問題が解決できると判断しましたか?

一番簡単なやり方としては、自分で AudioManager を作り、敵が弾を発射した時はその AudioManager から PlayOneShot 関数で鳴らすことです。そうすれば、PlayOneShot が同時に呼ばれたり連続で呼ばれたりした時に現在鳴っている音をキャンセルしてもう一度音が鳴ります。Unity AudioManager でググればいろんな人がそういうものを公開しています。

PlayAt3D();
と書き換えてみたところ、2つのエラーが発生しました。

PlayAt3D 関数はパラメータを3つ受け取るように定義されているので、指定されたパラメータを渡さなければ呼べません。

「オーディオミキサーのアウトプット」とはどのようにして指定してやればいいものなのでしょうか?

AudioMixerGroup 型のオブジェクト(AudioMixer アセットの中にある)です。メンバ変数を SerializeField にして Inspector からアサインするのが簡単でしょうね。

該当のサイトは基本的に AudioMixer を現在使っている人、AudioMixer を理解している人向けに書かれているので、こういうところを見てまず AudioMixer を理解した方がよいです。そうしたら、これで現在の問題が解決するのかと疑問に感じるんじゃないかと思います。

投稿2020/07/13 17:50

編集2020/07/13 17:57
bboydaisuke

総合スコア5275

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pppooo

2020/07/14 04:04

解答ありがとうございます。 >>どこの何を見て AudioMixer でその問題が解決できると判断しましたか? http://hecres.hatenablog.com/entry/2018/03/10/181127 様の、 対象のグループにNormalizeエフェクトを追加します。 の部分です。説明が足りず申し訳ありません。それとも、これを利用しても解決するのは難しそうでしょうか? >>現在鳴っている音をキャンセルしてもう一度音が鳴ります。 とらせたい挙動と少し変わってしまう(音が割れない範囲で複数の効果音を同時に鳴らしたい)ので、できれば別の解決方法が知りたいです。 >>PlayAt3D 関数はパラメータを3つ受け取るように定義されているので、指定されたパラメータを渡さなければ呼べません。 これは本当にその通りというか、少しパニックになっていたかもしれません。すみません。 とりあえず、頂いた情報を元に、どうにかできないかもう少し模索してみます。
bboydaisuke

2020/07/14 04:09 編集

> それとも、これを利用しても解決するのは難しそうでしょうか? Normalize はいいかもしれないですね。試してみる価値は大いにあると思います。 とりあえず普通に AudioMixer アセットを作成・構成して既存の AudioSource に設定するといったことを学んでから本題に取り組むといいと思います。普通に Unity で開発・プログラミングできるなら理解することを捨てていきなり目的に取り組むのではなくしっかり理解しながらやれば1~3日くらいでできると思います。
pppooo

2020/07/14 04:15

迅速な返信ありがとうございます。 分かりました、まずAudioMixerの基本的な使い方を学ぶところから始めてみようと思います。 丁寧な解答ありがとうございました。
bboydaisuke

2020/07/14 04:16

それでも AudioManager を作るか拝借して SFXManager として使い、SFXManager にアタッチした AudioSource から PlayOneShot で爆発音を鳴らし(※)、その AudioSource から AudioMixer に接続した方がシンプルかつ簡単ではあるな、とは思いました。 (※)回答で PlayOneShot は既に鳴っている音をキャンセルすると書いたのは間違いでした。すみません。リファレンス https://docs.unity3d.com/ja/current/ScriptReference/AudioSource.PlayOneShot.html を確認したところ、PlayOneShot は音をキャンセルしません。キャンセルするのは Play() の方でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問