UI और GameObjects पर क्लिक / स्पर्श घटनाओं का पता लगाने के लिए कैसे


83

एंड्रॉइड में टच पर कैनवस पर यूआई ऑब्जेक्ट का पता कैसे लगाएं?

उदाहरण के लिए, मैं एक कैनवास है कि इस तरह के रूप में 5 वस्तुओं है Image, RawImage, Buttons, InputFieldऔर इतने पर।

जब मैं बटन 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();
    }
}

तो यह कैसे करना है?

दूसरा: गेमबजेक्ट का पता कैसे लगाएं? क्या इसके साथ भी ऐसा ही है?

जवाबों:


172

आप नए UI के लिए इनपुट API का उपयोग नहीं करते हैं। आप UI ईवेंट की सदस्यता लेते हैं या ईवेंट के आधार पर इंटरफ़ेस लागू करते हैं।

नए UI घटकों पर घटनाओं का पता लगाने के लिए ये उचित तरीके हैं:

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

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 सबमिट करने के लिए पंजीकरण करने के लिए घटनाओं का उपयोग करते हैं:

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

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 का उपयोग करें ।

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 OBJECTS:

6 .For 3 डी ऑब्जेक्ट (मेष रेंडरर / कोई 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। एफ 2 डी ऑब्जेक्ट (स्प्राइट रेंडरर / कोई 2 डी कोलाइडर)

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
}

ईवेंट सिस्टम का समस्या निवारण:

UI, 2D ऑब्जेक्ट्स (स्प्राइट रेंडरर / कोई 2D कोलाइडर) और 3D ऑब्जेक्ट्स (मेष रेंडरर / कोई 3D कोलाइडर) पर कोई क्लिक नहीं मिला:

A .Check कि आपके पास EventSystem है। EventSystem के बिना यह क्लिक का पता नहीं लगा सकता है। यदि आपके पास यह नहीं है, तो इसे स्वयं बनाएं।


GameObject पर जाएं ---> UI ---> इवेंट सिस्टम । यदि यह अभी तक मौजूद नहीं है तो यह एक EventSystem बना देगा। यदि यह पहले से मौजूद है, तो एकता इसे अनदेखा कर देगी।


बी । यूआई घटक या गेमऑबजेक्ट यूआई घटक के साथ होना चाहिए Canvas। इसका अर्थ है कि CanvasUI घटक का जनक होना चाहिए। इसके बिना, EventSystem कार्य नहीं करेगा और क्लिकों का पता नहीं लगाया जाएगा।

यह केवल UI ऑब्जेक्ट्स पर लागू होता है। यह 2D (स्प्राइट रेंडरर / कोई 2D कोलाइडर) या 3D ऑब्जेक्ट्स (मेश रेंडरर / कोई 3D कोलाइडर) पर लागू नहीं होता है।


C। यदि यह एक 3D ऑब्जेक्ट है, PhysicsRaycasterतो कैमरे से जुड़ा नहीं है। सुनिश्चित करें कि PhysicsRaycasterकैमरे से जुड़ा हुआ है। अधिक जानकारी के लिए ऊपर # 6 देखें ।


डी । यदि यह एक 2 डी ऑब्जेक्ट है, Physics2DRaycasterतो कैमरे से जुड़ा नहीं है। सुनिश्चित करें कि Physics2DRaycasterकैमरा से जुड़ा हुआ है। अधिक जानकारी के लिए ऊपर # 7 देखें ।


है.अगर यह एक यूआई वस्तु आप जैसे इंटरफेस कार्यों के साथ पर क्लिक का पता करना चाहते हैं OnBeginDrag, OnPointerClick, OnPointerEnterऔर में वर्णित अन्य कार्यों # 1 तब पता लगाने कोड के साथ स्क्रिप्ट यूआई वस्तु को संलग्न किया जाना चाहिए आप पर क्लिक करें पता लगाने के लिए चाहते हैं।


F। इसके अलावा, यदि यह एक UI ऑब्जेक्ट है जिस पर आप क्लिक का पता लगाना चाहते हैं, तो सुनिश्चित करें कि कोई अन्य UI ऑब्जेक्ट इसके सामने नहीं है। यदि आप जिस पर क्लिक करना चाहते हैं, उसके सामने एक और UI है, तो यह उस क्लिक को अवरुद्ध कर देगा।

यह सत्यापित करने के लिए कि यह समस्या नहीं है, कैनवस के तहत प्रत्येक ऑब्जेक्ट को अक्षम करें, जिसे आप क्लिक करना चाहते हैं, उसके बाद क्लिक करके देखें कि क्या यह काम करता है।


1
यूआई एपीआई मोबाइल और डेस्कटॉप दोनों पर काम करने के लिए है। यह इसका अच्छा पक्ष है और यह कोई मुद्दा नहीं है। मैं इसे एक क्षण में अन्य 3 डी (मेश रेंडरर / कोलाइडर) और 2 डी (स्प्राइट / 2 डी कोलाइडर) को शामिल करने के लिए अपडेट करूंगा।
प्रोग्रामर

1
जोड़ा गया स्लाइडर और 3 डी, 2 डी उदाहरण। यह वही है जो आपको अभी इनपुट सिस्टम या पुराने रेकास्ट तरीके से उपयोग करना चाहिए।
प्रोग्रामर

1
वह ग्रेट @प्रोग्रामर है। यह सब मुझे चाहिए धन्यवाद :)
डेनिस लियू

2
OnClick () इंटरफ़ेस से कोई फ़ंक्शन नहीं है। आप शायद मतलब है OnPointerClickजो IPointerClickHandlerइंटरफ़ेस का उपयोग करता है। कृपया मेरा जवाब फिर से पढ़ें। मेरे जवाब में सब कुछ डेस्कटॉप और मोबाइल पर काम करना चाहिए। मैंने कुछ उत्तर देखे हैं जो लोगों को OnPointerClickबटन घटक के लिए उपयोग करने के लिए कहता है । यह तो गलत है। यह काम करेगा लेकिन एक बग है जो वे नहीं जानते कि आप ऐसा कब करते हैं। बटन क्लिक करने पर पता लगाने के लिए, मेरे उत्तर में ईवेंट का उपयोग करें जो उपयोग करता है AddListerner। साथ बटन क्लिक का पता नहीं लगा OnPointerClickOnPointerClickअन्य घटकों के लिए है जो एक बटन नहीं है।
प्रोग्रामर

1
यह जानना उपयोगी होगा कि इन लिपियों को किस खेल में संलग्न करना है (या संलग्न नहीं करना है)। कुछ स्पष्ट (बटन) हैं, लेकिन क्या मैं उस वस्तु पर # 1 लगाने वाला हूं जिसे मैं क्लिक करना चाहता हूं? कैमरे पर? क्या # 7 मेरे गेम ऑब्जेक्ट या कैमरे पर जाता है? या यह कहीं और है?
17:96 पर meed96

5

आप EventTriggerअपने यूआई तत्वों में एक कॉम्पोनेनेट जोड़ सकते हैं जो पहले से ही आपके पास Eventsहैं बस आपको method/Functionविशिष्ट घटना पर पास करना होगा ।


धन्यवाद मुझे लगता है कि मिल गया।
डेनिस लियू

5

आप 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

    }
}

0

करो नहीं मोबाइल प्रदर्शन और बहु स्पर्श मुद्दों के लिए OnMouseDown का उपयोग ()।

यह कोड मल्टी-टच के लिए UI ऑब्जेक्ट्स पर काम करता है

मेरा उत्तर में, मैं का उपयोग करें छवि एक "के साथ तत्व बटन " टैग और यह एक है ButtonController एक साथ स्क्रिप्ट बटनडाउन () सार्वजनिक विधि है जब उपयोगकर्ता छवि तत्व को छू लेती है बुलाया जाना चाहिए कि।

नोट : छवि तत्व में 2 डी कोलाइडर है।

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class TouchScript : MonoBehaviour
{
    void Update()
    {
        PointerEventData pointer = new PointerEventData(EventSystem.current);
        List<RaycastResult> raycastResult = new List<RaycastResult>();

        foreach (Touch touch in Input.touches)
        {
            if(touch.phase.Equals(TouchPhase.Began))
            {
                pointer.position = touch.position;
                EventSystem.current.RaycastAll(pointer, raycastResult);

                foreach(RaycastResult result in raycastResult)
                {
                    if(result.gameObject.tag == "Button")
                    {
                        result.gameObject.GetComponent<ButtonController>().ButtonDown();
                    }              
                }
                raycastResult.Clear();
            }       
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.