2016-12-30 5 views
12

पर क्लिक/टच ईवेंट का पता लगाने के लिए कैसे एंड्रॉइड में टच पर कैनवास पर UI ऑब्जेक्ट का पता लगाने के लिए?UI और GameObjects

उदाहरण के लिए, मैं एक कैनवास है कि इस तरह के

Image, RawImage, Buttons, InputField और इतने पर के रूप में 5 वस्तुओं की है।

जब मैं बटन UI ऑब्जेक्ट पर स्पर्श करता हूं तो कुछ करें।

प्रत्येक बटन निर्भर करते समय क्लिक करते समय अलग-अलग प्रक्रिया करता है।

void Update() 
{ 
    if (Input.touches.Length > 0) 
    { 
     for (int i = 0; i < Input.touchCount; i++) 
     { 
      if (Button1.touch) 
      { 
       if (Input.GetTouch(i).phase == TouchPhase.Began) 
       { 
        // Call a Function 
        login(); 
       } 
      } 
      else if (Button2.touch) 
      { 
       if (Input.GetTouch(i).phase == TouchPhase.Began) 
       { 
        // Call a Function 
        LogOut(); 
       } 
      } 
     } 
    } 
} 

तो कैसे यह करने के लिए: जैसे

कोड लग जाएगा?

दूसरा: Gameobject का पता लगाने के लिए कैसे स्पर्श करें? क्या यह उपर्युक्त है या नहीं?

उत्तर

23

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

:

इन नए UI घटकों पर घटनाओं का पता लगाने के लिए उचित तरीके हैं। 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. का उपयोग उदाहरण के लिए, तो बटन नीचे और नहीं बटन क्लिक करें, IPointerDownHandler का उपयोग करें और इसकी OnPointerDown विधि 1 से कार्य करें।

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

} 

कोई नहीं यूआई OBJECTS:

.For 3 डी ऑब्जेक्ट (मेष रेंडरर/किसी भी 3 डी कोलाइडर)

कैमरा करने के लिए 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 
} 

.For 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 
} 
+0

हाय @ प्रोग्रामर। यदि मैं इनपुट एपीआई का उपयोग नहीं करता हूं तो मोबाइल उपयोग स्पर्श के बाद से मोबाइल में यह कैसा चल रहा है? धन्यवाद –

+1

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

+0

सार्वजनिक शून्य ऑनपोइंटरक्लिक (पॉइंटरएवेंटडाटा इवेंटडाटा) तो यह काम मोबाइल स्पर्श है? मुझे इसका एहसास नहीं है क्योंकि मैं इसका भी उपयोग कर रहा हूं। हाहा .. –

2

आप अपने UI तत्व पहले से ही इन Events तुम सिर्फ है विशिष्ट घटना पर method/Function पारित करने के लिए है कि करने के लिए एक EventTrigger componenet जोड़ सकते हैं।

+0

धन्यवाद में अनावश्यक कार्यों की मात्रा को कम करने जैसा है मुझे लगता है कि यह मिला। –

1

आप ऑनमहाउसडाउन का भी उपयोग कर सकते हैं। OnMouseDown को तब कहा जाता है जब उपयोगकर्ता ने GUIElement या Collider के दौरान माउस बटन दबाया है। यह घटना कोलाइडर या GUIElement की सभी स्क्रिप्ट पर भेजी जाती है।

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour 
{ 
    void OnMouseDown() 
    { 
     Application.LoadLevel("SomeLevel"); 
    } 
} 
संबंधित मुद्दे