VRChatでUdonを使って同期をした話1
Udonでワールドを作った時に同期で思ったよりも手間取ったので書きます。Udon Graphは使用していないので、UdonSharp環境での解説になります。
目次
・Udonでの座標同期
・Udonでの変数同期
・Udonでのコンポーネント同期
Udonでの座標同期
同期したいオブジェクトにアタッチされているUdon BehaviourのSynchronize Positionにチェックを付けます。おわり。
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イベント内に処理を記述して毎フレーム同期するのは避けたいところなので、次回は適切なタイミングについて解説します。
この記事が気に入ったらサポートをしてみませんか?