Unity の UI Toolkit でボタンにイベントハンドラを設定する
※ これは 2021/09/10 時点の Unity 2021.2.0b11 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
前回に引き続き Unity の UI Toolkit を試す
今回は追加したボタンをクリックしたときのイベントハンドラを設定してみる
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.uIDocument
の Serialize Field
に UIDocument
を差すだけ
これでお試し実行
できたできた