#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ファイルをオープンにし、下記のコードを入力します。
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の状態の同期ができると思います。