[Unity] UnityActionでYes/Noダイアログを簡単に流用しよう


ダイアログウィンドウを作ってはみたものの・・・

ダイアログのスクリプトに、メッセージやボタンを押したときの処理を記述したら共用したときに、ややこしくなる未来しかみえません。

だったら処理は呼び出し側で記述してしまいましょう

呼び出す側でテキストだけでなく、Yes/Noが押された時の処理も設定してしまおうということです。

そこでUnityActionの出番

UnityActionは、処理を登録することができます。関数を登録しておくと、好きなタイミングで呼び出すことができる便利なものです。



プロパティ例

   public TMPro.TextMeshProUGUI messageText;
   public UnityAction OkAction { get; set; }
   public UnityAction NoAction { get; set; }
UnityActionは、変数と同じように宣言すればオッケーです。

ボタンが押された時のコールバック例

    public void OnClick()
    {
        OkAction?.Invoke();
    }

    public void NoClick()
    {
        NoAction?.Invoke();
    }
呼び出しは、
OkAction();
だけでも良いのですが、ここではnullの場合もあるので
OkAction?.Invoke();
としています。
これだと、nullのときに何もせずに処理は素通りしてくれるので安心です。

呼び出し用の関数例

    /// <summary>
    /// 設定
    /// </summary>
    /// <param name="message">メッセージテキスト</param>
    /// <param name="okAction">OKアクション</param>
    /// <param name="noAction">NOアクション</param>
    public void Setup(string message, UnityAction okAction = null, UnityAction noAction = null)
    {
        messageText.SetText( message );
        OkAction = okAction;
        NoAction = noAction;
    }
この関数を使って呼び出してもらいます。
テキストとアクションを登録するだけですね。

呼び出し例

    confirmPanel.Setup("チュートリアルをスキップしますか?", () => Debug.Log("はいが押されました"), () => Debug.Log("いいえが押されました"));
こんな感じです。

もちろん、関数にすることもできます↓
    confirmPanel.Setup("チュートリアルをスキップしますか?", OnYes);

    void OnYes()
    {
        Debug.Log("はいが押されました");
    }
こんな感じです。



引数は使えないの?

宣言するときに指定することで引数が使えるようになります。
   public UnityAction OkAction { get; set; }
OkAction(value);
みたいに使えますよ。

こんな感じに

UnityActionを便利に活用してみましょう。

もちろん、System.Actionでも良いですよ。


0 件のコメント :

コメントを投稿