手動同期の値を変更する権限はオーナーになっているユーザーのみです。そのため、オーナー以外が値を変更するには、オーナーに値の変更を依頼する方法で全ユーザーが値を変更できるようにします。
Udonスクリプト作成
サンプルのButtonSyncAnyoneをU#に書き直し
Udon Graph
別記事「手動同期を作手動同期を値がオーナーしか変更できない方法で作成する」との違いは赤枠の部分
U#
public class ButtonSyncAnyoneBySharp : UdonSharpBehaviour
{
public Text uiText;
[UdonSynced]
private int clickCount = 0;
public void OnClick()
{
if (Networking.IsOwner(this.gameObject))
{
clickCount++;
uiText.text = clickCount.ToString();
RequestSerialization();
}
else
{
// オブジェクトの所有者にOnClickメソッドを処理するように依頼するコード
SendCustomNetworkEvent(NetworkEventTarget.Owner, nameof(OnClick));
}
}
public override void OnDeserialization()
{
uiText.text = clickCount.ToString();
}
}
ちなみに、SendCustomNetworkEvent の第二引数はstring型のメソッド名だが、直接string型で記述するより、nameofを使えばメソッド名のスペルミスをコンパイルエラーが教えてくれるので開発が楽になります。
シーン作成
どこでも良いのでUdon Behaviourコンポーネントを追加して、上記のコードを登録。Synchronization Methodの値をContinuousからManualに変更して、自動同期から手動同期に変更します。
Canvasにボタンを追加してOnClickイベントに先ほど作ったUdonスクリプトのOnClickメソッドを呼び出すようにします。ボタンを追加するとTextオブジェクトも一緒に生成されるので、このテキストに同期した値を表示するようにUdon BehaviourのUi Text値に代入すれば完成。
さいごに
実装してみた感じではオーナー側の値が変更されてから他のユーザーの値が同期されるので、値の変更を依頼したユーザー視点だと、反応が遅くもっさりしています。
そのため、下記記事で解説している手動同期をオーナーが譲与される方法で作成すると反応が早くなるので、全ユーザーが値を変更ギミックを作る場合は基本的にこの方法が無難だと思います。
手動同期をオーナーに値を変更してもらう方法で作成する