栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在UI和GameObjects上检测单击/触摸事件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在UI和GameObjects上检测单击/触摸事件

您不会在新的UI中使用Input API。您订阅UI事件或根据事件实现接口。

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

1

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

2

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 pre for button 1 Debug.Log("Clicked: " + button1.name);        }        if (buttonPressed == button2)        { //Your pre for button 2 Debug.Log("Clicked: " + button2.name);        }        if (buttonPressed == button3)        { //Your pre 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。例如,按下按钮而不单击按钮单击,请使用方法1中的按钮

IPointerDownHandler
及其
OnPointerDown
功能。

3

InputField
零件:

您使用事件进行注册以注册InputField提交:

public InputField inputField;void onEnable(){    //Register InputField Events    inputField.onEndEdit.AddListener(delegate { inputEndEdit(); });    inputField.onValueChanged.AddListener(delegate { inputValueChanged(); });}//Called when Input is submittedprivate void inputEndEdit(){    Debug.Log("Input Submitted");}//Called when Input changesprivate 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 changesvoid sliderCallBack(float value){    Debug.Log("Slider Changed: " + value);}void onDisable(){    //Un-Subscribe To Slider Event    slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });}

对于其他事件,请使用 方法1

5

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

非用户界面对象:

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

添加

PhysicsRaycaster
到摄像机,然后 使用方法1中的任何事件

以下代码将自动添加

PhysicsRaycaster
到main中
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}

7。 对于2D对象(Sprite Renderer /任何2D Collider)

添加

Physics2DRaycaster
到摄像机,然后 使用方法1中的任何事件

以下代码将自动添加

Physics2DRaycaster
到main中
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}

对EventSystem进行故障排除:

在UI,2D对象(Sprite Renderer /任何2D Collider)和3D对象(Mesh Renderer /任何3D
Collider)上未检测到点击:

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


进入 游戏对象 -–> 用户界面 - > 事件系统
。如果尚不存在,则会创建一个EventSystem。如果已经存在,Unity只会忽略它。


B .UI组件或带有UI组件的GameObject必须在之下

Canvas
。这意味着a
Canvas
必须是UI组件的父级。否则,EventSystem将无法运行,并且将无法检测到点击。

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


C。
如果这是3D对象,

PhysicsRaycaster
则未连接到相机。确保已将
PhysicsRaycaster
其连接到相机。有关更多信息,请参见上面的
#6


D。
如果这是2D对象,

Physics2DRaycaster
则未连接到相机。确保已将
Physics2DRaycaster
其连接到相机。有关更多信息,请参见上面的
#7


Ë
。如果这是您要检测与接口功能,如点击一个UI对象

OnBeginDrag
OnPointerClick
OnPointerEnter
和中提到的其它功能
#1 然后 与检测代码的脚本必须附加到UI对象 要检测点击。


F。 此外,如果这是您要检测点击的UI对象,请确保前面没有其他UI对象。如果您要检测点击的前面有另一个UI,它将阻止该点击。

要验证这不是问题,请禁用“画布”下的所有对象,但要检测的对象除外,请单击并查看其是否有效。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506851.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号