如何在Android上的Canvas on Touch上检测UI对象?
例如,我有一个画布,有5个对象,如 Image
, RawImage
, Buttons
, InputField
等 .
当我触摸按钮UI对象然后做一些事情 . 单击依赖时,每个按钮执行不同的过程 .
代码如下所示:
private void Update()
{
if (Input.touches.Length <= 0) return;
for (int i = 0; i < Input.touchCount; i++)
{
if (Button1.touch)
if (Input.GetTouch(i).phase == TouchPhase.Began)
login();
else if (Button2.touch && Input.GetTouch(i).phase == TouchPhase.Began)
LogOut();
}
}
那怎么办呢?
第二:如何检测Gameobject获取触摸?是否与上述相同?
3 回答
您不要将Input API用于新UI . 您可以根据事件订阅UI事件或实现界面 .
这些是检测新UI组件上事件的正确方法:
1 . Image,RawImage和Text组件:
实现所需的接口并覆盖其功能 . 下面的示例实现了最常用的事件 .
2 . Button组件:
您可以使用事件注册Button按钮:
如果您正在检测按钮以外的其他内容单击按钮然后使用方法1.例如,按下按钮而不是按钮单击,使用方法1中的
IPointerDownHandler
及其OnPointerDown
函数 .3 . InputField组件:
您使用事件注册以注册InputField提交:
4 . Slider组件:
要在拖动期间检测滑块值何时更改:
对于其他事件,请使用方法1 .
5 . Dropdown组件
NON-UI OBJECTS:
6 . 对于3D对象(网格渲染器/任何3D对撞机)
将
PhysicsRaycaster
添加到摄像机,然后使用方法1中的任何事件 .下面的代码会自动将
PhysicsRaycaster
添加到主Camera
.7 . 对于2D对象(Sprite渲染器/任何2D对撞机)
将
Physics2DRaycaster
添加到摄像机,然后使用方法1中的任何事件 .下面的代码会自动将
Physics2DRaycaster
添加到主Camera
.对EventSystem进行故障排除:
在UI,2D对象(Sprite渲染器/任何2D对撞机)和3D对象(网格渲染器/任何3D对撞机)上未检测到任何点击:
A . 检查您是否有EventSystem . 如果没有EventSystem,它可以拥有它,自己创建它 .
转到GameObject ---> UI ---> Event System . 如果它还不存在,这将创建一个EventSystem . 如果它已经存在,Unity将忽略它 .
B . 具有UI组件的UI组件或GameObject必须位于
Canvas
之下 . 这意味着Canvas
必须是UI组件的父级 . 如果没有这个,EventSystem将无法运行,也无法检测到点击 .这仅适用于UI对象 . 它 doesn't 适用于2D(精灵渲染器/任何2D碰撞器)或3D物体(网格渲染器/任何3D碰撞器) .
C . 如果这是3D对象,则
PhysicsRaycaster
未连接到相机 . 确保PhysicsRaycaster
已连接到相机 . 有关更多信息,请参见上面的#6 .D . 如果这是2D对象,则
Physics2DRaycaster
未连接到相机 . 确保Physics2DRaycaster
已连接到相机 . 有关更多信息,请参阅上面的#7 .E . 如果这是一个UI对象,你想通过界面函数检测点击次数,例如
OnBeginDrag
,OnPointerClick
,OnPointerEnter
和#1中提到的其他函数,然后 the script with the detection code must be attached to that UI Object 你要检测点击 .F . 另外,如果这是您要检测点击次数的UI对象,请确保其前面没有其他UI对象 . 如果您想要检测到的那个UI前面有另一个用户界面,则会阻止该点击 .
要验证这不是问题,请禁用Canvas下的每个对象,但要检测的对象除外,然后查看是否有效 .
您可以将
EventTrigger
Componenet添加到已经具有这些Events
的UI元素中,您只需要在特定事件上传递method/Function
.你也可以使用OnMouseDown . 当用户在GUIElement或Collider上按下鼠标按钮时,将调用OnMouseDown . 此事件将发送到Collider或GUIElement的所有脚本 .