Skip to content

Ambient Effect Assistant

Mimy Quality edited this page May 18, 2024 · 2 revisions

概要

ワールドの環境音や演出を更にいい感じにするために、AudioSourceの再生位置・MeshRendererの表示位置を可変にするギミック群です。

AudioSourceやAudioReverbZoneの距離減衰は通常、球状にしか設定できません。そのため、細長かったり複雑な形状をした音の発生源を表現しようとすると、大量のAudioSourceを置く必要がありました。
このギミックは、距離減衰開始範囲の形状を、指定したコライダーの形に拡張できます。これにより、AudioSourceの設置数を節約する事ができます。

一部の視界オーバーライド系シェーダー同士は干渉する事があるため、部分的にだけ表示したい場合があります。
このギミックで、指定した境界面やコライダーの範囲内にプレイヤーのビューポイント(メインカメラ)がある間だけメッシュオブジェクトを表示させられるため、同時に一つの視界オーバーライド系シェーダーだけを適用する、といった運用ができます。

また、プレイヤーが衝突した時に、衝突したコライダーとの接触点から音やパーティクルを出せるようにするギミックが入っています。

image

導入手順

Installation

使い方

距離減衰拡張ギミック

このギミックは、指定したコライダーの範囲内で、指定した Audio Source コンポーネントのオブジェクトを受け取った座標に動かす Flexible Spatial Audio コンポーネントと、 Flexible Spatial Audio にローカルプレイヤーのビューポイント座標を渡す View Point Tracker コンポーネントで構成されています。
View Point Tracker は複数設置しても動きますが、基本的にシーン中に1個だけ置いて使い回してください。
Flexible Spatial Audio は音を設置したいエリアの数だけシーンに追加してください。
リバーブ効果エリアを設置したい場合は、同様に Flexible Revetb Zone を設置したいエリアの数だけシーンに追加してください。

Note

Packages > Fukuro Udon > Samples > AmbientSoundAssistant にサンプルプレハブが入っています。構成の参考にしてください。
Flexible Spatial Audio, Flexible ReverbZone を追加したい時は、 Packages > Fukuro Udon > Runtime > AmbientSoundAssistant > Prefabs に入っています。

設置した Flexible Spatial Audio は全て View Point TrackerView Point Reveiver 配列に追加してください。
Flexible Spatial AudioDecay Sound に鳴らしたい Audio Source をセットしてください。 ローカルプレイヤーがコライダー範囲 + Decay SoundMax DistanceEffective Range Offset の範囲内にいる間、 Audio Source コンポーネントが有効になります。再生管理はしませんので、 Play on Awake にチェックを入れておいてください。

Note

ローカルプレイヤーがコライダーより内側に居る間は、常にビューポイントにピッタリ重なった状態になります。Volumetric Radiusを0.2~0.5くらい入れておくのを推奨します。
Innner Sound にも Audio Source をセットしている場合は、ローカルプレイヤーがコライダーの内側にいる間、 Innner Sound が有効になり、 Decay Sound が無効になります。そのため、 Innner Sound2Dオーディオ設定 にしておくことを推奨します。

Area 配列には Sphere Collider, Capsule Collider, Box Collider, ConvexをオンにしたMesh Collider がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。

Note

コライダーは範囲内かの計算にのみ使っているため、有効である必要はありますが衝突判定は不要です。そのため、「UI」レイヤーに設定することを推奨します。

image

Flexible RevetbZone も同様に、設置したものを全て View Point TrackerView Point Reveiver 配列に追加してください。Reverb Zone にセットした Audio Revetb Zone が、コライダーの範囲内でローカルプレイヤーのビューポイントに追従します。

メッシュ表示切り替えギミック

空のゲームオブジェクトに Area Culling コンポーネントをAdd Componentして、表示切り替えをしたいメッシュをセットしてください。
Area 配列には Sphere Collider, Capsule Collider, Box Collider, ConvexをオンにしたMesh Collider がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。
ローカルプレイヤーのビューポイントがこのコライダーの範囲内にある間、セットされたメッシュが有効になります。逆に範囲外にある間は無効になります。

囲う必要がなく特定の境界面の片側全てでのみ有効になれば良いメッシュに対しては、 Boundary Culling が使えます。
境界面は、Pointにセットしたオブジェクトの座標を基点として、NormalでPointオブジェクト基準の法面を決める形で指定します。例えば(X 0, Y 1, Z 0)では、Y軸が垂線となる平面を境界面として、Y+側が内側となります。

image

このギミックは View Point Tracker と連携して使用する前提です。設置した Area CullingBoundary Culling は全て View Point TrackerView Point Reveiver 配列に追加してください。(上記の距離減衰ギミックと併用する場合、同じ一つの View Point Tracker を共用できます。)

プレイヤー衝突エフェクト発生ギミック

Is Trigger を有効にしたコライダーに Impact Effect by Player コンポーネントを付ける事で、コライダーにプレイヤーが衝突する度に、セットしたプレハブの複製を1つ、衝突地点でアクティブにします。アクティブになったオブジェクトは Effect Time で指定した秒数後に非アクティブになり、次の衝突に再利用されます。
プレハブの中に Play on Awake を有効にした Audio SourceParticle System コンポーネントを含めておくことで、プレイヤーがコライダーに衝突する度に効果音・エフェクトを衝突地点に発生させることができる寸法です。

追加設定として2つ目のプレハブを設定でき、衝突時のプレイヤーの速度に応じて切り替わるようにできます。
同時にアクティブにできる個数を Pool Size で指定する事ができます。
Normal を(0, 0, 0)以外の値にすることで、この"法面"側から衝突した時のみギミックが発生するようにできます。これは例えば、このギミックを二つ置いて、コライダーの"表面"と"裏面"のどちらから侵入したかで効果音を変えたい、といった時に便利です。

Note

仕様上、このコンポーネントにセットしたPrefabは大量にInstantiate(複製)されます。VRC Spatial Audio Sourceが過剰に多いと不具合があるようなので、Audio SourceにはVRC Spatial Audio Sourceを付けずに、Audio Sourceのパラメーターのみで調整する事をオススメします。

高度な使い方

View Point Tracker

PostLateUpdate()を分散したくなかった副産物として用意した、ローカルプレイヤーのビューポイントが更新される度にその座標を渡してくれる一元管理ギミックです。
View Point Receiver 配列には IViewPointReceiver を継承したU#コンポーネントをセットすることができ、下記メソッドに、ローカルプレイヤーのビューポイント座標を毎フレーム送信します。

public override void ReceiveViewPoint(Vector3 position, Quaternion rotation) { }

publicな viewPointPosition 変数(Vector3型)を持つ UdonBehaviour コンポーネントを Position Receiver 配列にセットすると、ビューポイント座標に変化があったフレーム毎に、その変数にビューポイント座標を書き込みます。
同様に、publicな viewPointRotation 変数(Quaternion)を持つ UdonBehaviour コンポーネントを Rotation Receiver 配列にセットすると、ビューポイントの向きに変化があったフレーム毎に、その変数にビューポイント回転を書き込みます。

Flexible Spatial Audio

以下のパラメーターがあります。

  • Decay Sound : ここにセットした Audio Source がAreaにセットしたコライダーの範囲で、ローカルプレイヤーのビューポイントに最接近します。
  • Inner Sound : (オプション)Areaにセットしたコライダーの範囲にローカルプレイヤーのビューポイントがある間、ここにセットした Audio Source が有効になり、Decay Soundの Audio Source が無効になります。また、Innner Soundもローカルプレイヤーのビューポイントに最接近します。
  • Effective Range Offset : 負荷対策のため、ローカルプレイヤーのビューポイントが最寄りAreaコライダー接面から「Decay Sound の Max Distance + Effective Range Offset」距離以上離れている間、Decay Soundの Audio Source を無効にします。
  • Area : Sphere Collider, Capsule Collider, Box Collider, ConvexをオンにしたMesh Collider がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。

Flexible Reverb Zone

以下のパラメーターがあります。

  • Reverb Zone : ここにセットした Audio Reverb Zone がAreaにセットしたコライダーの範囲で、ローカルプレイヤーのビューポイントに最接近します。
  • Area : Sphere Collider, Capsule Collider, Box Collider, ConvexをオンにしたMesh Collider がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。

Flexible Transform

おまけで、汎用的に使えるバージョンを用意しました。
以下のパラメーターがあります。

  • Target : ここにセットしたオブジェクトがAreaにセットしたコライダーの範囲で、ローカルプレイヤーのビューポイントに最接近します。また、ビューポイントと回転方向が一致します。
  • Position Only : チェックすると、Transformの位置(Position)のみを制御し、回転方向(Rotation)は動かしません。
  • Inactive Out Of Range : チェックすると、ローカルプレイヤーのビューポイントがActive Rangeで指定した距離以上Targetから離れた時、Targetオブジェクトを非アクティブにします。最接近するとアクティブになります。
  • Area : Sphere Collider, Capsule Collider, Box Collider, ConvexをオンにしたMesh Collider がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。

Area Culling

以下のパラメーターがあります。

  • Mesh Renderer : ローカルプレイヤーのビューポイントがAreaにセットしたコライダーの範囲内にある間、ここにセットした Mesh Renderer が有効になります。逆にコライダーの範囲外にある間は無効になります。
  • Skinned Mesh Renderer : ローカルプレイヤーのビューポイントがAreaにセットしたコライダーの範囲内にある間、ここにセットした Skinned Mesh Renderer が有効になります。逆にコライダーの範囲外にある間は無効になります。
  • Invert : 上記の有効・無効を反転します。つまり、ローカルプレイヤーのビューポイントがAreaにセットしたコライダーの範囲内だとメッシュが無効に、範囲外だと有効になります。
  • Area : Sphere Collider, Capsule Collider, Box Collider, ConvexをオンにしたMesh Collider がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。

Boundary Culling

以下のパラメーターがあります。

  • Mesh Renderer : ローカルプレイヤーのビューポイントが指定した境界面内にある間、ここにセットした Mesh Renderer が有効になります。逆に境界面外にある間は無効になります。
  • Skinned Mesh Renderer : ローカルプレイヤーのビューポイントが指定した境界面内にある間、ここにセットした Skinned Mesh Renderer が有効になります。逆に境界面外にある間は無効になります。
  • Point : 境界面の基準点となるオブジェクト。(ワールド空間)
  • Normal : Pointオブジェクトのどの法面を境界面とするか指定します。例えば(X 0, Y 1, Z 0)では、Y軸が垂線となる平面を境界面として、Y+側が内側となります。

Impact Effect by Player

以下のパラメーターがあります。

  • Effect Prefab : ここにセットしたプレハブが複製、プールされ、必要に応じてアクティブになります。セットするプレハブはHierarchy上に無くてもOKです。
  • Impact Speed : プレイヤーがこの速度以上で接触した時にEffect Prefabをアクティブにします。
  • High Effect Prefab : ここにセットしたプレハブが複製、プールされ、必要に応じてアクティブになります。セットするプレハブはHierarchy上に無くてもOKです。
  • High Splash Speed : プレイヤーがこの速度以上で接触した時に、Effect Prefabの代わりにHigh Effect Prefabをアクティブにします。
  • Pool Size : プレハブをInstantiate(複製)する個数。この数まで同時にアクティブ化可能になります。ワールド読み込みの負荷が高い場合は値を下げてください。最大32。
  • Normal : 衝突を受け付ける”法面”を規定します。(0, 0, 0)以外に設定すると、反対方向からの衝突を無視するようになります。ローカル座標系です。デフォルトは(0, 1, 0)、つまりこのコライダーに上から衝突した時だけ反応します。
  • Effect Time : アクティブになったプレハブは、この時間が経過後に非アクティブに戻ります。単位:秒