アバターを確認できる鏡は、交流ワールド の定番です。ただ、置き方を間違えると、ワールド全体が一気に重くなります。
鏡は写真ではありません。裏側でもう一度ワールドを描いています。 見えているあいだずっとです。
この記事では、鏡を置いて、ボタンでON/OFFを切り替え、映す対象を絞る ところまでを解説します。
この記事でわかること
- 鏡が重い理由
- 映す対象のレイヤーを絞る方法
- 既定でオフにしてスイッチで出す作り
- 鏡が映らないときの原因
ボタンで切り替える を試した状態から始めます。
鏡は、もう一度ワールドを描いている
鏡の中に見えているものは、あらかじめ用意された画像ではありません。

鏡の位置から見た景色を、その場で描き直しています。 つまり、鏡が視界に入っているあいだ、ワールドは2回描かれます。VRなら左右の目それぞれで計算するので、負担はさらに増えます。
だから、鏡を置くときの方針は最初から決まっています。
- 既定でオフにする: 入った瞬間から映っている必要はありません。スイッチで出します
- 映す対象を絞る: 全部を映す必要はありません。人だけ映れば足りることも多くあります
- 同時に1枚まで: 部屋ごとに鏡を置いて全部出しっぱなし、は避けます
この3つを守るだけで、鏡があってもワールドは十分軽く保てます。
きれいな反射だから重い、という話ではありません。描く回数が増えるから重くなります。 だから、映す範囲を狭めれば軽くなります。
実践:スイッチで出す 鏡を作る
壁ぎわに鏡を置いて、隣のボタンで出し入れできるようにします。
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段階です。
「人だけ映る鏡」 にするなら、Player と MirrorReflection だけを選びます。アバターの確認が目的なら、これで足ります。背景は映りませんが、自分の姿ははっきり見えます。
部屋も映したい なら、そこに Default を足します。家具や壁が映るようになります。
どちらの場合も、Particle・UI・Pickupのレイヤーは外します。 映っても意味がなく、負荷だけが増えます。
MirrorReflection は、鏡に映すためだけに用意されたレイヤーです。アバターの一部がこのレイヤーに置かれることがあるので、人を映すなら含めておきます。

もう1つ、Disable Pixel Lights をオンにしておくと、鏡の中でライトの計算を省けます。見た目の差は小さく、負荷は下がります。
複数の鏡を置くときは、押した鏡以外を消す 作りにします。同じスクリプトを使い回して、 それぞれのボタンが自分の鏡だけを出すようにするのが簡単です。

うまくいかないときは
- 鏡が真っ暗 → Reflect Layersが空になっていないか。または鏡が壁側を向いています
- 何も映らない →
RoomMirrorが無効のままか、VRC Mirror Reflectionが付いていません - 自分が映らない → Reflect Layersに
PlayerとMirrorReflectionが入っているか確認します - 急に重くなる → 鏡が視界に入ったタイミングです。既定でオフにして、必要なときだけ出します
- 鏡にぶつかる → Quadの Mesh Collider が残っています。削除するか無効にします
おまけ:先に知っておくと良いこと
- Questやスマホでは置かない選択も: 端末の性能が限られるので、鏡は避けるか、必ずオフの状態で置きます。PCとAndroidで同じ部屋に集まる で扱います
- 鏡は入口の正面に置かない: 入った瞬間に鏡が見えると、部 屋ではなく自分のアバターを見てしまいます。部屋の端に置くほうが、空間として自然です
- これはローカルの処理です: この記事のスイッチは、押した人の画面でしか鏡が出ません。全員に見せたいなら同期が必要ですが、鏡は各自で出し入れできるほうが親切なことも多いです
- 大きさは控えめでよい: 全身が映る高さがあれば十分です。壁一面の鏡は見栄えがしますが、そのぶん映る範囲も広がります
- タイマーで自動的に消す手も: 一定時間が過ぎたら自動で消す作りにすると、消し忘れを防げます。時間差で処理を呼ぶ の仕組みが使えます
まとめ
鏡は便利ですが、置き方に方針が要ります。
- 鏡は裏側でもう一度ワールドを描いている。だから重い
- 既定でオフにして、スイッチで出す
- Reflect Layersで映す対象を絞る。人だけなら
PlayerとMirrorReflection - 同時に出るのは1枚まで
置く前の問いかけは、「この鏡は、常に映っている必要があるか?」 です。ほとんどの場合、答えはノーです。
描画の重さを全体で見直すなら 描画を軽くする、持てる小物を足すなら Pickupで持てる懐中電灯を作る へ進んでください。