CrZ_ProximityActivator
CrZ_ProximityActivator は、アセットに依存しないドロップイン式の 近接スイッチ です。トリガーコライダーを持つ GameObject に取り付けると、ローカルプレイヤーがそのコライダーの内側にいる間は対象をオンにし、外へ出るとオフにします。何をトグルしているかをこのスクリプト自身は知らないため、同じスクリプトを変更なしで複数のアセットに使い回せます。
よくある用途はパフォーマンス対策です。アセットのスクロール UI(や Update() ループ、AudioSource、ParticleSystem、Renderer など)を、プレイヤーが気づける距離にいる間だけ有効なままにしておく、といった使い方です。
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class CrZ_ProximityActivator : UdonSharpBehaviour
セットアップ
- 「Is Trigger」を有効にした Collider を持つ GameObject に、このスクリプトを取り付けます。対象を有効化したい地点より少し外側までコライダーを広げ、さらに 床まで届く ようにしてください(位置チェックはプレイヤーの足元を使います)。位置ポーリングが機能するよう、凸型のコライダー(Box / Sphere / Capsule)を使用します。
- トグルしたいものを Behaviours To Toggle にドラッグします。UdonSharp スクリプト(その
Update()/ スクロールなどが停止します)、Canvas、AudioSource、Renderer、ParticleSystemなど、Behaviourから派生した任意のコンポーネントが対象です。その.enabledが切り替えられます。 - (任意)
.enabledの切り替えではなく、より強力なSetActive()を使いたい場合は、GameObject 全体を Game Objects To Toggle にドラッグします。 - (任意) 対象スクリプトが
.enabledだけでなくカスタムイベントのフック(例: スクロール位置のリセット)を必要とする場合は、Notify On Enter / Exit を設定します。
状態の同期のしくみ
スイッチは、次の 2 つのしくみが連携して正しい状態に保たれます。
- トリガーコールバック(
OnPlayerTriggerEnter/OnPlayerTriggerExit)は、プレイヤーがコライダーへ実際に 歩いて出入りする ケースを処理し、即座に反応します。 - ポーリングループ(
Poll)は、pollInterval秒ごとにローカルプレイヤーの位置を再チェックし、これが正となる基準です。トリガーコールバックが取りこぼすケース(コライダーの内側にスポーンした、リスポーンした、テレポートさせられた、コンポーネントが無効化されてから再度有効化された)でも正しく保たれます。
ポーリングは遅延イベントキューを通じて自分自身を再スケジュールするため、フレームごとの Update() コストはありません。
Inspector のフィールド
What to toggle
| フィールド | 型 | 説明 |
|---|---|---|
behavioursToToggle | UdonBehaviour[] | プレイヤーが範囲に出入りしたときに .enabled を切り替える、Behaviour 派生のコンポーネント。 |
gameObjectsToToggle | GameObject[] | SetActive() で切り替える GameObject 全体。.enabled の切り替えより重くなります。 |
Optional custom event hooks
| フィールド | 型 | 説明 |
|---|---|---|
notifyOnEnter | UdonSharpBehaviour[] | ローカルプレイヤーが範囲に入ったときにカスタムイベントを受け取るスクリプト。 |
enterEventName | string | notifyOnEnter のスクリプトへ送るカスタムイベント名。既定値: OnProximityEnter。 |
notifyOnExit | UdonSharpBehaviour[] | ローカルプレイヤーが範囲から出たときにカスタムイベントを受け取るスクリプト。 |
exitEventName | string | notifyOnExit のスクリプトへ送るカスタムイベント名。既定値: OnProximityExit。 |
Behaviour
| フィールド | 型 | 説明 |
|---|---|---|
invert | bool | ロジックを反転します。対象は有効な状態で開始し、範囲に入ると 無効化 され、出ると再度有効化されます。既定値: false。 |
pollInterval | float | ローカルプレイヤーの位置チェックの間隔(秒)。歩いての出入りはトリガーコールバックが即座に処理するため、このポーリングはスポーン時の内側判定 / リスポーン / テレポートを補完するだけです。0.25〜0.5 で十分です。既定値: 0.25。 |
メソッド
OnPlayerTriggerEnter
VRChat のコールバック。ローカル プレイヤーがトリガーに歩いて入ったときの即時の有効化です。設定された対象を有効化し(invert が true の場合は無効化し)、notifyOnEnter のイベントを発火します。リモートプレイヤーの場合は無視されます。
public override void OnPlayerTriggerEnter(VRCPlayerApi player)
パラメータ:
| パラメータ | 型 | 説明 |
|---|---|---|
player | VRCPlayerApi | トリガーに入ったプレイヤー。player.isLocal でない限り無視されます。 |
OnPlayerTriggerExit
VRChat のコールバック。ローカル プレイヤーがトリガーから歩いて出たときの即時の無効化です。設定された対象を無効化し(invert が true の場合は有効化し)、notifyOnExit のイベントを発火します。リモートプレイヤーの場合は無視されます。
public override void OnPlayerTriggerExit(VRCPlayerApi player)
パラメータ:
| パラメータ | 型 | 説明 |
|---|---|---|
player | VRCPlayerApi | トリガーから出たプレイヤー。player.isLocal でない限り無視されます。 |
Poll
Start から開始される、自分自身を再スケジュールする位置チェックです。ローカルプレイヤーの位置を読み取り、Collider.ClosestPoint でコライダーと照合し、その結果の内/外の状態を適用したうえで、SendCustomEventDelayedSeconds により pollInterval 秒後に自分自身を再スケジュールします。これが、スポーン時の内側判定・リスポーン・テレポート・再有効化をまたいでスイッチを正しく保つ基準です。重複したり積み重なったりしたループは自動的に解消されるため、ループを起動するために直接呼び出しても安全です。
public void Poll()
RecheckNow
テレポーターやステーションのスクリプト向けの任意のフックです。pollInterval 秒待つのではなく、内/外の再チェックを即座に強制します。プレイヤーを移動させた直後に SendCustomEvent("RecheckNow") で呼び出してください。
public void RecheckNow()
Start
トリガーコライダーをキャッシュし、初期状態として「範囲外」を適用し、Poll ループを開始します。フレームごとの Update はありません。
public void Start()
OnEnable
Start の実行後にコンポーネントが無効化されてから再度有効化された場合に、Poll ループを再開します。
public void OnEnable()