Unity UGUIのEventSystem(イベントシステム)コンポーネントの紹介と使い方
1. EventSystem コンポーネントとは何ですか?
EventSystem は Unity UGUI の重要なコンポーネントであり、クリック、ドラッグ、スクロールなどのユーザー入力イベントを処理するために使用されます。ユーザー入力イベントを適切な UI 要素に渡し、対応するイベント コールバック関数をトリガーする役割を果たします。
2. EventSystem コンポーネントの仕組み
EventSystem コンポーネントは、光線検出を使用してユーザー入力イベントが発生する場所を特定し、そのイベントを最も適切な UI 要素に配信します。UI要素の階層関係と光線検出の結果に基づいて、イベントの対象オブジェクトを決定します。
3. EventSystem コンポーネントの共通プロパティ
firstSelectedGameObject
: デフォルトで選択されている UI 要素を設定します。sendNavigationEvents
: ナビゲーション イベントを送信するかどうか。pixelDragThreshold
: ドラッグ イベントのピクセルしきい値。currentInputModule
: 現在使用されている入力モジュール。
4. EventSystem コンポーネントのよく使用される機能
SetSelectedGameObject(GameObject selected)
: 現在選択されている UI 要素を設定します。RaycastAll(PointerEventData eventData, List<RaycastResult> resultAppendList)
: 光線検出を実行し、結果を指定されたリストに保存します。UpdateModules()
: 入力モジュールを更新します。
5. 完全なサンプルコード
例 1: デフォルトで選択されているボタンを設定する
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DefaultButton : MonoBehaviour
{
public Button defaultButton;
void Start()
{
EventSystem.current.SetSelectedGameObject(defaultButton.gameObject);
}
}
手順:
- 空のオブジェクトを作成し、それに DefaultButton スクリプトをアタッチします。
- 「インスペクター」パネルで、デフォルトで選択する必要があるボタンをdefaultButton変数に割り当てます。
例 2: ボタンをクリックしてイベントをトリガーする
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ButtonClick : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("Button clicked!");
}
}
手順:
- ボタンを作成し、ButtonClick スクリプトをそれにアタッチします。
- ButtonClick スクリプトに関数を実装し
OnPointerClick
、関数内で実行する必要があるコードを追加します。
例 3: オブジェクトのドラッグ
using UnityEngine;
using UnityEngine.EventSystems;
public class DragObject : MonoBehaviour, IDragHandler
{
public void OnDrag(PointerEventData eventData)
{
transform.position = eventData.position;
}
}
手順:
- オブジェクトを作成し、それに DragObject スクリプトをアタッチします。
- DragObject スクリプトに関数を実装し
OnDrag
、関数内のオブジェクトの位置を変更します。
例 4: スクロールリスト
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class ScrollList : MonoBehaviour, IScrollHandler
{
public ScrollRect scrollRect;
public void OnScroll(PointerEventData eventData)
{
scrollRect.verticalNormalizedPosition += eventData.scrollDelta.y * 0.1f;
}
}
手順:
- スクロール リストを作成し、それに ScrollList スクリプトを添付します。
- ScrollList スクリプトに関数を実装し
OnScroll
、関数内のスクロール リストの位置を変更します。
例 5: ボタンのナビゲーション
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Navigation : MonoBehaviour, ISelectHandler
{
public Button nextButton;
public void OnSelect(BaseEventData eventData)
{
EventSystem.current.SetSelectedGameObject(nextButton.gameObject);
}
}
手順:
- 複数のボタンを作成し、それらにナビゲーション スクリプトをアタッチします。
- ナビゲーション スクリプトに関数を実装し
OnSelect
、次に選択されたボタンを関数に設定します。
予防
- EventSystem コンポーネントは 1 つだけ存在でき、複数の EventSystem があると入力イベントが正常に処理されなくなります。
- EventSystem コンポーネントは、Button、ScrollRect などの他の UI コンポーネントと組み合わせて使用する必要があります。
参考文献
- Unity公式ドキュメント: EventSystem
- Unity公式チュートリアル:UIイベントシステム