2016-12-30 17 views
12

Cách phát hiện đối tượng UI trên Canvas on Touch trong Android?Cách phát hiện các sự kiện nhấp/chạm trên giao diện người dùng và GameObjects

Ví dụ, tôi có một canvas có 5 đối tượng như

Image, RawImage, Buttons, InputField và vân vân.

Khi tôi chạm vào đối tượng Giao diện người dùng nút Sau đó, hãy thực hiện điều gì đó.

Mỗi nút thực hiện quá trình khác nhau khi được nhấp tùy thuộc.

Mã sẽ được như sau:

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

Vậy làm thế nào để làm điều đó?

Thứ hai: Cách phát hiện liên lạc Gameobject? Có giống như vậy ở trên hay không?

Trả lời

23

Bạn không sử dụng API đầu vào cho giao diện người dùng mới. Bạn đăng ký các sự kiện giao diện người dùng hoặc triển khai giao diện tùy thuộc vào sự kiện.

Đây là những cách thích hợp để phát hiện các sự kiện trên các thành phần giao diện người dùng mới:

. Image, RawImageText Thành phần:

Triển khai giao diện cần thiết và ghi đè chức năng của nó. Ví dụ bên dưới triển khai các sự kiện được sử dụng nhiều nhất.

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

Bạn sử dụng các sự kiện để đăng ký để nhấp chuột 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(); 
    } 
} 

Nếu bạn đang phát hiện một cái gì đó khác hơn Nút Bấm vào nút sau đó sử dụng phương pháp 1. Ví dụ, nút nút xuống và không Click, sử dụng IPointerDownHandler và chức năng OnPointerDown của nó từ phương pháp 1.

. InputField Component:

Bạn sử dụng các sự kiện để đăng ký để đăng ký InputField nộp:

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 phần:

Để phát hiện khi thay đổi giá trị thanh trượt trong suốt kéo:

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

Đối với các sự kiện khác, sử dụng Phương pháp 1.

.Dropdown Component

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

} 

NONE ĐỐI TƯỢNG UI:

.Đối 3D Object (Mesh Renderer/bất kỳ Collider 3D)

Thêm PhysicsRaycaster vào Thư viện ảnh sau đó sử dụng bất kỳ của các sự kiện từ Phương pháp 1.

Mã bên dưới sẽ tự động thêm PhysicsRaycaster vào chính 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 
} 

.Đối 2D Object (Sprite Renderer/bất kỳ 2D Collider)

Thêm Physics2DRaycaster vào Thư viện ảnh sau đó sử dụng bất kỳ sự kiện từ Phương pháp 1.

Mã bên dưới sẽ tự động thêm Physics2DRaycaster vào chính 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

Xin chào @Programmer. Nếu tôi không sử dụng API đầu vào như chạm vào thì nó sẽ hoạt động như thế nào trong thiết bị di động kể từ khi sử dụng điện thoại di động? Cảm ơn –

+1

API UI có nghĩa là hoạt động trên cả thiết bị di động và máy tính để bàn. Đó là mặt tốt của nó và đây không phải là vấn đề gì cả. Tôi sẽ cập nhật điều này để bao gồm 3D khác (Mesh Renderer/Collider) và 2D (Sprite/2D Collider) trong một thời điểm. – Programmer

+0

public void OnPointerClick (PointerEventData eventData) Vì vậy, đây là công việc là điện thoại di động liên lạc? Tôi không nhận ra nó vì tôi cũng đang sử dụng nó. Haha .. –

2

Bạn có thể thêm một componenet EventTrigger đến các yếu tố giao diện người dùng của bạn mà đã có những Events bạn chỉ phải vượt qua method/Function về sự kiện cụ thể.

+0

Cảm ơn Tôi nghĩ là có. –

1

Bạn cũng có thể sử dụng OnMouseDown. OnMouseDown được gọi khi người dùng nhấn nút chuột trong khi trên GUIElement hoặc Collider. Sự kiện này được gửi tới tất cả các kịch bản của Collider hoặc GUIElement.

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour 
{ 
    void OnMouseDown() 
    { 
     Application.LoadLevel("SomeLevel"); 
    } 
} 
Các vấn đề liên quan