VRChatでUdonを使って同期をした話1

Udonでワールドを作った時に同期で思ったよりも手間取ったので書きます。Udon Graphは使用していないので、UdonSharp環境での解説になります。


目次

・Udonでの座標同期
・Udonでの変数同期
・Udonでのコンポーネント同期


Udonでの座標同期

同期したいオブジェクトにアタッチされているUdon BehaviourのSynchronize Positionにチェックを付けます。おわり。画像1

Udonでの変数同期

クラス変数に[UdonSynced]を付けます。おわり。

    [UdonSynced]
    private string str = "";


Udonでのコンポーネント同期

クラス変数に[UdonSynced]を付けます。UdonSharpに怒られます。

はい、UdonSharpではコンポーネント(オブジェクトにアタッチされているプログラム)をクラス変数として宣言した場合UdonSyncedを付けて同期することはできないようです。という訳で、ある程度手動で同期する必要があるので解説します。

以下に同期するサンプルコードを示します。

using UdonSharp;
using UnityEngine;
using UnityEngine.UI;
using VRC.SDKBase;
using VRC.Udon;

public class SyncInteract : UdonSharpBehaviour
{
    public Text text;
    [UdonSynced]
    private string str = "";

    private void Update()
    {
        text.text = str;
    }

    public override void Interact()
    {
        str = text.text + "A";
    }
}

上記のサンプルコードでは、オブジェクトにインタラクトするとUdonSynced変数であるstrにtext.textに文字列の"A"を繋げたものが代入され、毎フレームtext.textにstrを代入することで同期されたテキストの入力を実現しています。Text型変数textは予めUnityで指定しておきましょう。

これで最低限のコンポーネントの中の変数の値の同期ができました。今回は一つのTextコンポーネントの文字列を同期するコードでしたが、色々なオブジェクトを動的に選択する場合オブジェクトのパスをUdonSynced変数として持つことで選択されたオブジェクトを同期できます。パスの取得についてはこちらを参考にさせて頂きました。

とりあえず同期しました。しかしUpdateイベント内に処理を記述して毎フレーム同期するのは避けたいところなので、次回は適切なタイミングについて解説します。

この記事が気に入ったらサポートをしてみませんか?