VRC_SpatialAudioSourceのクリックノイズ問題
今回もVRChatでの立体音響等について.次のツイートのように,VRC_SpatialAudioSourceの"Spatialization"を有効にしたときにだけ音の鳴り始めでプツっとなる問題を検証.
VRC_SpatialAudioSourceのSpatializationを有効にすると音の発音部分がプツっとなる現象の例...(発生条件未特定) pic.twitter.com/vtnlUjsEeS
— らくとあいす (@rakuraku_vtube) 2021年6月30日
結論
親オブジェクトにRigidbodyコンポーネントが付いている時に、その子オブジェクトとして配置されたVRC_SpatialAudioSource付きのAudioSourceをUdon経由で鳴らすと、音の鳴り始めにクリックノイズがのる。
検証
Time.deltaTimeで時間を測って、AudioSourceを1秒毎に鳴らすU#ScriptでAudioSourceを鳴らす。 片方 (左側) は直置きのAudioSource、もう片方 (右側) は親オブジェクトにIs Kinematicのrigid bodyを付けた。 結果は動画のように、rigid bodyを付けた方だけ2回に1回程度の頻度でクリックノイズが乗った。
やっぱり... pic.twitter.com/ASv9U80cIY
— らくとあいす (@rakuraku_vtube) 2021年7月10日
using UdonSharp; using UnityEngine; using VRC.SDKBase; using VRC.Udon; public class Test_spatialaudio : UdonSharpBehaviour { public AudioClip clip; public AudioSource source; private float t; private void Update() { if (t > 1.0f) { source.PlayOneShot(clip); t = 0.0f; } t += Time.deltaTime; } }
解決策
AudioSourceの親オブジェクトにRigidbodyを付けるのは、Pickupオブジェクトから音を鳴らすなど、音をあるオブジェクトの動きに追従させたい時。 なので、追従を親子関係ではなく、Script経由で行えば、親オブジェクトにRigidbodyを置くことを回避し、クリックノイズを避けることが出来る。
さいごに
VRC_SpatialAudioSource、ひとまず目に見えた問題は回避されましたが他にもどこに地雷が潜んでいるのかわからないのでちょっともう触りたくないですね...。
一応検証に使ったワールドを置いておきます。