Mashiro Auto Door
プレイヤーの入室で開き、エリア内が無人になると閉じる自動ドア。1 本の Timeline の前半を開きアニメ、後半を閉じアニメとして再生位置を制御し、開閉途中での反転に対応する。
構成
| ファイル | 役割 |
|---|---|
MashiroAutoDoor.cs |
ドア制御本体(Timeline の再生制御・在室チェック) |
MashiroAutoDoor.asset |
MashiroAutoDoor の UdonSharp ProgramAsset |
AutoDoorTrigger.cs |
トリガーコライダーの入退室イベントを MashiroAutoDoor へ中継する |
AutoDoorTrigger.asset |
AutoDoorTrigger の UdonSharp ProgramAsset |
自動ドア.prefab |
MashiroAutoDoor・AutoDoorTrigger・PlayableDirector を設定済みのドア一式 |
AutoDoor.playable |
開閉アニメーションの TimelineAsset(全長 6 秒) |
AutoDoorSample.playable |
開閉アニメーションの TimelineAsset(全長 4 秒) |
依存
- パッケージ:
MashiroTheater-Utils(VPMcom.mashirotheater.utils) MashiroAutoDoor.timelineにPlayableDirector(開閉アニメの TimelineAsset を割り当てたもの)が必要。AutoDoorTriggerと同じ GameObject に、Is Trigger の Collider が必要(OnPlayerTriggerEnter/OnPlayerTriggerExitを受けるため)。
仕様
Timeline の区間
0〜duration / 2を開きアニメ、duration / 2〜durationを閉じアニメとして扱う。durationはStart時点のPlayableDirector.durationを使う。Startで再生位置をdurationに設定してEvaluate→Pauseし、全閉状態で開始する。- 開き再生中に再生位置が
duration / 2以上になると、duration / 2に固定してPauseする(全開)。 - 閉じ再生中に再生位置が
duration以上になると、durationに固定してPauseする(全閉)。
開く条件
AutoDoorTriggerのOnPlayerTriggerEnterが発火するとMashiroAutoDoor.OnPlayerEnteredが呼ばれる。対象はローカル・リモートを問わず全プレイヤー。- 入室のたびに最終入室時刻(
Time.time)を更新する。 - ドアが全閉または閉じ途中のときのみ開き始める。
- 全閉から: 再生位置
0から再生する。 - 閉じ途中から: 閉じ区間の進捗
pを求め、再生位置(duration / 2) × (1 − p)から開き再生する。
- 全閉から: 再生位置
- 退室(
OnPlayerTriggerExit→OnPlayerExited)では何もしない。
閉じる条件
- ドアが全開または開き途中の間、
Updateで最終入室時刻からの経過時間を確認する。 - 経過時間が
closeDelay秒以上になった時点で在室チェックを行う。- 在室者がいる: 最終入室時刻を現在時刻にリセットする(
closeDelay秒後に再チェック)。 - 在室者がいない: 閉じ始める。
- 在室者がいる: 最終入室時刻を現在時刻にリセットする(
- 閉じ始めの再生位置:
- 全開から:
duration / 2から再生する。 - 開き途中から: 開き区間の進捗
pを求め、再生位置duration / 2 + (duration / 2) × (1 − p)から閉じ再生する。
- 全開から:
在室チェック
triggerZone.bounds(ワールド座標の AABB)に、各プレイヤーのVRCPlayerApi.GetPosition()(足元位置)が含まれるかで判定する。triggerZoneを回転させても、判定は回転後のコライダーを包むワールド軸平行の箱で行われる。triggerZoneが未設定のときは常に「在室者なし」と判定する。- 入室の検出(
AutoDoorTriggerのコライダー)と在室チェック(triggerZone)は別々のコライダーを参照する。
同期
- 両コンポーネントとも
[UdonSynced]フィールドを持たず、[UdonBehaviourSyncMode]も指定していない。 - 開閉判定・Timeline 制御は各クライアントでローカルに実行する。
エラー時の挙動
| 条件 | 挙動 |
|---|---|
timeline 未設定 |
Start で Warning [MashiroAutoDoor] Timeline is not assigned. を出し、コンポーネントを無効化する |
triggerZone 未設定 |
Start で Warning [MashiroAutoDoor] BoxCollider is not assigned. を出す。動作は継続する |
autoDoor 未設定(AutoDoorTrigger) |
入退室イベントを中継しない |
Inspector
MashiroAutoDoor
| フィールド | 型 | 既定値 | 必須 | 内容 |
|---|---|---|---|---|
timeline |
PlayableDirector |
なし | ○ | 開閉アニメの TimelineAsset を再生する PlayableDirector |
triggerZone |
BoxCollider |
なし | — | 在室チェックに使うコライダー |
closeDelay |
float |
3 |
— | 最終入室から在室チェックを行うまでの秒数 |
AutoDoorTrigger
| フィールド | 型 | 既定値 | 必須 | 内容 |
|---|---|---|---|---|
autoDoor |
MashiroAutoDoor |
なし | ○ | 入退室イベントの中継先 |
API リファレンス
MashiroAutoDoor
UI へ手配線するもの
なし。
内部連携用(配線不要)
| シグネチャ | 用途 | 呼び出し種別 |
|---|---|---|
void OnPlayerEntered(VRCPlayerApi player) |
最終入室時刻を更新し、閉状態・閉じ途中なら開き始める | AutoDoorTrigger が呼ぶ |
void OnPlayerExited(VRCPlayerApi player) |
処理なし | AutoDoorTrigger が呼ぶ |
AutoDoorTrigger
UI へ手配線するもの
なし。
内部連携用(配線不要)
| シグネチャ | 用途 | 呼び出し種別 |
|---|---|---|
void OnPlayerTriggerEnter(VRCPlayerApi player) |
autoDoor.OnPlayerEntered を呼ぶ |
VRChat コールバック(内部専用) |
void OnPlayerTriggerExit(VRCPlayerApi player) |
autoDoor.OnPlayerExited を呼ぶ |
VRChat コールバック(内部専用) |
ライセンス
MIT License(MashiroTheater-Utils 同梱の LICENSE.md を参照)。
本ドキュメントは AI を用いて作成しています。不明点・記載の誤りなどありましたら、下記までお問い合わせください。