UnityでEventSystemを操作します。 UIを使用する際の基本的なこと

みなさんこんにちは! 私は長い間何も書いていませんでしたが、今では多くの人が知らない非常に便利なことについて話したいと思いました。 これはUnityのイベントシステムです。 多くの場合、EventSystemが非常に便利なタスクには、通常のRaycastを使用します。 EventSystem機能の一部(実際には多くあります)の使用方法と、このツールを使用して、インターフェイスおよびオブジェクトのイベント処理に関連する多くの問題を迅速に解決する方法について説明します。 例のあるリポジトリの場合と同様。 興味があれば、猫へようこそ!







この記事では、イベントIPointerEnterHandler、IPointerExitHandler、IPointerDownHandler、IPointerUpHandler、IPointerClickHandler、IDragHandler、IBeginDragHandler、IEndDragHandlerのイベントを分析し、例を提供します(イベントの完全なリストはここにあります )。



EventSystemとは何ですか? EventSystemは、シーン内のさまざまなイベントを処理するシステムです。 基本的に、次のことができます。





より詳細に、この記事では3番目のポイントを分析します。これは最も簡単で使いやすいためです。



EventSystemのreykastovの観点から、3つの主要なコンポーネントにアクセスできます。





物理学であろうとUIであろうと、すべての相互作用の重要な詳細は、EventSystemオブジェクトがシーンに存在することです。







最も単純なものから始めましょう-UIシステムです。 EventSystemは、最も簡単かつ最適に機能します。 実際、Canvasを作成すると、ユニットはEventSystem自体やGraphic Raycasterなど、必要なすべてのコンポーネントをすぐにシーンに追加します。



UIの場合、イベントシステムにより、独自のボタンやさまざまなUI要素との基本的な相互作用を簡単に作成できます。 たとえば、IPointerEnterHandler、IPointerExitHandler、IPointerDownHandler、IPointerUpHandler、IPointerClickHandler、IDragHandler、IBeginDragHandler、IEndDragHandlerを分析します。



UI要素がマウスカーソルの入力イベント(IPointerEnterHandler)、出力(IPointerExitHandler)に応答するには、これらのインターフェイスを必要なオブジェクトに実装する必要があります。 これは、多くの場合、何かを選択したり、ハイライトしたりする必要があるときに役立ちます。 テストシーンと画像を例として使用すると、数行のコードで次のようなやり取りを行うことができます。



public void OnPointerEnter(PointerEventData eventData) { _Image.color = Color.blue; } public void OnPointerExit(PointerEventData eventData) { _Image.color = Color.white; }
      
      









UI要素をクリックするイベントを処理するために、IPointerDownHandlerとIPointerUpHandlerの2つのインターフェイスがあります。



それらの実装により、モバイルプラットフォームでマウスまたは手押し車でオブジェクトをクリックするイベントを便利に処理できます。



  public void OnPointerDown(PointerEventData eventData) { _Image.color = Color.green; } public void OnPointerUp(PointerEventData eventData) { _Image.color = Color.red; }
      
      









EventSystemは、UIシステムの任意のコンポーネント(RaycastTargetなど)で動作します。 たとえば、TextおよびIPointerClickHandlerクリックイベント(このイベントはIPointerUpHandlerに似ています。つまり、マウスが発生したときに発生しますが、違いは、カーソルの「リリース」がオブジェクトの境界内で厳密に発生する必要があることです):



 using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; [RequireComponent(typeof(Text))] public class UITextExample : MonoBehaviour, IPointerClickHandler { private Text _Text; private bool _IsClicked; private void Start () { _Text = GetComponent<Text>(); } public void OnPointerClick(PointerEventData eventData) { _Text.text = _IsClicked ? "Hello there!" : "General Kenobi"; _IsClicked = !_IsClicked; } }
      
      









私の意見で最も興味深いイベントは、ドラッグを作成するのに便利なイベントです。 これは、IDragHandler、IBeginDragHandler、およびIEndDragHandlerのインターフェイスのセットです。 また、すべてが非常に簡単です。 視覚効果は処理方法に大きく依存しますが、これら3つのイベントを使用すると、数分でさまざまな相互作用を行うことができます。 移動する要素が異なるUI要素で構成されている場合、インタラクティブではない要素のRaycastTargetチェックボックスを無効にすることが重要です。 (重要:UIシステムの場合、マウス/タッチに関連付けられたすべてのイベントシステムメソッドに含まれるPointerEventDataのscreenPositionを使用する必要があります)



 public class UIDragExample : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler { [SerializeField] private Text _Text; public void OnDrag(PointerEventData eventData) { transform.position = eventData.pointerCurrentRaycast.screenPosition; } public void OnBeginDrag(PointerEventData eventData) { _Text.text = "You dragging!"; } public void OnEndDrag(PointerEventData eventData) { _Text.text = "Drag me!"; } }
      
      









一般に、UIシステム上のすべてのものは、実際には、イベントシステムの観点からいくつかの有用なものがありますが、それらについては今後の記事で説明できます。



物理オブジェクトの操作は、2つの点でのみ異なります。 まず、EventSystemオブジェクトが機能するようにステージ上にあることを注意深く監視する必要があります。 次に、すべてがコライダーと同じように機能するように、PhysicsRaycasterコンポーネントをメインカメラに掛ける必要があります。 残りはほとんど同じで、リポジトリにある簡単な例です。



一般的に、EventSystemはクールで便利なツールであり、通常のrakcastよりも何倍も高速に実行できます。 さらに、EventSystemには多くの便利な機能があります。たとえば、入力を再定義できる(たとえば、Leap Motionなどの特定のコントローラーに興味がある)など、これについては今後の記事で説明します。



ご清聴ありがとうございました!



All Articles