RoomVisibilityManager
- Digital0 JPY











VRChat用ワールドで、部屋内にいるとき、 部屋の外を非表示にすることで、負荷を軽減する機能を提供します。 - ワールド上で部屋のバウンディングボックスを自動生成する機能 - バウンディングボックス計算対象外オブジェクトの指定機能 - 室外、部屋1、部屋2など、エリアごとの表示制御 - 表示制御対象外GameObject指定 - 表示制御方法は2パターン選べます - Rendererの有効無効を切り替える - GameObject自体の有効無効を切り替える ◆ライセンス ライセンスはCC-0です。ご自由にご利用ください。許諾なく改変再配布可能です。 ◆お問い合わせ 何かしら問題があれば、Twitter (@hato_poppo_life) などでご連絡ください。 対応できる範囲で対応させていただきます。 下記GitHubのissueでも問題ありませんが、気づくまで時間がかかるかもしれません。 https://github.com/hatolife/RoomVisibilityManager ◆補足 寄付などは受け付けておりません。 VRChatやTwitterでお友達になっていただいたほうが嬉しいです。 コードはCodexを用いて作成しました。 使用方法についての簡単な説明書をスライドにしています。 Boothに添付している画像と同じものです。 https://docs.google.com/presentation/d/1bTmbLJHejE3Wo1SnaQTxMoPsjOekF4tAkiKFsUqjMSM/edit?usp=sharing --- 以下 Codex 作成のユーザーガイドです --- # RoomVisibilityManager ユーザーガイド `RoomVisibilityManager` は、プレーヤーがいる部屋に応じて、ワールド内の見せるものを切り替えるためのコンポーネントです。 部屋の外観、別室の中身、UI、Light などを部屋ごとに制御できます。 ## 1. どんな目的で使うものか 次のような目的で使えます。 - 部屋に入ったら、外の景色や別エリアを隠したい - 見えていなくてよいオブジェクトを非表示にして、負荷軽減したい - 部屋ごとに UI や Light の見え方を切り替えたい - プレーヤーの居場所に合わせて、見せたい情報だけを出したい ## 2. 何ができるか `RoomVisibilityManager` でできることは次のとおりです。 - 部屋ごとに表示 / 非表示を切り替える - 室外にいるとき専用の表示状態を作る - 別の部屋を見せる / 隠すを自由に決める - `Renderer` を個別に切り替える - `Canvas` を個別に切り替える - `Light` を個別に切り替える - `Terrain` をまとめて切り替える - 指定した親オブジェクトを `SetActive` でまとめて切り替える - 常に表示したいオブジェクトを除外する - 部屋判定用バウンディングボックスを自動生成する ## 3. どう使うか 最短手順だけに絞ると、次の 6 ステップです。 1. 空の GameObject に `RoomVisibilityManager` を付ける 2. `部屋ルートオブジェクトリスト` に各部屋の親を入れる 3. `部屋以外のオブジェクトのルート` に、部屋に入ったら隠したい親を入れる 4. `部屋表示制御表` を設定する 5. `セットアップ実行` を押す 6. 生成されたバウンディングボックスを確認する まずはこれだけで動作確認できます。 部屋構成や対象オブジェクトを変えたら、もう一度 `セットアップ実行` をしてください。 ## 4. 注意点 使う前に次だけ押さえてください。 - 部屋どうしが重なる構成には対応していません - 設定変更後は `セットアップ実行` が必要です - `表示切替対象外` に入れた子が、`GameObject 有効状態で切り替える` 親の下にあると、一緒に消えます - 他の仕組みが同じ `Renderer` / `Canvas` / `Light` / `GameObject` を同時に制御する構成は非推奨です - Terrain は細かい描画制御ではなく、GameObject ごと ON/OFF します - `EditorOnly` タグ配下のオブジェクトはセットアップ対象から外れます ## 5. 個々の機能説明 ### 5.1 部屋ルートオブジェクトリスト 各要素を 1 部屋として扱います。 そのオブジェクトの子孫全体が、その部屋の表示対象候補になります。 ### 5.2 部屋以外のオブジェクトのルート 部屋に入ったときに隠したいもの、または室外設定に従って表示を切り替えたいものを入れます。 例: - 建物の外観 - 遠景 - 屋外オブジェクト - 共用エリア ### 5.3 表示切替対象外のオブジェクトリスト 常に表示したいものを入れます。 表示制御の対象から外されます。 例: - 常設 UI - 常時点灯したい Light - 絶対に消したくない演出オブジェクト ### 5.4 GameObject 有効状態で切り替えるオブジェクトリスト 通常は `Renderer.enabled` / `Canvas.enabled` / `Light.enabled` で切り替えます。 このリストに入れたものは、親ごと `GameObject.SetActive` で切り替えます。 向いているケース: - 子要素ごとまとめて切り替えたい - パーティクルや補助コンポーネントもまとめて止めたい - 個別の enabled 切替ではなく親単位で制御したい ### 5.5 部屋表示制御表 このコンポーネントの中心となる設定です。 - 行: 今どこにいるか - 列: 何を表示するか 先頭の `室外` は `部屋以外のオブジェクト` を意味します。 その右と下に、各部屋が並びます。 たとえば: - `部屋A` にいるとき `室外` を OFF - 外観や遠景を隠す - `部屋A` にいるとき `部屋B` を OFF - 別室を隠す - `部屋A` にいるとき `部屋B` を ON - 隣室を見せる ### 5.6 セットアップ実行 押すと次を自動で行います。 - 部屋判定用バウンディングボックスの生成 - 表示切替対象の再収集 - 設定チェック 設定を変えたあとに動きが合わないときは、最初にここをやり直してください。 ### 5.7 プレーヤー判定点 - `AvatarRoot` - `Head` から選べます。 通常は `AvatarRoot` で十分です。 ### 5.8 判定間隔 何秒ごとに部屋判定するかを決めます。 小さいほど反応は速くなります。 ### 5.9 開始待機秒数 ワールド入場直後にすぐ切り替えず、少し待ってから表示制御を開始できます。 ### 5.10 判定マージン バウンディングボックスの境界で判定が揺れる場合に、少し余裕を持たせるための設定です。 ### 5.11 Terrain も非表示にする `部屋以外のオブジェクトのルート` 配下の Terrain を、部屋内で非表示対象に含めます。 ### 5.12 バウンディングボックスマージン バウンディングボックス自動生成時に、少し大きめに作るための余白です。 ### 5.13 詳細デバッグログ Inspector のいちばん下にある `デバッグ` セクション内の項目です。 ON にすると、`[RoomVisibilityManager]` 付きで部屋判定と表示切替の詳細ログを Unity Console に出します。 調査用として、1 秒ごとに - 今どこにいるか (`室外` または各部屋) - `室外` と各部屋を表示しているか / 非表示にしているか もログ出力します。 通常は OFF で構いません。 不具合調査時だけ ON にする想定です。 ## 6. 困ったとき うまく動かないときは、次の順で確認してください。 1. `部屋ルートオブジェクトリスト` が正しいか 2. `部屋以外のオブジェクトのルート` が正しいか 3. `部屋表示制御表` が意図どおりか 4. `セットアップ実行` をやり直したか 5. 生成されたバウンディングボックスが正しい大きさか 6. 必要なら Inspector 最下部の `デバッグ` セクションで `詳細デバッグログ` を ON にしたか ## 7. FAQ ### Q. 室内のオブジェクトを室外に持っていったら表示されなくなった A. そのオブジェクトが、まだ表示制御対象として扱われている可能性があります。 常に表示したいなら `表示切替対象外のオブジェクトリスト` に入れてください。 配置や親子構造を変えたあとも、`セットアップ実行` はやり直してください。 ### Q. 設定を変えたのに結果が変わらない A. `セットアップ実行` をやり直してください。 表示制御対象やバウンディングボックスは、ボタン実行時に再構築されます。 ### Q. 一部のオブジェクトだけ消えない A. 次を確認してください。 - `表示切替対象外のオブジェクトリスト` に入っていないか - `部屋表示制御表` でその対象が ON になっていないか - 対象が本当に `roomRoots` または `nonRoomRoots` 配下に入っているか ### Q. 常時表示したいのに消えてしまう A. `表示切替対象外のオブジェクト` が、`GameObject 有効状態で切り替えるオブジェクト` の子になっていないか確認してください。 親が `SetActive(false)` になると、子も一緒に消えます。 ### Q. 部屋の境界でチラつく A. 次を調整してください。 - `判定マージン` - `バウンディングボックスマージン` - 自動生成後のバウンディングボックスのサイズ ### Q. UI や Light が切り替わらない A. 次を確認してください。 - `Canvas` や `Light` のコンポーネント自体が有効か - 対象が `activeToggleRoots` 配下に入っていないか - `セットアップ実行` をやり直したか ### Q. 生成されたバウンディングボックスが想定より大きい A. `QvPen` などの一部のギミックがバウンディングボックス計算対象に含まれると、バウンディングボックスが異様に大きくなる場合があります。 原因となるオブジェクトを探し、`バウンディングボックス計算から除外するオブジェクトのルートリスト` に登録してください。 ### Q. 部屋にテレポートさせたとき床を突き抜けて落下する A. 表示切替で床の Renderer が消えるタイミングと、プレーヤー移動のタイミングが噛み合わず落下することがあります。 対策として、床の位置に `Renderer` を無効化した `Quad` などを置き、それを `表示切替対象外のオブジェクトリスト` に追加してください。 見た目には出さず、常に残る当たり判定の補助床として使う想定です。 ### Q. 部屋内の表示制御対象外の重力を受けるオブジェクトが消える A. 床や地面が非表示になった結果、そのオブジェクトが床や地面を突き抜けて落下している可能性があります。 対策として、オブジェクトの下に `Renderer` を無効化した `Quad` などを置き、それを `表示切替対象外のオブジェクトリスト` に追加してください。 見た目には出さず、常に残る当たり判定の補助床として使う想定です。 ### Q. 部屋に入っても外が消えない A. `部屋表示制御表` のその部屋の行で、`室外` 列が ON になっていないか確認してください。 部屋内で外を隠したいなら、そのセルを OFF にします。 内部仕様まで確認したい場合は `readme.md` を参照してください。











