Open3

UdonSharpの攻略

fogfog

同期ObjectのInstantiate方法

Instantiateしても同期されない。
あらかじめSceneに配置しておく必要がある。
ちなみに同期する場合は「VRCObjectSync」を使用する。

テクニックとして、あらかじめSceneに配置しておいた同期Objectを非表示にしておき、
使いたいときに表示することが考えられる。
Object Pool Patternのような感じ。

同期する必要のないObjectのInstantiate方法

Instantiateを使う。以前は「VRCInstantiate」を使っていたようだが、今は非推奨。

fogfog

RPCを行うには?

引数を渡すことはできない。
引数なしメソッドなら呼び出せる。

SendCustomNetworkEvent(NetworkEventTarget.All, nameof(メソッド));

どうすれば引数を渡せるか?

stringの変数に、呼びだしたい機能名と引数を一つの文字列としてまとめて、それを同期すればよい。
まとめるには、例えば「,」区切りでできる。

[UdonSynced, FieldChangeCallback(nameof(FunctionWithArgsStr))]
private string _functionWithArgsStr;

FieldChangeCallbackは、変数の値が変化したときに「FunctionWithArgsStr」Propertyを呼び出すように設定することができる。

https://udonsharp.docs.vrchat.com/vrchat-api/#udonbehaviour

fogfog

外部サーバーとの送信・受信

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;
}