【Unity】イベントまとめ
Unityでイベントを扱うのは、WindowsFormsアプリと少し違います
いろいろなパターンをみていきましょう
シーン構成
いろいろなイベント登録方法
いずれも実行結果は同じになります
どの方法にも慣れておくことで、状況に応じて使い分けができるようになります
インスペクターでイベントを登録する
コード
ボタンを押された時に実行されるメソッド(イベントハンドラ)を作成します
このコードでは、コンソールにボタンをクリックしたと表示されることで動作を確認します
using UnityEngine;
public class EventTest : MonoBehaviour
{
public void TaskOnClick()
{
Debug.Log("ボタンをクリックした");
}
}
シーンの更新
空のゲームオブジェクトを作成して、スクリプトをアタッチします
スクリプトはコンポーネントの1つとして作成したゲームオブジェクトのコンポーネントリストに追加されます
ボタンクリック時のイベントの登録
同じ名前になっていますが(Buttonオブジェクトの名前は変更してもいいでしょう)、ButtonオブジェクトのButtonコンポーネントのイベント登録窓にメソッドを登録します
手順の動画
インスペクターを使わずにコードでイベントを登録する(GameObject.Findメソッドを使う)
上記のようにButtonコンポーネントでビジュアル的に登録せず、コードで同じことを行う方法です
WindowsFormsアプリでもそうですが、ビジュアルでの登録は、プログラミングの敷居を下げることを期待して設計されています
でも、コードで記述した方が管理がしやすいと時もあります
その場合のサンプルになりますので、状況に合わせて選択しましょう
コード
ボタンを押された時に実行されるメソッド(イベントハンドラ)を作成します
このコードでは、コンソールにボタンをクリックしたと表示されることで動作を確認します
using UnityEngine;
using UnityEngine.UI;
public class EventTest : MonoBehaviour
{
GameObject buttonObject;
void Start()
{
buttonObject = GameObject.Find("Button");
var button = buttonObject.GetComponent<Button>();
button.onClick.AddListener(TaskOnClick);
}
void TaskOnClick()
{
Debug.Log("ボタンをクリックした");
}
}
解説
buttonObject = GameObject.Find("Button");
GameObject.Find メソッドを使用して、シーン内の名前が “Button" であるゲームオブジェクトを検索し、buttonObject 変数に格納しています。この行で、ボタンオブジェクトへの参照を取得します。
var button = buttonObject.GetComponent<Button>();
buttonObject 変数から Button コンポーネントを取得し、それを button 変数に格納しています。Button コンポーネントはUnityのUIシステムでボタンの機能を提供します。
button.onClick.AddListener(TaskOnClick);
button がクリックされたときに実行されるイベントリスナーを設定しています。具体的には、ボタンがクリックされたときに TaskOnClick メソッドが呼び出されるようになります。
void TaskOnClick() メソッド
これはボタンがクリックされたときに実行されるメソッドです。メソッド内で "ボタンをクリックした"
というデバッグログメッセージを表示します。
インスペクターを使わずにコードでイベントを登録する(アウトレット接続を使う)
同じくButtonコンポーネントでビジュアル的に登録せず、コードで同じことを行う方法です
後述するアウトレット接続で、アタッチされているスクリプトにButtonのインスタンスを登録できます
コードがシンプルになります
コード
ボタンを押された時に実行されるメソッド(イベントハンドラ)を作成します
このコードでは、コンソールにボタンをクリックしたと表示されることで動作を確認します
using UnityEngine;
using UnityEngine.UI;
// MonoBehaviourを継承したEventTestクラスを定義
public class EventTest : MonoBehaviour
{
public Button button; // ボタンの参照をPublic変数で保持
void Start()
{
// ボタンがクリックされたときに実行されるメソッド(TaskOnClick)を登録
button.onClick.AddListener(TaskOnClick);
}
// TaskOnClickメソッドは、ボタンがクリックされたときに呼び出されます
void TaskOnClick()
{
// コンソールに"ボタンをクリックした"と表示
Debug.Log("ボタンをクリックした");
}
}
スクリプト内のイベント登録とそれに対応するメソッド呼び出しをラムダ式で置き換える場合、EventTest
クラスのStart
メソッドを以下のように修正します。
void Start()
{
button.onClick.AddListener(() => Debug.Log("ボタンをクリックした"));
}
この変更では、ラムダ式を使用してAddListener
メソッドに渡される匿名メソッドを定義します。ラムダ式() => Debug.Log("ボタンをクリックした")
は、イベントがトリガーされたときに実行されるコードを直接含んでおり、この特定のシナリオにおいてTaskOnClick
メソッドを不要にします。このアプローチは、全体のコードの量を減らし、イベントがトリガーされたときに実行されるアクションを直接示すことによって、イベントの登録(サブスクリプション)プロセスを簡素化します。
解説
public Button button;
このスクリプトで操作するボタンを指定するための公開された変数です。Unityエディター上でこのスクリプトをアタッチしたゲームオブジェクトから、ボタンを関連付けることができます。
Button型で宣言されています。この場合、ゲームオブジェクトをドラッグ&ドロップしたら、そのゲームオブジェクトが保持しているコンポーネントリストからButtonコンポーネントを探して、インスタンスをbuttonフィールドにアサインされることになります
button.onClick.AddListener(TaskOnClick);
button がクリックされたときに実行されるイベントリスナーを設定しています。具体的には、ボタンがクリックされたときに TaskOnClick メソッドが呼び出されるようになります。
void TaskOnClick() メソッド
これはボタンがクリックされたときに実行されるメソッドです。メソッド内で "ボタンをクリックした"
というデバッグログメッセージを表示します。
手順の動画
シーンの更新
空のゲームオブジェクトを作成して、スクリプトをアタッチします
スクリプトはコンポーネントの1つとして作成したゲームオブジェクトのコンポーネントリストに追加されます
ボタンクリック時のイベントの登録
同じ名前になっていますが(Buttonオブジェクトの名前は変更してもいいでしょう)、ButtonオブジェクトのButtonコンポーネントのイベント登録窓にメソッドを登録します
Unityのアウトレット接続とは
Unityのアウトレット接続(Outlet Connection)は、UnityのUI要素やコンポーネントに対して、スクリプトからアクセスするための参照を設定する機能です。これにより、スクリプトからUI要素やコンポーネントにアクセスし、それらを制御したり、データを更新したりすることができます。
アウトレット接続を行う手順は以下の通りです:
- Unityのエディタで、対象となるUI要素やコンポーネントを選択します。これは通常、シーンビューまたはヒエラルキービューで行います。
- Inspectorウィンドウで、選択したUI要素やコンポーネントのプロパティを表示します。
- スクリプトで使用するために、そのプロパティにアウトレットを接続するための変数を作成します。この変数は、スクリプト内で要素を参照するために使用されます。たとえば、ボタンを制御する場合、以下のような変数を宣言できます:
public Button myButton;
- Inspectorウィンドウの対象のUI要素やコンポーネントのプロパティ欄で、アウトレット接続を行います。これを行うには、変数名をドラッグ&ドロップしてUI要素やコンポーネントに割り当てます。または、プルダウンメニューから選択することもできます。
- アウトレットが正しく接続されたら、スクリプト内でその変数を使用してUI要素やコンポーネントを制御できます。たとえば、ボタンをクリックしたときに何かアクションを実行するコードを書くことができます。
アウトレット接続は、UnityのUI要素やコンポーネントとスクリプトの間で情報を受け渡すための重要な手法の一つです。これにより、ゲームオブジェクトの挙動や外観を動的に変更したり、ユーザーの入力に応答したりすることが可能になります
ディスカッション
コメント一覧
まだ、コメントがありません