LoginSignup
1
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-13

1. この記事は

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

309.jpg

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

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

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

310.jpg

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

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

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

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

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

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にアタッチメントを行います。

316.jpg

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2