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

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

ただいまの
回答率

88.93%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 231

pppooo

score 3

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

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


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

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

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

前提・実現したいこと

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

該当のソースコード

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

private void PlayAt3D(AudioClip audio,GameObject Model,float ClipVolume)
{
// 「GameObject名 & "-Audio"」 という名前のゲームオブジェクトを作成
GameObject Model_tmp = new GameObject(Model.name + "-Audio");

//GameObjectにAudioSourceをアタッチ
AudioSource audio_tmp = new AudioSource();
audio_tmp = Model_tmp.AddComponent<AudioSource>();

//オーディオソースの設定
audio_tmp.clip = audio;
audio_tmp.transform.position = Model.transform.position;
audio_tmp.spatialBlend = 1;//3D音響にするプロパティ(1だと3D、0だと2D)
audio_tmp.loop = false;//ループオフ
audio_tmp.volume = ClipVolume;
audio_tmp.outputAudioMixerGroup = (指定したいオーディオミキサーのアウトプット);

//再生
audio_tmp.Play();
//クリップ長+0.1秒でオブジェクトを破棄
Destroy(Model_tmp, audio.length + 0.1f);}
}

さらに

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


の部分を

PlayAt3D();


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

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

1つ目は

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


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

2つ目は、

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


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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/14 13:04

    解答ありがとうございます。

    >>どこの何を見て AudioMixer でその問題が解決できると判断しましたか?
    http://hecres.hatenablog.com/entry/2018/03/10/181127
    様の、 対象のグループにNormalizeエフェクトを追加します。 の部分です。説明が足りず申し訳ありません。それとも、これを利用しても解決するのは難しそうでしょうか?

    >>現在鳴っている音をキャンセルしてもう一度音が鳴ります。
    とらせたい挙動と少し変わってしまう(音が割れない範囲で複数の効果音を同時に鳴らしたい)ので、できれば別の解決方法が知りたいです。

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

    これは本当にその通りというか、少しパニックになっていたかもしれません。すみません。

    とりあえず、頂いた情報を元に、どうにかできないかもう少し模索してみます。

    キャンセル

  • 2020/07/14 13:08 編集

    > それとも、これを利用しても解決するのは難しそうでしょうか?

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

    キャンセル

  • 2020/07/14 13:15

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

    キャンセル

  • 2020/07/14 13:16

    それでも AudioManager を作るか拝借して SFXManager として使い、SFXManager にアタッチした AudioSource から PlayOneShot で爆発音を鳴らし(※)、その AudioSource から AudioMixer に接続した方がシンプルかつ簡単ではあるな、とは思いました。

    (※)回答で PlayOneShot は既に鳴っている音をキャンセルすると書いたのは間違いでした。すみません。リファレンス https://docs.unity3d.com/ja/current/ScriptReference/AudioSource.PlayOneShot.html を確認したところ、PlayOneShot は音をキャンセルしません。キャンセルするのは Play() の方でした。

    キャンセル

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る