首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测UI和GameObjects上的点击/触摸事件?

如何检测UI和GameObjects上的点击/触摸事件?
EN

Stack Overflow用户
提问于 2018-06-12 06:39:21
回答 2查看 0关注 0票数 0

如何检测Android上的触摸屏上的UI对象?

例如,我有一个包含5个对象的画布,如 ImageRawImageButtonsInputField等。

当我触摸Button UI对象然后做一些事情。

点击时,每个按钮都会执行不同的过程。

代码将如下所示:

代码语言:javascript
复制
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接触?是否与上述相同?

EN

回答 2

Stack Overflow用户

发布于 2018-06-12 14:42:46

你也可以使用OnMouseDown。当用户在GUIElement或Collider上按下鼠标按钮时,会调用OnMouseDown。该事件被发送到Collider或GUIElement的所有脚本。

代码语言:javascript
复制
using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void OnMouseDown()
    {
        Application.LoadLevel("SomeLevel");
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-12 16:20:07

你不使用新的UI的输入API。根据事件订阅UI事件或实现接口。

这些是检测新UI组件上的事件的正确方法:

1ImageRawImageText组件:

实现所需的接口并覆盖其功能。下面的例子实现了最常用的事件。

代码语言:javascript
复制
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");
    }
}

2Button零件:

使用事件来注册按钮点击次数:

代码语言:javascript
复制
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功能。

3InputField零件:

你使用事件来注册InputField提交:

代码语言:javascript
复制
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();
}

4Slider零件:

要在拖动过程中检测滑块值何时更改:

代码语言:javascript
复制
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

5Dropdown零件

代码语言:javascript
复制
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对象:

6.对于3D对象(网格渲染器/任何3D对撞机)

添加PhysicsRaycaster到相机,然后使用方法1中的任何事件

下面的代码将自动添加PhysicsRaycaster到主Camera

代码语言:javascript
复制
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.对于2D对象(Sprite渲染器/任何2D对撞机)

添加Physics2DRaycaster到相机,然后使用方法1中的任何事件

下面的代码将自动添加Physics2DRaycaster到主Camera

代码语言:javascript
复制
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
}

对EventSystem进行故障排除:

在UI,2D对象(Sprite渲染器/任何2D对撞机)和3D对象(网格渲染器/任何3D对撞机)上检测不到点击:

A。检查你是否有EventSystem。没有EventSystem,它根本无法检测点击。如果你没有它,请自己创建它。

转到GameObject ---> UI ---> 事件系统。如果它尚不存在,这将创建一个EventSystem。如果它已经存在,Unity就会忽略它。

B.具有UI组件的UI组件或游戏对象位于a下Canvas。这意味着Canvas必须是UI组件的父级。如果没有这个功能,EventSystem将无法运行,点击将不会被检测到。

这仅适用于UI对象。它并不适用于2D(精灵渲染器/任何2D撞机)或3D对象(网格渲染器/任何3D撞机)。

C。如果这是一个3D对象,PhysicsRaycaster则不会连接到相机。确保PhysicsRaycaster已连接到相机。有关更多信息,请参见上面的#6

D。如果这是一个2D对象,Physics2DRaycaster则不附加到相机。确保Physics2DRaycaster已连接到相机。有关更多信息,请参阅上面的#7

Ë。如果这是您要检测与接口功能,如点击一个UI对象OnBeginDragOnPointerClickOnPointerEnter和中提到的其它功能#1然后与检测代码的脚本必须附加到UI对象要检测点击。

F。另外,如果这是一个你想检测点击的UI对象,确保没有其他UI对象在它的前面。如果在要检测点击的前面有另一个用户界面,则会阻止该点击。

要验证这不是问题,请禁用Canvas下的每个对象,除了您想要检测的对象点击之后,再看看它是否可以点击。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档