【VRChat】ミラーを置く:ON/OFFの切り替えと、映す対象を絞る

作成: 2025-12-19最終更新: 2026-09-09

SDKのミラーを置いて、ボタンでON/OFFできるようにします。鏡が重い理由、映す対象のレイヤーを絞る方法、既定でオフにする運用を解説します。

アバターを確認できる鏡は、交流ワールドの定番です。ただ、置き方を間違えると、ワールド全体が一気に重くなります。

鏡は写真ではありません。裏側でもう一度ワールドを描いています。 見えているあいだずっとです。

この記事では、鏡を置いて、ボタンでON/OFFを切り替え、映す対象を絞る ところまでを解説します。

部屋の壁ぎわに立てかけた鏡に、自分の姿が映っている

この記事でわかること

  • 鏡が重い理由
  • 映す対象のレイヤーを絞る方法
  • 既定でオフにしてスイッチで出す作り
  • 鏡が映らないときの原因

ボタンで切り替える を試した状態から始めます。

Sponsored


鏡は、もう一度ワールドを描いている

鏡の中に見えているものは、あらかじめ用意された画像ではありません。

鏡がない場合は1回、ある場合は2回描くことになる

鏡の位置から見た景色を、その場で描き直しています。 つまり、鏡が視界に入っているあいだ、ワールドは2回描かれます。VRなら左右の目それぞれで計算するので、負担はさらに増えます。

だから、鏡を置くときの方針は最初から決まっています。

  1. 既定でオフにする: 入った瞬間から映っている必要はありません。スイッチで出します
  2. 映す対象を絞る: 全部を映す必要はありません。人だけ映れば足りることも多くあります
  3. 同時に1枚まで: 部屋ごとに鏡を置いて全部出しっぱなし、は避けます

この3つを守るだけで、鏡があってもワールドは十分軽く保てます。

きれいな反射だから重い、という話ではありません。描く回数が増えるから重くなります。 だから、映す範囲を狭めれば軽くなります。

Sponsored

実践:スイッチで出す鏡を作る

壁ぎわに鏡を置いて、隣のボタンで出し入れできるようにします。

1. 鏡を置く

「3D Object → Quad」を作り、RoomMirror と名付けます。Quadは1枚の板です。

項目設定
Position(0, 1.6, 2.8)
Rotation(0, 180, 0)
Scale(1.6, 2.4, 1)

幅1.6m、高さ2.4mの鏡が、奥の壁に立ちます。Rotationの Y = 180 は、部屋の中を向かせるためです。

鏡の向きが逆だと、壁の内側が映って真っ暗になります。 Sceneビューで確認してください。

「Add Component」で VRC Mirror Reflection を追加します。これで鏡になります。

Quadに付いている Mesh Collider は削除するか、無効にします。鏡にぶつかる必要はありません。

2. 既定でオフにする

RoomMirror を選び、Inspectorの左上のチェックを外して 無効にします

これが基本の状態です。ワールドに入った人は、まず鏡のない部屋に立ちます。

3. スイッチを作る

「3D Object → Cube」で MirrorButton を作り、(1.2, 1, 2)、Scale (0.3, 0.3, 0.3) に置きます。鏡のそばです。

Assets/Scripts で「Create → U# Script」を選び、MirrorToggle を作ります。

using UdonSharp;
using UnityEngine;

[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class MirrorToggle : UdonSharpBehaviour
{
    [SerializeField] private GameObject mirrorObject;

    private bool isOn;

    private void Start()
    {
        // 起動時は必ず消しておく
        isOn = false;
        Apply();
    }

    public override void Interact()
    {
        isOn = !isOn;
        Apply();
        Debug.Log("[MirrorToggle] mirror=" + isOn);
    }

    private void Apply()
    {
        if (mirrorObject != null) mirrorObject.SetActive(isOn);
    }
}

Start() で必ずオフにしているのが大事です。Inspectorで有効のまま保存してしまっても、実行時には消えた状態から始まります。

MirrorButton に Udon Behaviour を追加し、MirrorToggle を指定します。Mirror Objectに RoomMirror をドラッグして、Interaction Text を 鏡を出す にします。

4. 確かめる

Playして、ボタンを押してみてください。

操作期待する結果
入った直後鏡はない
ボタンを押す鏡が現れて、自分が映る
もう一度押す鏡が消える
ボタンで鏡を出し入れする

Statsを開いた状態で切り替えると、数字がはっきり変わる のが見えます(描画を軽くする で扱いました)。鏡のコストが実感できます。

映す対象を絞る

鏡に何を映すかは、Reflect Layers で決めます。

映すレイヤーの組み合わせで、鏡に何が写るかが変わる

すべてを映すと、部屋も家具もパーティクルも全部が2回描かれます。ここを絞ると、大きく軽くなります。

現実的な選び方は2段階です。

「人だけ映る鏡」 にするなら、PlayerMirrorReflection だけを選びます。アバターの確認が目的なら、これで足ります。背景は映りませんが、自分の姿ははっきり見えます。

部屋も映したい なら、そこに Default を足します。家具や壁が映るようになります。

どちらの場合も、Particle・UI・Pickupのレイヤーは外します。 映っても意味がなく、負荷だけが増えます。

MirrorReflection は、鏡に映すためだけに用意されたレイヤーです。アバターの一部がこのレイヤーに置かれることがあるので、人を映すなら含めておきます。

負荷を下げる設定を組み合わせる

もう1つ、Disable Pixel Lights をオンにしておくと、鏡の中でライトの計算を省けます。見た目の差は小さく、負荷は下がります。

複数の鏡を置くときは、押した鏡以外を消す 作りにします。同じスクリプトを使い回して、それぞれのボタンが自分の鏡だけを出すようにするのが簡単です。

複数の鏡をボタンで切り替える
Sponsored

うまくいかないときは

  • 鏡が真っ暗 → Reflect Layersが空になっていないか。または鏡が壁側を向いています
  • 何も映らないRoomMirror が無効のままか、VRC Mirror Reflectionが付いていません
  • 自分が映らない → Reflect Layersに PlayerMirrorReflection が入っているか確認します
  • 急に重くなる → 鏡が視界に入ったタイミングです。既定でオフにして、必要なときだけ出します
  • 鏡にぶつかる → Quadの Mesh Collider が残っています。削除するか無効にします

おまけ:先に知っておくと良いこと

  • Questやスマホでは置かない選択も: 端末の性能が限られるので、鏡は避けるか、必ずオフの状態で置きます。PCとAndroidで同じ部屋に集まる で扱います
  • 鏡は入口の正面に置かない: 入った瞬間に鏡が見えると、部屋ではなく自分のアバターを見てしまいます。部屋の端に置くほうが、空間として自然です
  • これはローカルの処理です: この記事のスイッチは、押した人の画面でしか鏡が出ません。全員に見せたいなら同期が必要ですが、鏡は各自で出し入れできるほうが親切なことも多いです
  • 大きさは控えめでよい: 全身が映る高さがあれば十分です。壁一面の鏡は見栄えがしますが、そのぶん映る範囲も広がります
  • タイマーで自動的に消す手も: 一定時間が過ぎたら自動で消す作りにすると、消し忘れを防げます。時間差で処理を呼ぶ の仕組みが使えます

まとめ

鏡は便利ですが、置き方に方針が要ります。

  • 鏡は裏側でもう一度ワールドを描いている。だから重い
  • 既定でオフにして、スイッチで出す
  • Reflect Layersで映す対象を絞る。人だけなら PlayerMirrorReflection
  • 同時に出るのは1枚まで

置く前の問いかけは、「この鏡は、常に映っている必要があるか?」 です。ほとんどの場合、答えはノーです。

描画の重さを全体で見直すなら 描画を軽くする、持てる小物を足すなら Pickupで持てる懐中電灯を作る へ進んでください。

VRChat このセクションのノート63