UdonSharpの攻略
同期ObjectのInstantiate方法
Instantiateしても同期されない。
あらかじめSceneに配置しておく必要がある。
ちなみに同期する場合は「VRCObjectSync」を使用する。
テクニックとして、あらかじめSceneに配置しておいた同期Objectを非表示にしておき、
使いたいときに表示することが考えられる。
Object Pool Patternのような感じ。
同期する必要のないObjectのInstantiate方法
Instantiateを使う。以前は「VRCInstantiate」を使っていたようだが、今は非推奨。
RPCを行うには?
引数を渡すことはできない。
引数なしメソッドなら呼び出せる。
SendCustomNetworkEvent(NetworkEventTarget.All, nameof(メソッド));
どうすれば引数を渡せるか?
stringの変数に、呼びだしたい機能名と引数を一つの文字列としてまとめて、それを同期すればよい。
まとめるには、例えば「,」区切りでできる。
[UdonSynced, FieldChangeCallback(nameof(FunctionWithArgsStr))]
private string _functionWithArgsStr;
FieldChangeCallbackは、変数の値が変化したときに「FunctionWithArgsStr」Propertyを呼び出すように設定することができる。
外部サーバーとの送信・受信
VRCUrl型の変数を使用し、例えば「VRCStringDownloader.LoadUrl」メソッドを利用する。
VRCUrlは初期化以外、書き込むことができない。
プログラムからはURLを動的に変更できない。
URLを状況に応じて変えたい場合は?
ユーザーが介入することで、URLを変更し、サーバーとの送信や受信が可能である。
どうやるのか?
VRCUrlInputFieldが使用できる。
これは、プログラムからはURLを設定することはできないが、
Worldにいるユーザーが入力することで、URLを設定できる。
「VRCUrlInputField.GetUrl();」によりVRCUrl型の変数が返される。
サーバーからの応答の受け取り
public override void OnStringLoadSuccess(IVRCStringDownload result)
が呼び出される。
外部からの画像読み込み
var _imageDownloader = new VRCImageDownloader();
var udonBehaviour = GetComponent<UdonBehaviour>();
var info = new TextureInfo();
info.GenerateMipMaps = true;
_imageDownloader.DownloadImage(url, null, udonBehaviour, info);
public override void OnImageLoadSuccess(IVRCImageDownload result)
{
Debug.Log("[Debug] Image download success");
base.OnImageLoadSuccess(result);
ApplyTexture(result.Result);
_downloaded = true;
}