Как обнаружить события click/touch в пользовательском интерфейсе и GameObjects

Как определить объект пользовательского интерфейса на Canvas on Touch в Android?

Например, у меня есть холст с 5 объектами, такими как Image, RawImage, Buttons, InputField и т.д.

Когда я касаюсь объекта 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();
    }
}

Итак, как это сделать?

Второе: как определить Gameobject получить прикосновение? Это то же самое с этим выше или нет?

Ответ 1

Вы не используете API ввода для нового пользовательского интерфейса. Вы подписываетесь на события пользовательского интерфейса или реализуете интерфейс в зависимости от события.

Это правильные способы обнаружения событий на новых компонентах пользовательского интерфейса:

1. Image, RawImage и 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. Например, кнопка "вниз", а не "Щелчок кнопки", используйте IPointerDownHandler и его функцию OnPointerDown из метода 1.

3. Компонент 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); });
}

Для других событий используйте метод 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)
{

}

Некоммерческие объекты:

6. Для 3D-объекта (Mesh Renderer/любой 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. Для 2D-объекта (Sprite Renderer/любой 2D-коллайдер)

Добавьте в Camera 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:

Не обнаружено кликов в пользовательском интерфейсе, 2D-объектах (Sprite Renderer/любой 2D-коллайдер) и 3D-объектах (Mesh Renderer/любой 3D-коллайдер):

.Проверить, что у вас есть EventSystem. Без EventSystem он не может обнаруживать клики на всех. Если у вас его нет, создайте его самостоятельно.


Перейдите в GameObject ---> UI ---> Event System. Это создаст EventSystem, если она еще не существует. Если он уже существует, Unity просто проигнорирует его.


B. Компонент пользовательского интерфейса или GameObject с компонентом пользовательского интерфейса должен находиться под Canvas. Это означает, что Canvas должен быть родительским компонентом пользовательского интерфейса. Без этого EventSystem не будет функционировать, и клики не будут обнаружены.

Это относится только к объектам пользовательского интерфейса. Это не относится к 2D (Sprite Renderer/любой 2D-коллайдер) или 3D-объектам (Mesh Renderer/любой 3D-коллайдер).


C. Если это 3D-объект, PhysicsRaycaster не подключен к камере. Удостоверьтесь, что PhysicsRaycaster подключен к камере. См. # 6 выше для получения дополнительной информации.


D. Если это 2D-объект, Physics2DRaycaster не подключена к камере. Убедитесь, что приложение Physics2DRaycaster подключено к камере. См. № 7 выше для получения дополнительной информации.


E. Если это объект пользовательского интерфейса, который вы хотите обнаружить, с помощью функций интерфейса, таких как OnBeginDrag, OnPointerClick, OnPointerEnter и других функций, упомянутых в # 1, тогда скрипт с кодом обнаружения должен быть прикреплен к этому объекту пользовательского интерфейса, который вы хотите обнаружить нажмите на.


F.Также, если это интерфейс объекта, который вы хотите, чтобы обнаружить клики, убедитесь, что ни один другой объект UI не находится перед ним. Если есть другой пользовательский интерфейс перед тем, который вы хотите обнаружить, нажмите, он будет блокировать этот клик.

Чтобы убедиться, что это не проблема, отключите каждый объект под Canvas, кроме того, который вы хотите обнаружить, нажмите, а затем посмотрите, работает ли его клик.

Ответ 2

Вы можете добавить EventTrigger Componenet к вашим элементам пользовательского интерфейса, которые уже имеют эти Events, вам просто нужно передать method/Function на конкретное событие.

Ответ 3

Вы также можете использовать OnMouseDown. OnMouseDown вызывается, когда пользователь нажимал кнопку мыши, находясь над GUIElement или 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

    }
}