前提・実現したいこと
AudioSourceを使用すると音声にノイズが走る
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class BGM : MonoBehaviour 6{ 7 private new AudioSource audio; 8 public AudioClip[] audioClips; 9 void Start() 10 { 11 audio = GetComponent<AudioSource>(); 12 } 13 14 private IEnumerator Checking() 15 { 16 yield return new WaitForFixedUpdate(); 17 if (!audio.isPlaying) 18 { 19 int random = Random.Range(0, audioClips.Length); 20 audio.clip = audioClips[random]; 21 audio.Play(); 22 StartCoroutine(Checking()); 23 } 24 } 25 private void Update() 26 { 27 if (!audio.isPlaying) 28 { 29 StartCoroutine(Checking()); 30 } 31 } 32} 33
試したこと
エディタ上やビルドしたゲームを再生すると、プツッやザッといった聞くに堪えないノイズが音声に走ります。このスクリプトとAudioSourceを使用しているのみで、他のスクリプトは使っていません。
なにが原因なのでしょうか?調べても分からなかったため、質問しました。本当に原因が分かりません。
追記)特に音が高い場合やオクターブが高い場合に、ノイズが発生しやすいような気がします。
・音声の頭に空白時間を入れるとどうなるか試してみてください。(ロードに時間がかかり、音の途中から再生されている形になっているかもしれない)
・Unityのバグかもしれません。違うバージョンで試してみてください。
音の途中から再生されているわけではないようです。
AudioClipの設定などをいじっても、どうやってもパチパチ音が鳴ります。もうAudioSourceを使うのをやめるくらいしか方法がないようです。
こちらの環境では普通に再生されます(2019.3.6f1)。
あと、気になる点がいくつかあります。
- WaitForFixedUpdate()を使っている理由は何なのでしょうか?
FixedUpdateは物理演算関係のものであり、そうではないものに対して使うのは不適切だと思います。
単に待機させたいのであれば、yield return null;で十分です。
- コルーチン内のStartCoroutine(Checking());は不要だと思います。
Update()内でも呼ばれているためです。
むしろ、コルーチン内とUpdate()内で同時に呼ばれて、処理が2回実行されてしまう、というバグが出てきそうな気がします。
- そもそも、コルーチンを使う理由がよく分かりません。
Update()だけで完結するような内容だと私は思います。
Youtubeの動画を再生しているときも、パソコンにかかっている負荷が大きいときにパチパチ音が鳴ったため、FPSの低下や低スペックパソコンを使っていることが最大の原因かもしれません
負荷が最小になるようにオーディオ設定を変更しても、パチパチ音は酷くなるばかりです。マシンの問題なのでしょうか? ですが、普段プレイしているUnity製のゲームではこのような症状になったことはありません。