VRChatでグローバルなミラーを作る


1. この記事は

VRchatで表示をON,OFFできるミラー(鏡)をコーディングする方法です。ミラーをON/OFFさせたときにワールドの参加者全員にON/OFFを反映(同期)できるようにします。かつ後からワールドに入室したユーザーに対してもミラーの状態を同期できるようにします。

2.どのようにするのか?

2-1 オブジェクトの準備

Asset -> VRChatExample -> Prefabs からVRCMirror を描写画面にドロップします。

VRChatExampleのInspectorのTransformの数値を設定して大きさを調整します。

ミラーのON/OFFの切り替えスイッチの働きを担うCubeを配置します。

2-2 UDON# コーディングの準備

Cubeのオブジェクト名は「mirror sw」とします。hierachy windowで「mirror sw」を選択し、Inspector windowのAddComponentをクリックします.

Udon Behaviourを選択します。選択後、Udon Behaviorの欄が表示されるので、「Udon C# Program Asset」を選択のうえ、「New Program」をクリックし、C#のコードが編集できるファイル(.csファイル)を生成します。

2-3 UDON# コーディングの実施

2-2節で作成した.csファイルをオープンにし、下記のコードを入力します。

mirror.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class mirrorsw4 : UdonSharpBehaviour
{

    [SerializeField] private GameObject Mirror; //ミラーオブジェクト本体
    [UdonSynced(UdonSyncMode.None)] private bool mirrorEnable;  //mirrorEnableは同期変数である。


    //後から入室したユーザーにも初めから鏡の状態を反映する。
    void Start()
    {   
        RequestSerialization();  //mirrorEnableの値を後からワールドに入出したユーザーに対して同期を実施するコマンド
    }


    //OnDeserialization 変数の同期が行われると呼び出されるメソッド。このメソッドでワールドのユーザー全員に対してミラーの状態を同期する。
    public override void OnDeserialization()
    {
        Mirror.SetActive(mirrorEnable);  //mirrorEnable=trueの時は、ミラーを表示させる。mirrorEnable=falseの時は、ミラーを消す。
    }


    //スイッチを押した人を「オーナ」にする関数
    public override void Interact()
    {
        //スイッチを押した人を「オーナ」にする命令
        if (!Networking.IsOwner(Networking.LocalPlayer, this.gameObject)) Networking.SetOwner(Networking.LocalPlayer, this.gameObject);

        //すべてのプレイヤに「public void mirrorOn()」を実行させる(同期させる)命令
        SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "mirrorOn");
    }

    //ボタンを押すとミラーをON/OFFする機能を担ってる。
    public void mirrorOn()
    {
        mirrorEnable = !mirrorEnable; //ミラーがONのときはOFFに、OFFのときはONに切り替える。
        Mirror.SetActive(mirrorEnable);  //mirrorEnable=trueの時は、ミラーを表示させる。mirrorEnable=falseの時は、ミラーを消す。

    }
}

「mirror sw」を選択し、Inspector windowにオブジェクト名「Mirror」が表示されるので、hierachy windowの「VRCMirror」をInspector windowのMirrorにアタッチメントを行います。

作業はここまでです。お疲れさまでした。これで、グローバルかつ後からワールドに入室したユーザーに対してもミラーのON/OFFの状態の同期ができると思います。