-
Notifications
You must be signed in to change notification settings - Fork 4
Ambient Effect Assistant
ワールドの環境音や演出を更にいい感じにするために、AudioSourceの再生位置・MeshRendererの表示位置を可変にするギミック群です。
AudioSourceやAudioReverbZoneの距離減衰は通常、球状にしか設定できません。そのため、細長かったり複雑な形状をした音の発生源を表現しようとすると、大量のAudioSourceを置く必要がありました。
このギミックは、距離減衰開始範囲の形状を、指定したコライダーの形に拡張できます。これにより、AudioSourceの設置数を節約する事ができます。
一部の視界オーバーライド系シェーダー同士は干渉する事があるため、部分的にだけ表示したい場合があります。
このギミックで、指定した境界面やコライダーの範囲内にプレイヤーのビューポイント(メインカメラ)がある間だけメッシュオブジェクトを表示させられるため、同時に一つの視界オーバーライド系シェーダーだけを適用する、といった運用ができます。
また、プレイヤーが衝突した時に、衝突したコライダーとの接触点から音やパーティクルを出せるようにするギミックが入っています。
このギミックは、指定したコライダーの範囲内で、指定した 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 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
も同様に、設置したものを全て View Point Tracker
の View 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+側が内側となります。
このギミックは View Point Tracker
と連携して使用する前提です。設置した Area Culling
や Boundary Culling
は全て View Point Tracker
の View Point Reveiver 配列に追加してください。(上記の距離減衰ギミックと併用する場合、同じ一つの View Point 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
仕様上、このコンポーネントにセットしたPrefabは大量にInstantiate(複製)されます。VRC Spatial Audio Sourceが過剰に多いと不具合があるようなので、Audio SourceにはVRC Spatial Audio Sourceを付けずに、Audio Sourceのパラメーターのみで調整する事をオススメします。
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 配列にセットすると、ビューポイントの向きに変化があったフレーム毎に、その変数にビューポイント回転を書き込みます。
以下のパラメーターがあります。
- 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
がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。
以下のパラメーターがあります。
- Reverb Zone : ここにセットした
Audio Reverb Zone
がAreaにセットしたコライダーの範囲で、ローカルプレイヤーのビューポイントに最接近します。 - Area :
Sphere Collider
,Capsule Collider
,Box Collider
, ConvexをオンにしたMesh Collider
がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。
おまけで、汎用的に使えるバージョンを用意しました。
以下のパラメーターがあります。
- 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
がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。
以下のパラメーターがあります。
- Mesh Renderer : ローカルプレイヤーのビューポイントがAreaにセットしたコライダーの範囲内にある間、ここにセットした
Mesh Renderer
が有効になります。逆にコライダーの範囲外にある間は無効になります。 - Skinned Mesh Renderer : ローカルプレイヤーのビューポイントがAreaにセットしたコライダーの範囲内にある間、ここにセットした
Skinned Mesh Renderer
が有効になります。逆にコライダーの範囲外にある間は無効になります。 - Invert : 上記の有効・無効を反転します。つまり、ローカルプレイヤーのビューポイントがAreaにセットしたコライダーの範囲内だとメッシュが無効に、範囲外だと有効になります。
- Area :
Sphere Collider
,Capsule Collider
,Box Collider
, ConvexをオンにしたMesh Collider
がセット可能です。一つ以上セットしてください。複数セットすると一つの複合コライダーとして計算します。
以下のパラメーターがあります。
- Mesh Renderer : ローカルプレイヤーのビューポイントが指定した境界面内にある間、ここにセットした
Mesh Renderer
が有効になります。逆に境界面外にある間は無効になります。 - Skinned Mesh Renderer : ローカルプレイヤーのビューポイントが指定した境界面内にある間、ここにセットした
Skinned Mesh Renderer
が有効になります。逆に境界面外にある間は無効になります。 - Point : 境界面の基準点となるオブジェクト。(ワールド空間)
- Normal : Pointオブジェクトのどの法面を境界面とするか指定します。例えば(X 0, Y 1, Z 0)では、Y軸が垂線となる平面を境界面として、Y+側が内側となります。
以下のパラメーターがあります。
- 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 : アクティブになったプレハブは、この時間が経過後に非アクティブに戻ります。単位:秒