こんばんは。ハツェです。
今回も同期uGUIについて書いていきます。
他の記事でも紹介していますが、この記事は全4つからなるシリーズです。
今回の動作環境は、Unity : 2018.4.20f1、VRCSDK : 2020.04.09.16.59、U# : v0.15.5です。
目次
追記
当記事は少し古めの物になります。
使用する際は、ContinuousSyncの手法にてお試しいただけますと正常に動作するかと思います。
予めご了承ください。
前回
前回はスライダーの同期について書きました。
hatuxes.hatenablog.jp
完成図
今回は下図(三人称視点)のドロップダウン部分を紹介します。
他のUIも別の記事で紹介しています。
上のテキストにvalueを、下のテキストにcaptionを表示しています。
スクリプト
実装に使ったスクリプトはこちらになります。
using UdonSharp; using UnityEngine; using UnityEngine.UI; using VRC.SDKBase; using VRC.Udon; public class Dropdown_Anyone : UdonSharpBehaviour { Dropdown _dropdown; [SerializeField] Text _numText; [SerializeField] Text _contentText; [UdonSynced] int _value; void Start() { _dropdown = this.gameObject.GetComponent<Dropdown>(); } void Update() { _dropdown.value = _value; _numText.text = _value.ToString(); _contentText.text = _dropdown.captionText.text; } public void SetValue() { _value = _dropdown.value; } public void ChangerOwner() { if (!Networking.IsOwner(Networking.LocalPlayer, this.gameObject)) Networking.SetOwner(Networking.LocalPlayer, this.gameObject); } }
部分解説
ちょっと説明が無いので、解説をいくつかしていきます。
今回は、_value
がintの同期変数です。
ChangeOwner
ChangeOwner()
はEventTriggerのPointerDown
で呼んでいます。
「EventTriggerって何?」と思った方は、ボタン・トグル編をご覧ください。
ボタンの時と実装は同じく、押し始めにその人がこのスクリプトのオーナーじゃなかったらオーナーにしてあげるようになっています。
また、EventTriggerでオーナーを移しているのは、少しでもオーナー移動時と変数代入時のフレームを分けるためです。
SetValue
SetValue()
はDropdownのOn Value Changed
で呼んでいます。
そのため、別の選択肢を選んだ時にSetValue()
が呼ばれることになります。
SetValue()
の中身は
_value = _dropdown.value;
だけなので、別の選択肢をクリックしたら、その要素番号を同期変数_value
に代入するといった処理のみになります。
選択肢の内容を取得する
_contentText.text = _dropdown.captionText.text;
Dropdownで選択している内容を表示させるにはリストからの取得とラベルからの取得があります。
現状、UdonではListを含むGenericには対応していないため前者の方法では取得できません。
そのため、ラベルからDropdownの内容を取得する方法を採用しています。
あとがき
ドロップダウン自体がVRChatでなじみが無いので、どういう風に使われるかに期待ですね。
ドロップダウンを使うのか、もしくはトグルグループが使われるのか見たいなところありそうですし...
今回を含む同期uGUIのサンプルはまとめてGithubに置いてあります。
ライセンスを確認したうえで、お使いください。
github.com
次回
次回はInputFieldの同期についてお話ししますが、内容はほとんど同じです。
hatuxes.hatenablog.jp