【VRC】UdonSharpで書いた関数をボタンクリックで呼び出す【UdonSharp】


環境

  • VRCSDK3-WORLD-2021.02.23.11.40_Public
  • UdonSharp_v0.19.2
  • Unity 2018.4.20f1

実現したいこと

  • ボタンを押したら座面位置が調整できるUI作成
  • その前段階としてボタンを押したら閉じるメニュー作り

手順

  • シーンに以下のようなヒエラルキーを作成
Menu(Empty)-|
            |-Canvas(Canvas)-|
                             |-Buttons(Empty)-|
                                              |-CloseButton(Button)
  • Canvas 等の設定
  • Menu に UdonSharp スクリプトを追加
  • CloseButton を押すと Menu の関数が発火するように設定

ヒエラルキーの作成

  • 好きなところに Create Empty し名前を Menu とする
  • Menu を右クリックし UI > Canvas を選択し追加
  • Canvas を右クリックし Create Empty を選択し名前を Buttons とする
  • Buttons を右クリックし UI > Button を選択し追加

Canvas 等の設定

  • VRC Ui Shape コンポーネントを Canvas に追加
  • Canvas の Render Mode を World Space に変更
    • World Space にすることでメニューをワールド中に固定しておけるようになる
    • A world space Canvas with no specified Event Camera may not register UI events correctly と警告が出るが一応動く
  • メニューがおそらく大きすぎるのでUIの位置を調整する
  • Canvas の Layer を Default に変更する
    • 配下も一緒に変えますか?みたいなダイアログがでるので YES を選択
    • これを変えておかないと通常時に選択できないメニューになる(一敗)

Menu に UdonSharp スクリプトを追加

  • Menu に Udon Behavior コンポーネントを追加し スクリプトを追加する(前回記事でまとめた通り)
  • 以下のようにスクリプトを編集する
  • 外部から呼び出したい関数は public として宣言する
ClosableMenu.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class ClosableMenu: UdonSharpBehaviour
{

    public void Close()
    {

        this._canvas.SetActive(false);
    }

    void Start()
    {
        this._canvas = this.transform.Find("Canvas").gameObject;
    }

    private GameObject _canvas;
}

CloseButton を押すと Menu の関数が発火するように設定(本題)

  • CloseButton の Inspector から Button(Script) コンポーネントを確認
  • + ボタンをクリックしボタンを選択した際の処理を追加
  • None(Object) となっているところの右側のボタンをクリック
  • AssetタブからSceneタブに切り替えて Menu を選択
  • No Function となっているところを選択し UdonBehavior() > SendCustomEvent(string) を選択
  • 下の空欄となっている部分に Close と入力
  • 以下のようになっていたらOK(「ChairWithMenu」となっている部分は「Menu」になるはず)

SendCustomEvent ってなんじゃ

  • UdonBehavior というコンポーネントを通じてのみやり取り可能
  • そのため自分で宣言したクラスの関数を直接発火させることができない
  • UdonBehavior さんに「うちのカスタムクラスの〇〇って関数を発火させてください!」と頼む感じ
    • 存在を担保できない呼び出し方で気持ち悪いね...

わからないこと

  • そもそも本当に UdonBehavior() ではなく ClosableMenu にアクセスできないのか?
    • ClosableMenu にアクセスできるなら関数の存在を担保しながらボタンから呼び出せるはず
    • UdonSharpかUdonそのものの制約?
  • UdonSharp で追加した関数に引数を渡すことはできる?
    • 変数の持ちまわし方がよくわからない...
    • シングルトンでマネージャクラスを宣言して持ちまわす?

参考