しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

Unity の UI Toolkit でボタンにイベントハンドラを設定する

※ これは 2021/09/10 時点の Unity 2021.2.0b11 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

前回に引き続き Unity の UI Toolkit を試す

今回は追加したボタンをクリックしたときのイベントハンドラを設定してみる

Button のクリック検出

XAML でいうとことろのコードビハインド的な部分

やることは単純、MainView.cs を下記のように修正

using UnityEngine;
using UnityEngine.AI;
using UnityEngine.InputSystem;
using UnityEngine.UIElements;

public class MainView : MonoBehaviour
{
    [SerializeField]
    private GameObject tapEffect = null;

    [SerializeField]
    private GameObject agentPrefab = null;

    [SerializeField]
    private Cat cat = null;

    [SerializeField]
    private Cat chaser = null;

    [SerializeField]
    private UIDocument uIDocument = null;

    private NavMeshAgent catAgent = null;
    private NavMeshAgent chaserAgent = null;
    private Button button = null;

    public void Start()
    {
        // NavMeshAgent を生成し、ねこキャラと連携させる
        this.catAgent = Instantiate(this.agentPrefab, this.cat.transform.position, Quaternion.identity, this.transform)
            .GetComponent<NavMeshAgent>();
        this.chaserAgent = Instantiate(this.agentPrefab, this.chaser.transform.position, Quaternion.identity, this.transform)
            .GetComponent<NavMeshAgent>();

        // 白ねこは速く
        this.catAgent.speed = 3.5f;
        this.catAgent.angularSpeed = 120f;
        this.catAgent.acceleration = 8f;

        // トラねこは遅く
        this.chaserAgent.speed = 2f;
        this.chaserAgent.angularSpeed = 60f;
        this.chaserAgent.acceleration = 4f;

        this.cat.Agent = this.catAgent;
        this.chaser.Agent = this.chaserAgent;

        // UIDocument から Button を取得してイベントハンドラを設定
        this.button = this.uIDocument.rootVisualElement.Query<Button>().First();
        this.button.clicked += OnButtonClicked;
        this.button.text = "Not clicked";
    }

    private void OnButtonClicked()
    {
        this.button.text = "Clicked";
    }

    public void Update()
    {
        // ねこキャラを追いかけさせる
        this.chaser.Agent.SetDestination(this.cat.transform.position);
    }

    public void OnFire(InputAction.CallbackContext context)
    {
        var target = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
        this.cat.Agent.SetDestination(target);

        // タップ跡を表示
        var effect = Instantiate(this.tapEffect, (Vector2)target, Quaternion.identity, this.transform);

        // 1秒後に消滅
        Destroy(effect, 1f);
    }
}

変更したのは Start() の最後に UIDocument から Button を取得、イベントハンドラを設定するところと、OnButtonClicked()イベントハンドラだけ

ボタンが押される前はラベルが「Not clicked」、押されたら「Clicked」になるというもの

あとは MainView.uIDocumentSerialize FieldUIDocument を差すだけ

UIDocument を差す

これでお試し実行

ボタンのクリック検出

できたできた