您不会在新的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,它将阻止该点击。
要验证这不是问题,请禁用“画布”下的所有对象,但要检测的对象除外,请单击并查看其是否有效。



