Ambient Effect Assistant - mimyquality/FukuroUdon GitHub Wiki
概要
ワールドの環境音や演出を更にいい感じにするために、AudioSource の再生位置・MeshRenderer の表示位置を可変にするギミック群です。
AudioSource や AudioReverbZone の距離減衰は通常、球状にしか設定できません。そのため、細長かったり複雑な形状をした音の発生源を表現しようとすると、大量の AudioSource を置く必要がありました。
このギミックは、距離減衰開始範囲の形状を、指定したコライダーの形に拡張できます。これにより、AudioSource の設置数を節約する事ができます。
一部の視界オーバーライド系シェーダー同士は干渉する事があるため、部分的にだけ表示したい場合があります。
このギミックで、指定した境界面やコライダーの範囲内にプレイヤーのビューポイント(メインカメラ)がある間だけメッシュオブジェクトを表示させられるため、同時に一つの視界オーバーライド系シェーダーだけを適用する、といった運用ができます。
また、プレイヤーが衝突した時に、衝突したコライダーとの接触点から音やパーティクルを出せるようにするギミックが入っています。
導入手順
使い方
距離減衰拡張ギミック
このギミックは、指定したコライダーの範囲内で、指定した 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 Tracker
の View Point Reveiver 配列に追加してください。
Flexible Spatial Audio
の Decay Sound に鳴らしたい Audio Source
をセットしてください。
ローカルプレイヤーがコライダー範囲 + Decay Sound の Max Distance + Effective Range Offset の範囲内にいる間、 Audio Source
コンポーネントが有効になります。再生管理はしませんので、 Play on Awake にチェックを入れておいてください。
[!NOTE] ローカルプレイヤーがコライダーより内側に居る間は、常にビューポイントにピッタリ重なった状態になります。Volumetric Radius を0.2~0.5くらい入れておくのを推奨します。
Innner Sound にもAudio Source
をセットしている場合は、ローカルプレイヤーがコライダーの内側にいる間、 Innner Sound が有効になり、 Decay Sound が無効になります。そのため、 Innner Sound は 2Dオーディオ設定 にしておくことを推奨します。
Area 配列には Sphere Collider
, Capsule Collider
, Box Collider
, Convex をオンにしたMesh Collider
がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。
[!NOTE] コライダーは範囲内かの計算にのみ使っているため、有効である必要はありますが衝突判定は不要です。そのため、「UI」レイヤーに設定することを推奨します。
Flexible RevetbZone
も同様に、設置したものを全て ViewPoint Tracker
の View Point Reveiver 配列に追加してください。Reverb Zone にセットした Audio Revetb Zone
が、コライダーの範囲内でローカルプレイヤーのビューポイントに追従します。
メッシュ表示切り替えギミック
空のゲームオブジェクトに 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+側が内側となります。
このギミックは ViewPoint Tracker
と連携して使用する前提です。設置した Area Culling
や Boundary Culling
は全て ViewPoint Tracker
の View Point Reveiver 配列に追加してください。(上記の距離減衰ギミックと併用する場合、同じ一つの ViewPoint Tracker
を共用できます。)
UI の距離フェードギミック
Unity には Canvas Group というコンポーネントがあり、このコンポーネントを付けた UI の Alpha値(透明度)などを子孫オブジェクトまで一括で操作することができます。
Canvas Distance Fade
は、このコンポーネントの Alpha と Interactable を操作して、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 Start ~ Fade End 間にいる間はその位置に応じて Aplha値が線形比例します。
なお、Fade Start > Fade End に値を設定すると、Fade Start より遠いと Aplha = 1、Fade End より近いと Aplha = 0 に反転します。
また、Alpha値が 0 になっている間は Interactable も無効になります。
このギミックは ViewPoint Tracker
と連携して使用する前提です。設置した Canvas Distance Fade
は全て ViewPoint Tracker
の View Point Reveiver 配列に追加してください。(他のギミックと同じく、一つの ViewPoint Tracker
を共用できます。)
プレイヤー衝突エフェクト発生ギミック
Is Trigger を有効にしたコライダーに Impact Effect by Player
コンポーネントを付ける事で、コライダーにプレイヤーが衝突する度に、セットしたプレハブの複製を1つ、衝突地点でアクティブにします。アクティブになったオブジェクトは Effect Time で指定した秒数後に非アクティブになり、次の衝突に再利用されます。
プレハブの中に Play on Awake を有効にした Audio Source
や Particle 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 : アクティブになったプレハブは、この時間が経過後に非アクティブに戻ります。単位:秒