uGUI
- uGUI は Unity 4.6 から搭載された UI を作成する機能
- Unityの編集画面やマニュアル上では単にUIと表記されている部分
- 参考: Unity 4.6オープンβスタート。新GUI「uGUI」の試用が可能に
効能、使い方
Buttonコンポーネント等から使用できるuGUIイベントを使用することで、通常アクセスできない関数や変数にアクセスする事が可能です。
- String型の変数の変更、親子関係の変更、内部にSet関数を持つコンポーネントのターゲット先の変更等
uGUIイベントは以下の手順で能動的に起動する事が可能です。
- Project上で新規Animationを作成
- 作成したAnimationにアニメーションイベントを追加。Functionに Press と入力。ObjectはNoneのままで可
- Buttonコンポーネントを設定したオブジェクトのAnimationControllerで作成したAnimationを実行
詳細情報
- uGUI は Unity 4.6 から搭載された UI を作成する機能
- Unityの編集画面やマニュアル上では単にUIと表記されている部分
- 参考: Unityの新GUI、UGUIのイベント制御について
- UI部品で起きたイベント(例えば Button のクリック)により任意の関数を呼べる機能がある。これがいわゆる uGUI イベント。
- 戻り値 void で引数が0個から1個の任意の関数を呼べる
- ただし引数の型は float, integer, string, object reference のいずれかに限る
- 参考:[[Unity Button チュートリアル 8'36"~: https://youtu.be/J5ZNuM6K27E?t=516]]
- Unity Button マニュアル
- この uGUI の機構を流用することで(VRChat では使えないスクリプトを用いることなく)限定的ではあるがコンポーネントの関数を呼べるようになる。
uGUIを操作できるようにする設定
- CanvasにVRC_UiShapeコンポーネントを付ける
- Canvas以下の全てのオブジェクトのLayerを「UI」から「Default」などにする
- プレイヤーなどと衝突させたくない場合は BoxCollider を付加して IsTrigger にチェックを入れる
- 操作せず表示するだけなら VRC_UiShape は必要ない
- Layerが「UI」のままだとクイックメニューを表示している間だけ操作できる状態になる
- VRC_UiShape は BoxCollider が存在しない場合には自動的に付加するようだ。
- BoxCollider のsizeは x,y は RectTransform の width, height の値、z は 1 で固定に調整されるようだ。(RectTransform の Scale Z が初期状態の 1 のままだと1m厚の壁が出来てしまうので注意。scale を小さくして薄くするか、IsTrigger にして衝突しないようにする)
- 操作したい UI 部品はこの width, height の範囲内に設置する。(範囲外のものも描画されるし動作はするがユーザーのレイが衝突しないので操作できない)
- 配置する各 UIコンポーネントの Navigation 設定は None にする。
- そうしないと、プレイヤーの移動操作キー入力で UI コンポーネントが動作してしまう。(プレイヤー左右移動で Slider が変化する、など。下記「余談」にもその話あり)
- uGUIからVRC_Triggerを使う
活用
スライド出来るメニュー
以下のPrefabをインポートすれば使えます
使い方
- 「Handle」以下にメニューを作ればスライド出来ます
- スライドする量について
- CanvasのHeightに対するHandleのHeightでスライドする量が決まります
- 上記のPrefabではCanvasのHeightが500、HandleのHeightが1000なので、1000 / 500 = 2、つまり2ページ分スライドします
- スライドする量を変更するとメニューの位置もずれると思うので、Handle以下のオブジェクトのBottomを調整してください
- CanvasのHeightに対するHandleのHeightでスライドする量が決まります
※uGUIの詳しい使い方はUnityの話になるのでここでは割愛します
備考
- 上記のPrefabではスライドは同期しないはず
- VRC_ObjectSyncをつければ同期するかも(未調査)
- 単純にUiShapeを付けたオブジェクトにObjectSyncつけるだけではInputFieldには同期されず、InputField自体に付けても同期されなかった(gato)
- スライドが同期できれば、みんなで撮った写真をたくさん貼り付けてスライドするアルバムみたいなことが出来るかも
- スライドが同期できなくても、uGUIのボタンからOnClickイベントでVRC_Trigger.Interactを実行すれば、そこの同期は取れるのでローカルでのメニューとしては機能する
余談
- 単純に考えて、uGUIのScrollViewを使うのが一番良いと思ったが、バグが有って使いづらかったため上記のPrefabの構成となった
- 何故かプレイヤーの移動に反応する仕様になっている
- 前進したら上にスクロールしたりする
- (推測)SDK内で、InputのAxisのVertical等を参照してしまっているのが原因
- 何故かプレイヤーの移動に反応する仕様になっている
- 一方、uGUIのSliderは同じ問題があったものの、NavigationをNoneにすることで解決できた為にこちらを採用
- SliderのHandleの下にメニューをくっつけるという変な構成だが、現状の仕様ではこれしか思いつかなかった
- uGUIのScrollbarにもNavigationがあるが、これをNoneにしてもダメだった
- というかScrollViewのScrollbarを両方削除してもダメだった
- →バグの原因はScrollbarではなくScrollView本体ぽい
- というかScrollViewのScrollbarを両方削除してもダメだった
- より良い構成等あれば教えてもらえると助かります!(@VRNatsuVR)
Canvasを使ったプレイヤートラッキング
- "Screen Space - Camera" にした Canvas はプレイヤーの視点であるカメラにくっつくことを利用して、プレイヤーの位置を把握・追跡する手法。
- https://twitter.com/zi_zi_neet/status/1001846340161191943
- http://vrchat.wikidot.com/worlds:guides:player-tracking
資料
- 3D Textが最前面になるのを防ぐShader
- VRChatのワールドでuGUIを使う(@gatosyocora)
- 【VRChat】uGUIを使ったワールドメニューのサンプル公開+解説(@rakurai5)
カテゴリ・タグ:
カテゴリ-Components
カテゴリ-Unity
- 最終更新:2020-04-30 11:18:03