2016-12-30 1 views
12

Android에서 Touch on Canvas에서 UI 개체를 검색하는 방법은 무엇입니까?UI 및 GameObjects에서 클릭/터치 이벤트를 감지하는 방법

예를 들어, 나는 그런 등등

Image, RawImage, Buttons, InputField 등 5 개체가 캔버스가 있습니다.

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가 터치를 감지하는 방법? 위와 동일합니까?

답변

23

새 UI에 입력 API를 사용하지 마십시오. UI 이벤트에 가입하거나 이벤트에 따라 인터페이스를 구현합니다.

1 :

는 새로운 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"); 
    } 
} 

2. Button 구성 요소 :

당신은 버튼 클릭에 등록 이벤트를 사용

당신이 다음 예를 들어 방법 1. 사용하는 버튼에 버튼을 클릭 이외의 무언가를 감지하는 경우
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(); 
} 

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

이 카메라에 PhysicsRaycaster 추가 6 .FOR 3D 개체 (메쉬 렌더러/어떤 3D 충돌 장치)가 다음 어떤을 사용 방법 1의 이벤트 중.

아래 코드는 Camera에 자동으로 PhysicsRaycaster을 추가합니다.

이 카메라에 Physics2DRaycaster 추가

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 .FOR 2D 개체 (스프 렌더/어떤 2D 인 LHC는) 다음 방법 1에서 이벤트 중 하나를 사용하십시오.

아래 코드는 Camera 메인에 Physics2DRaycaster을 자동으로 추가합니다.

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

안녕하세요 @ 프로그래머. 터치처럼 입력 API를 사용하지 않으면 모바일 사용이 터치 된 이후로 모바일에 어떻게 들어가게 될까요? 감사합니다. –

+1

UI API는 모바일과 데스크톱 모두에서 작동합니다. 그것은 그것의 좋은면이고 이것은 전혀 문제가되지 않습니다. 잠시 후 다른 3D (Mesh Renderer/Collider)와 2D (Sprite/2D Collider)를 포함하도록 업데이트하겠습니다. – Programmer

+0

public void OnPointerClick (PointerEventData eventData) 이것은 모바일 터치입니까? 내가 그것을 사용하고 있기 때문에 나는 그것을 깨닫지 못한다. 하하 .. –

2

당신은 이미 당신은 그냥이이 Events는 특정 이벤트에 method/Function을 통과해야 귀하의 UI 요소에 EventTrigger Componenet를 추가 할 수 있습니다.

+0

감사합니다. 나는 그것을 얻었다고 생각한다. –

1

OnMouseDown도 사용할 수 있습니다. OnMouseDown은 GUIElement 또는 Collider를 통해 사용자가 마우스 버튼을 눌렀을 때 호출됩니다. 이 이벤트는 Collider 또는 GUIElement의 모든 스크립트로 전송됩니다.

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour 
{ 
    void OnMouseDown() 
    { 
     Application.LoadLevel("SomeLevel"); 
    } 
} 
관련 문제