# EzMirror

EzMirror は、VRChat ワールド向けのシンプルなミラー切替パッケージです。
1 つの `VRCMirrorReflection` に複数の Profile を適用し、Off / HQ / 半透明 / LQ を切り替えます。

## Requirements

- Unity 2022.3.22f1
- VRChat Worlds SDK 3.x
- UdonSharp
- PC / Quest 基本対応

最新の配布情報、価格、対応状況はリポジトリ直下の `package-catalog.yml` を正本とします。

## Quick Start

1. `Runtime/Prefabs/EzMirror.prefab` をシーンへ配置します。
2. ルートの `EzMirror` Inspector で `基本セットアップを自動実行` を押します。
3. Step 1〜4 でミラー面 / スイッチUI / 表示範囲の箱 / フェード距離を調整します。
4. 必要に応じて Step 5 以降で表示パターン / 保存 / 効果音を調整します。
5. Inspector の設定チェックが「問題なし」になることを確認します。詳細な検証や保守操作は開発者オプションにあります。

Prefab では基本参照が設定済みです。通常は配置後、Transform と Trigger の大きさだけを調整すれば使えます。

## Inspector Guide

Inspector は「まず押す」「現在の状態」「設定チェック」「Step 1〜7」「開発者オプション」の順に並びます。

- `基本セットアップを自動実行`: 子階層から Mirror / Trigger / Toggle / 入力判定を拾い、Off 固定 Profile、LQ 背景クリア球、PC / Quest 既定をまとめて整えます。
- `設定チェック`: いま直すべき不足だけを短く表示します。安全に直せるものは、その場に修復ボタンが出ます。
- `Step 1`: ミラー面を選び、位置・回転・大きさを調整します。
- `Step 2`: レーザー/クリック、Use、手で触る切替方法とスイッチ位置を調整します。詳しい入力条件は折りたたみ内にあります。
- `Step 3`: 表示範囲の箱を調整します。この箱の中にいる時だけミラーを表示し続けます。
- `Step 4`: 表示範囲の端で、どのくらいなめらかに消すかを設定します。
- `Step 5`: 表示パターンの名前、表示ON/OFF、透明度、背景、PC専用、アイコン、追加オブジェクトを設定します。Profile Assetや画質の詳細は折りたたみ内にあります。
- `Step 6`: 同じユーザーの再入室時に状態を復元したい場合だけ、ローカル保存を設定します。ネットワーク同期は行いません。
- `Step 7`: 切替時の効果音とコントローラー振動を設定します。AudioSourceや振動値の詳細は折りたたみ内にあります。
- `開発者オプション`: README、詳細検証、保守用修復、Material再生成、保存キー再生成、内部参照などをまとめています。通常設置では開かなくても使えます。

## Profiles

- Profile `0`: Off 固定。ミラーは非表示です。
- Profile `1..N-1`: ミラー表示、画質、透明度、PC専用、アイコン、追加オブジェクト ON/OFF を設定できます。

Profile Asset には、Scene に依存しない設定だけを保存します。
Scene 内の追加オブジェクトや入力 UI は EzMirror 本体側に残します。
これにより、HQ / 半透明 / LQ などの基本 Profile を複数の EzMirror で共有できます。
Profile Asset を割り当てただけでは現在の設定を上書きしません。内容を取り込みたい時だけ、詳細設定内の反映ボタンを押します。

## Switch UI and Inputs

切替方法は組み合わせて使えます。

- uGUI: レーザー/クリックで Toggle UI を操作します。無効化時は Canvas の BoxCollider も無効化し、Raycast を受けにくくします。
- Interact: `InteractInput` で Use による切替を受け付けます。表示テキストと Use 距離は Step 2 の詳細設定で調整できます。
- Contact: `ContactInput` で Avatar の手/指 Contact を受け付けます。反応タグ、Self/Others、ローカル判定は Step 2 の詳細設定で調整できます。

サンプルと基本セットアップの初期状態は、最も分かりやすい uGUI だけを有効にしています。Use / Contact も必要な部品は生成されるため、Step 2 でONにするだけで使い始められます。

切替状態は各ユーザーごとにローカルです。グローバル同期は行いません。

## Generated Materials

Profile Material は通常 UI では直接選ばず、Profile Asset の基盤 Material から自動生成します。
生成 Material は EzMirror と Profile index ごとの安定パスへ作成され、Missing 時は同じパスに再作成されます。
生成や掃除は開発者オプションにあります。未参照生成物は、確認ボタンで候補を出した後にだけゴミ箱へ移動できます。自動削除は行いません。

## Persist Key

`保存設定` を使う場合、EzMirror ごとに `EZ_MIRROR_<10桁大文字hex>` 形式の保存キーが必要です。
空キーは Step 6 の `保存キーを自動作成`、または開発者オプションの保存キー生成で作成できます。
既存の非空キーは自動上書きしません。
同じ Scene 内で重複している場合は Validator が Warning を出します。

## Public Udon API

UI や `SendCustomEvent` からは、引数なしのメソッドを呼び出せます。

- `SendCustomEvent("SelectNextFromUgui")`
- `SendCustomEvent("SelectNext")`
- `SendCustomEvent("TurnOff")`
- `SendCustomEvent("ResetToDefault")`

他 UdonSharp から特定 Profile を直接選ぶ場合は、`EzMirror` 参照を持って `SelectProfile(int profileIndex)` を呼びます。
`profileIndex` は `0` が Off、`1` が Profile 1 です。

## Troubleshooting

- Mirror が表示されない: 設定チェックの不足表示を確認してください。Materialの再生成など保守操作が必要な場合だけ、開発者オプションを開きます。
- Quest で HQ が出ない: PC専用 Profile は非PC環境でスキップされます。LQ Profile が PC専用でないことを確認してください。
- Contact が反応しない: Sender は Avatar 側の Contact を想定しています。Step 2 の触れる判定の詳細設定で、Contactタグ、Self/Others、Local Only を確認してください。
- Trigger 内外で表示が揺れる: `Trigger Refresh Interval` で位置再判定を行います。VRC Station や入れ子 Trigger がある場合は間隔を少し長めにしてください。

## FAQ

### Network Sync はありますか？

ありません。EzMirror の切替状態は各ユーザーごとに独立します。

### Profile Asset に Scene 内オブジェクトを保存できますか？

できません。共有しやすさと安全性のため、Scene 参照は EzMirror 本体側に残します。

### 生成 Material を消しても大丈夫ですか？

EzMirror が参照している Material が Missing の場合、同じ安定パスへ再生成できます。
未参照生成物は確認後にだけ削除してください。

## Terms / Changelog

- 利用規約: `TERMS.md`
- 更新履歴: `CHANGELOG.md`
