2016-12-30 37 views
12

如何在android上檢測觸摸屏上的UI對象?如何檢測用戶界面和GameObjects上的點擊/觸摸事件

例如,我有有5個的物體,如

ImageRawImageButtonsInputField等的畫布。

當我觸摸Button 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 get touch?是否與上述相同?

回答

23

您不使用新的UI的輸入API。您根據事件訂閱UI事件或實現接口。

這是正確的方式來檢測新的UI組件的事件:

Image,RawImageText組件:

實現所需的接口並覆蓋它的功能。下面的例子實現了最常用的事件。

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功能。

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

} 

NONE UI對象:

。對於3D對象(網格渲染器/任何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 
} 

。對於2D對象(精靈渲染器/任何2D撞機)

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

Hi @Programmer。如果我不使用輸入API,比如touch,它是如何在移動設備上使用touch的?謝謝 –

+1

UI API可以在移動設備和桌面上使用。這是它的好方面,這完全不是問題。我會更新它,以便在其中包括其他3D(網格渲染器/對撞機)和2D(雪碧/ 2D對撞機)。 – Programmer

+0

public void OnPointerClick(PointerEventData eventData)所以這是工作是手機觸摸?我也沒有意識到,因爲我也在使用它。哈哈.. –

2

您可以添加EventTrigger到組元已經有這些Events,你只需要在特定的事件傳遞method/Function你的UI元素。

+0

謝謝我覺得得到它。 –

1

您也可以使用OnMouseDown。當用戶在GUIElement或Collider上按下鼠標按鈕時,會調用OnMouseDown。該事件被髮送到Collider或GUIElement的所有腳本。

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour 
{ 
    void OnMouseDown() 
    { 
     Application.LoadLevel("SomeLevel"); 
    } 
} 
相關問題