Ambient Effect Assistant - mimyquality/FukuroUdon GitHub Wiki

概要

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

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

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

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

image

導入手順

Installation

使い方

距離減衰拡張ギミック

image

このギミックは、指定したコライダーの範囲内で、指定した Audio Source コンポーネントのオブジェクトを受け取った座標に動かす Flexible Spatial Audio コンポーネントと、 Flexible Spatial Audio にローカルプレイヤーのビューポイント座標を渡す ViewPoint Tracker コンポーネントで構成されています。
ViewPoint 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 は全て ViewPoint 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」レイヤーに設定することを推奨します。

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

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

image

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

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

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

image

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

UI の距離フェードギミック

image

Unity には Canvas Group というコンポーネントがあり、このコンポーネントを付けた UI の Alpha値(透明度)などを子孫オブジェクトまで一括で操作することができます。
Canvas Distance Fade は、このコンポーネントの AlphaInteractable を操作して、UI に対して距離フェードを実現するギミックです。
空のゲームオブジェクトに Canvas Distance Fade を追加して、任意の UI ( Canvas オブジェクト)に Canvas Group を追加してから、その Canvas Groups 配列に Canvas Group をセットしていってください。複数の Canvas Group をまとめて設定できるため、 Canvas Distance Fade を複数設置したり、Canvas Group と同じオブジェクトに直接付ける必要はありません。

距離は Canvas Group コンポーネントごとに評価され、Canvas Group コンポーネントが付いているオブジェクトの座標からプレイヤーの視点までの距離で判断します。
Fade Start より近いと Aplha = 1、Fade End より遠いと Aplha = 0、Fade StartFade End 間にいる間はその位置に応じて Aplha値が線形比例します。
なお、Fade Start > Fade End に値を設定すると、Fade Start より遠いと Aplha = 1、Fade End より近いと Aplha = 0 に反転します。
また、Alpha値が 0 になっている間は Interactable も無効になります。

このギミックは ViewPoint Tracker と連携して使用する前提です。設置した Canvas Distance Fade は全て ViewPoint TrackerView Point Reveiver 配列に追加してください。(他のギミックと同じく、一つの ViewPoint Tracker を共用できます。)

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

image

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

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

[!NOTE] セットするプレハブは必ずしもシーンに置いてある必要はありません。Project タブの Prefab ファイルを直接コンポーネントにセットして使う事ができます。

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

高度な使い方

ViewPoint 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

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

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

Boundary Culling

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

  • Renderers : ローカルプレイヤーのビューポイントが指定した境界面内にある間、ここにセットした Renderer 系コンポーネントが有効になります。逆に境界面外にある間は無効になります。
  • Game Objects : ローカルプレイヤーのビューポイントが Area にセットしたコライダーの範囲内にある間、ここにセットしたゲームオブジェクトがアクティブになります。逆にコライダーの範囲外にある間は非アクティブになります。
  • Point : 境界面の基準点となるオブジェクト。(ワールド空間)
  • Normal : Point オブジェクトのどの法面を境界面とするか指定します。例えば(0, 1, 0)では、Y軸が垂線となる平面を境界面として、Y+側が内側となります。

Canvas Distance Fade

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

  • Canvas Groups : ここにセットした Canvas Group の Aplha値と Interactable が操作されます。
  • Fade Start : この距離よりプレイヤーのビューポイントが近い時 Aplha = 1 になります。
  • Fade End : この距離よりプレイヤーのビューポイントが遠い時 Aplha = 0 になり、Interactable が無効になります。
    • Fade Start ~ Fade End 間にプレイヤーのビューポイントがある間は、距離の割合に応じて Aplha 値が線形比例します。
    • 値が Fade Start > Fade End で設定されていると遠近の処理が反転します。

Impact Effect by Player

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

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