web-dev-qa-db-ja.com

UIおよびGameObjectsでクリック/タッチイベントを検出する方法

AndroidのTouch on CanvasでUIオブジェクトを検出する方法は?

たとえば、ImageRawImageButtonsInputFieldなどの5つのオブジェクトを持つキャンバスがあります。

Button UIオブジェクトにタッチしたら、次に何かをします。クリックするたびに、各ボタンは異なるプロセスを実行します。

コードは次のようになります。

private void Update()
{
    if (Input.touches.Length <= 0) return;

    for (int i = 0; i < Input.touchCount; i++)
    {
        if (Button1.touch)
            if (Input.GetTouch(i).phase == TouchPhase.Began)
                login();
        else if (Button2.touch && Input.GetTouch(i).phase == TouchPhase.Began)
            LogOut();
    }
}

それでどうやってやるの?

2番目:Gameobjectがタッチを検出する方法上記と同じですか?

52
Dennis Liu

新しいUIには入力APIを使用しません。 UIイベントをサブスクライブするか、イベントに応じてインターフェイスを実装します。

これらは、新しいUIコンポーネントでイベントを検出する適切な方法です。

1 . ImageRawImage および Text コンポーネント:

必要なインターフェースを実装し、その機能をオーバーライドします。以下の例は、最もよく使用されるイベントを実装しています。

using UnityEngine.EventSystems;

public class ClickDetector : MonoBehaviour, IPointerDownHandler, IPointerClickHandler,
    IPointerUpHandler, IPointerExitHandler, IPointerEnterHandler,
    IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public void OnBeginDrag(PointerEventData eventData)
    {
        Debug.Log("Drag Begin");
    }

    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log("Dragging");
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("Drag Ended");
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Mouse Down: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("Mouse Enter");
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("Mouse Exit");
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        Debug.Log("Mouse Up");
    }
}

2 . Button コンポーネント:

イベントを使用して、ボタンクリックに登録します。

public class ButtonClickDetector : MonoBehaviour
{
    public Button button1;
    public Button button2;
    public Button button3;

    void OnEnable()
    {
        //Register Button Events
        button1.onClick.AddListener(() => buttonCallBack(button1));
        button2.onClick.AddListener(() => buttonCallBack(button2));
        button3.onClick.AddListener(() => buttonCallBack(button3));

    }

    private void buttonCallBack(Button buttonPressed)
    {
        if (buttonPressed == button1)
        {
            //Your code for button 1
            Debug.Log("Clicked: " + button1.name);
        }

        if (buttonPressed == button2)
        {
            //Your code for button 2
            Debug.Log("Clicked: " + button2.name);
        }

        if (buttonPressed == button3)
        {
            //Your code for button 3
            Debug.Log("Clicked: " + button3.name);
        }
    }

    void OnDisable()
    {
        //Un-Register Button Events
        button1.onClick.RemoveAllListeners();
        button2.onClick.RemoveAllListeners();
        button3.onClick.RemoveAllListeners();
    }
}

ボタンのボタンクリック以外の何かを検出する場合は、メソッド1を使用します。たとえば、ボタンクリックではなくボタンダウンの場合は、メソッド1のIPointerDownHandlerとそのOnPointerDown関数を使用します。

. InputField コンポーネント:

イベントを使用して登録し、InputField submitに登録します。

public InputField inputField;

void OnEnable()
{
    //Register InputField Events
    inputField.onEndEdit.AddListener(delegate { inputEndEdit(); });
    inputField.onValueChanged.AddListener(delegate { inputValueChanged(); });
}

//Called when Input is submitted
private void inputEndEdit()
{
    Debug.Log("Input Submitted");
}

//Called when Input changes
private void inputValueChanged()
{
    Debug.Log("Input Changed");
}

void OnDisable()
{
    //Un-Register InputField Events
    inputField.onEndEdit.RemoveAllListeners();
    inputField.onValueChanged.RemoveAllListeners();
}

4 . Slider コンポーネント:

ドラッグ中にスライダーの値が変化したことを検出するには:

public Slider slider;

void OnEnable()
{
    //Subscribe to the Slider Click event
    slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); });
}

//Will be called when Slider changes
void sliderCallBack(float value)
{
    Debug.Log("Slider Changed: " + value);
}

void OnDisable()
{
    //Un-Subscribe To Slider Event
    slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });
}

他のイベントについては、Method 1を使用します。

5 . Dropdown コンポーネント

public Dropdown dropdown;
void OnEnable()
{
    //Register to onValueChanged Events

    //Callback with parameter
    dropdown.onValueChanged.AddListener(delegate { callBack(); });

    //Callback without parameter
    dropdown.onValueChanged.AddListener(callBackWithParameter);
}

void OnDisable()
{
    //Un-Register from onValueChanged Events
    dropdown.onValueChanged.RemoveAllListeners();
}

void callBack()
{

}

void callBackWithParameter(int value)
{

}

非UIオブジェクト:

6。3Dオブジェクトの場合(メッシュレンダラー/任意の3Dコライダー)

PhysicsRaycasterをカメラに追加し、方法1のイベントのいずれかを使用します。

以下のコードは、PhysicsRaycasterをメインのCameraに自動的に追加します。

public class MeshDetector : MonoBehaviour, IPointerDownHandler
{
    void Start()
    {
        addPhysicsRaycaster();
    }

    void addPhysicsRaycaster()
    {
        PhysicsRaycaster physicsRaycaster = GameObject.FindObjectOfType<PhysicsRaycaster>();
        if (physicsRaycaster == null)
        {
            Camera.main.gameObject.AddComponent<PhysicsRaycaster>();
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    //Implement Other Events from Method 1
}

7。For 2D Object(Sprite Renderer/any 2D Collider)

Physics2DRaycasterをカメラに追加してから、方法1のイベントを使用します。

以下のコードは、Physics2DRaycasterをメインのCameraに自動的に追加します。

public class SpriteDetector : MonoBehaviour, IPointerDownHandler
{
    void Start()
    {
        addPhysics2DRaycaster();
    }

    void addPhysics2DRaycaster()
    {
        Physics2DRaycaster physicsRaycaster = GameObject.FindObjectOfType<Physics2DRaycaster>();
        if (physicsRaycaster == null)
        {
            Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    //Implement Other Events from Method 1
}

EventSystemのトラブルシューティング:

UI、2Dオブジェクト(スプライトレンダラー/任意の2Dコライダー)、および3Dオブジェクト(メッシュレンダラー/任意の3Dコライダー)でクリックが検出されない:

A。EventSystemがあることを確認します。 EventSystemがなければ、クリックをまったく検出できません。お持ちでない場合は、自分で作成してください。


GameObject--->UI--->Event Systemに移動します。これにより、EventSystemがまだ存在しない場合に作成されます。既に存在する場合、Unityはそれを無視します。


B。UIコンポーネントまたはUIコンポーネントを含むGameObjectは、Canvasの下になければなりません。これは、CanvasがUIコンポーネントの親でなければならないことを意味します。これがないと、EventSystemは機能せず、クリックは検出されません。

これはUIオブジェクトにのみ適用されます。 does n't 2D(スプライトレンダラー/任意の2Dコライダー)または3Dオブジェクト(メッシュレンダラー/任意の3Dコライダー)に適用されます。


C。3Dオブジェクトの場合、PhysicsRaycasterはカメラにアタッチされません。 PhysicsRaycasterがカメラに接続されていることを確認してください。詳細については、上記の#6を参照してください。


D。これが2Dオブジェクトの場合、Physics2DRaycasterはカメラに接続されません。 Physics2DRaycasterがカメラに接続されていることを確認してください。詳細については、上記の#7を参照してください。


E。これがUIオブジェクトである場合、OnBeginDragOnPointerClickOnPointerEnterなどのインターフェイス関数および#1次に検出コードを含むスクリプトをそのUIオブジェクトに添付する必要がありますクリックを検出する必要があります。


F。また、これがクリックを検出するUIオブジェクトである場合は、その前に他のUIオブジェクトがないことを確認してください。クリックを検出するUIの前に別のUIがある場合、そのクリックはブロックされます。

これが問題ではないことを確認するには、検出したいオブジェクト以外のすべてのオブジェクトをCanvasの下で無効にし、クリックが機能するかどうかを確認します。

107
Programmer

OnMouseDownも使用できます。 OnMouseDownは、ユーザーがGUIElementまたはCollider上でマウスボタンを押したときに呼び出されます。このイベントは、ColliderまたはGUIElementのすべてのスクリプトに送信されます。

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement; // The new load level needs this

public class ExampleClass : MonoBehaviour
{
    void OnMouseDown()
    {
        // Edit:
        // Application.LoadLevel("SomeLevel");
        // Application.LoadLevel() is depreciating but still works

         SceneManager.LoadScene("SomeLevel"); // The new way to load levels

    }
}
5
Jeffrey Lanters

これらのEventTriggerを既に持っているUI要素にEventsコンポーネントを追加できます。特定のイベントでmethod/Functionを渡すだけです。

4
waqas ali