こんにちは、今日はUnityでUIのButtonクリック時に発生するイベントを設定する方法についてまとめていきます。
HierarchyウィンドウからCreate > UI > Buttonを選択や、メインメニューのGameObject > UI > Button等から追加できるものです。
目次
確認環境
Unity 2018.4.15f1
ButtonコンポーネントのOn Click ()項目から追加
メニューからボタンを作成すると、追加されたオブジェクトに最初からButtonコンポーネントが付与されています。
そのコンポーネントのプロパティにOn Click ()という項目があるので、そこからクリック時に呼び出す関数を設定可能です。
On Click ()の項目にあるプラスボタンを押すとイベントを追加できます。
None (Object)と表示されている欄にボタンクリック時に実行したい関数が定義されているクラスを持っているオブジェクトを設定します。
ここでは以下のような内容のスクリプトTestScript.csを作成し、作成したButtonに付与しました。
オブジェクトを設定するとNo Functionと表示されているプルダウンがアクティブになるので、その中から実行したい関数が定義されているクラス名から関数を設定します。
本記事の例ではTestScriptのTestButtonOnClick ()を選択します。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public void TestButtonOnClick()
{
Debug.Log("Test Button");
}
}
この状態で実行し、ボタンを押した時にConsoleにTest Buttonと表示されれば正常に設定が行えています。
以下のように引数も設定可能です。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public void TestButtonOnClick(int num)
{
Debug.Log("Test Button num = " + num);
}
}
スクリプトから追加する
スクリプトでボタンの参照を取得し、それに対してイベントの設定を行うこともできます。
以下のようなスクリプトを任意のアクティブなオブジェクトに追加し、InspectorからTest Buttonに作成したボタンを設定します。
この例ではボタンのクリックイベントにAddListener関数でTestButtonOnClick関数を追加しています。
ゲームを再生し、ボタンクリック時にConsoleにTest Buttonと出力されれば正常に設定できています。
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
[SerializeField]
Button testButton;
void Start()
{
testButton.onClick.AddListener(TestButtonOnClick);
}
public void TestButtonOnClick()
{
Debug.Log("Test Button");
}
}
引数付きの関数の場合は以下のような記述になります。
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
[SerializeField]
Button testButton;
void Start()
{
testButton.onClick.AddListener(() => TestButtonOnClick(1));
}
public void TestButtonOnClick(int num)
{
Debug.Log("Test Button num = " + num);
}
}
スクリプトから設定する場合は、関数を定義せずに直接以下のように設定することもできます。
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
[SerializeField]
Button testButton;
void Start()
{
testButton.onClick.AddListener(() => Debug.Log("Test Button"));
}
}
注意点
複数のボタンに番号を振りつつイベントを設定していくような場合、以下のようなコードだと期待した動作となりません。
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
[SerializeField]
Button[] testButton;
void Start()
{
for(int i = 0; i < testButton.Length; i++)
{
testButton[i].onClick.AddListener(() => Debug.Log("Test Button " + i));
}
}
}
以下のように一時変数に格納し、その値を渡す必要があります。
using UnityEngine;
using UnityEngine.UI;
public class TestScript : MonoBehaviour
{
[SerializeField]
Button[] testButton;
void Start()
{
for(int i = 0; i < testButton.Length; i++)
{
int tmp = i;
testButton[i].onClick.AddListener(() => Debug.Log("Test Button " + tmp));
}
}
}
リンク
Button.onClick
https://docs.unity3d.com/ja/2018.4/ScriptReference/UI.Button-onClick.html
ラムダ式 (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions