Klik-/aanraakgebeurtenissen detecteren in de gebruikersinterface en GameObjects

Hoe UI-object detecteren op Canvas on Touch in Android?

Ik heb bijvoorbeeld een canvas met 5 objecten zoals Image, RawImage, Buttons, InputFieldenzovoort.

Als ik het knop UI-object aanraak, doe dan iets. Elke knop voert een ander proces uit wanneer erop wordt geklikt, afhankelijk van.

De code ziet er als volgt uit:

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();
    }
}

Dus hoe doe je dat?

Tweede:
Hoe te detecteren Gameobject touch? Is het hetzelfde met dat hierboven of niet?


Antwoord 1, autoriteit 100%

U gebruikt de Input API niet voor de nieuwe gebruikersinterface. Je abonneert je op UI-evenementen of implementeert een interface, afhankelijk van het evenement.

Dit zijn de juiste manieren om gebeurtenissen op de nieuwe UI-componenten te detecteren:

1.Image, RawImageen TextComponenten:

Implementeer de benodigde interface en overschrijf de functie ervan. Het onderstaande voorbeeld implementeert de meest gebruikte evenementen.

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.ButtonComponent:

U gebruikt evenementen om u te registreren voor knopklikken:

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();
    }
}

Als u iets anders detecteert dan Button Click on the Button, gebruik dan methode 1. Bijvoorbeeld Button down en niet Button Click, gebruik IPointerDownHandleren de functie OnPointerDownvan methode 1.

3.InputFieldComponent:

U gebruikt evenementen om u te registreren om u te registreren voor InputField indienen:

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.SliderComponent:

Om te detecteren wanneer de waarde van de schuifregelaar verandert tijdens het slepen:

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); });
}

Gebruik voor andere evenementen Methode 1.

5.DropdownComponent

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)
{
}

NIET-UI-OBJECTEN:

6.Voor 3D-object (Mesh Renderer/elke 3D Collider)

Voeg PhysicsRaycastertoe aan de camera en gebruik een van de gebeurtenissen uit methode 1.

De onderstaande code voegt automatisch PhysicsRaycastertoe aan de hoofd 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.Voor 2D-object (Sprite Renderer/elke 2D Collider)

Voeg Physics2DRaycastertoe aan de camera en gebruik vervolgens een van de gebeurtenissen uit methode 1.

De onderstaande code voegt automatisch Physics2DRaycastertoe aan de hoofd 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
}

Problemen met het EventSystem oplossen:

Geen klikken gedetecteerd op gebruikersinterface, 2D-objecten (Sprite Renderer/elke 2D Collider) en 3D-objecten (Mesh Renderer/elke 3D Collider):

A.Controleer of je EventSystem hebt. Zonder EventSystem kan het helemaal geen klikken detecteren. Als je het niet hebt, maak het dan zelf aan.


Ga naar GameObject—> UI—> Evenementensysteem. Hiermee wordt een EventSystem gemaakt als het nog niet bestaat. Als het al bestaat, zal Unity het gewoon negeren.


B. De UI-component of GameObject met de UI-component moet zich onder een Canvasbevinden. Dit betekent dat een Canvashet bovenliggende element van de UI-component moet zijn. Zonder dit werkt EventSystem niet en worden er geen klikken gedetecteerd.

Dit is alleen van toepassing op UI-objecten. Het is nietvan toepassing op 2D (Sprite Renderer/elke 2D Collider) of 3D-objecten (Mesh Renderer/elke 3D Collider).


C.Als dit een 3D-object is, is PhysicsRaycasterniet aan de camera bevestigd. Zorg ervoor dat PhysicsRaycasterop de camera is aangesloten. Zie #6hierboven voor meer informatie.


D.Als dit een 2D-object is, is Physics2DRaycasterniet aan de camera bevestigd. Zorg ervoor dat Physics2DRaycasterop de camera is bevestigd. Zie #7hierboven voor meer informatie.


E.Als dit een UI-object is, wilt u klikken detecteren met de interfacefuncties zoals OnBeginDrag, OnPointerClick, OnPointerEnteren andere functies genoemd in #1en het script met de detectiecode moet worden gekoppeld aan dat UI-objectwaarop u wilt klikken.


F.Als dit een UI-object is waarop u klikken wilt detecteren, zorg er dan voor dat er geen ander UI-object voor staat. Als er een andere gebruikersinterface is voor degene waarop u een klik wilt detecteren, blokkeert deze die klik.

Om te controleren of dit niet het probleem is, schakelt u elk object onder het canvas uit, behalve het object waarop u klikken wilt detecteren, en kijkt u of klikken werkt.


Antwoord 2, autoriteit 3%

U kunt een EventTriggerComponenet toevoegen aan uw UI-elementen die deze Eventsal hebben, u hoeft alleen method/Functiondoor te geven voor een specifieke gebeurtenis .


Antwoord 3, autoriteit 2%

Je zou ook OnMouseDown kunnen gebruiken. OnMouseDown wordt aangeroepen wanneer de gebruiker de muisknop heeft ingedrukt terwijl hij zich boven het GUIElement of Collider bevindt. Deze gebeurtenis wordt verzonden naar alle scripts van de Collider of 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
    }
}

Other episodes