- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何在 android 中检测 Canvas on Touch 上的 UI 对象?
例如,我有一个包含 5 个对象的 Canvas ,例如 Image
, RawImage
, Buttons
, InputField
等等。
当我触摸 Button 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();
}
}
最佳答案
您不会将 Input API 用于新 UI。根据事件订阅 UI 事件或实现接口(interface)。
以下是在新 UI 组件上检测事件的正确方法:
1 . Image
, RawImage
和 Text
组件:
实现所需的接口(interface)并覆盖其功能。下面的示例实现了最常用的事件。
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");
}
}
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 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();
}
}
IPointerDownHandler
及其
OnPointerDown
方法1的功能。
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();
}
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); });
}
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)
{
}
PhysicsRaycaster
到相机,然后使用方法 1 中的任何事件。
PhysicsRaycaster
到主要
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
}
Physics2DRaycaster
到相机,然后使用方法 1 中的任何事件。
Physics2DRaycaster
到主要
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
}
Canvas
下.这意味着
Canvas
必须是 UI 组件的父级。没有这个,EventSystem 将无法运行,也不会检测到点击。
PhysicsRaycaster
未连接到相机。确保
PhysicsRaycaster
附在相机上。有关更多信息,请参见上面的#6。
Physics2DRaycaster
未连接到相机。确保
Physics2DRaycaster
附在相机上。有关更多信息,请参见上面的 #7。
OnBeginDrag
等接口(interface)函数检测点击,
OnPointerClick
,
OnPointerEnter
和 #1 中提到的其他功能然后
带有检测代码的脚本必须附加到该 UI 对象 你想检测点击。
关于c# - 如何检测 UI 和 GameObjects 上的点击/触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46296118/
我对在编写 Unity 脚本时继承自 MonoBehaviour 的 gameObject 的使用有疑问。 在一些教程中,例如制作缩放的健康条,我们检索健康条的原始比例如下: originalScal
我有一个名为 trigger 的无敌 GameObject,当我的 Hero 与它碰撞时,一盏枝形吊灯会掉落。我想给枝形吊灯一个 Rigidbody,这样它就会掉落,您可以与它碰撞并使用它。 如果你能
我正在使用 Unity 开发一款游戏,其中所有带有特定标签的 Gameobjects 都会相当规律地消失/重新出现(平均每 10 秒一次)。我使用 GameObject.FindGameObjects
public void FindClosestEnemy() { List pList = GameObject.FindGameObjectsWithTag("Player");
我有两个像这样的 GameObject: public class GOA : MonoBehaviour { void Start() { ... do something
概览 考虑一个简单的硬币收集游戏。有两个脚本,CollectableItem 和 ItemVault。 CollectableItem 有一个 value 属性,它告诉项目的值(value),它被添加
我试图找出我的游戏对象正在被我的游戏中的哪个脚本破坏。 到目前为止,我尝试打印堆栈,但那里没有提到销毁游戏对象的脚本的详细信息 代码:Debug.Log(UnityEngine.StackTraceU
在 Unity3D 序列化 GameObject 之前是否有任何回调(或任何其他方式)通知? 我需要类似于 OnSerializeNetworkView 的东西但对于常规 GameObject。 有用
我正在使用 Unity 制作游戏。我在随机位置实例化 (circle) GameObjects 并且效果很好。我想要做的是仅在不会与其他 GameObjects 重叠的位置实例化。我在互联网上找到的解
我遇到了一个小问题。 我制作了一个 3D 立方体并设置了 GoogleVR SDK,以便在 VR 屏幕的中点进入立方体时使用事件触发器。发生这种情况时,将触发我的自定义方法 LookAtCube()。
我想获取某个文件夹中的所有预制件,然后将其转换为列表 我的代码: this.list = (List) (Resources.LoadAll("items")).ToList(); // this c
所以我的游戏世界中有三个不同的“旁观者”,每个都有一个附加的“旁观者”脚本,并且我的 UI 中有一个“旁观者对话”元素。这个想法是,当玩家进入任何旁观者的范围时,会显示从数据库中随机选择的文本,但对于
我正在编写我的游戏 Boss 行为代码,在战斗的最后阶段,Boss 应该向玩家冲锋,然后回到原来的位置。等待 5 秒,然后执行相同的操作。 我尝试使用协同程序和 Vector2.MoveTowards
总结如下:我想从 OnTriggerEnter2D 事件中找到参与碰撞的两个对撞机。我该怎么做? 我有两个游戏对象。两者都有一个碰撞器和一个触发器。 在对象 A 上,它被触发器包围。在对象 B 上,触
我目前有一个脚本应该实例化一个粒子系统并在一定时间后销毁它,但是在实例化对象之后,出现此错误代码: MissingReferenceException: The object of type 'Par
我目前有一个脚本应该实例化一个粒子系统并在一定时间后销毁它,但是在实例化对象之后,出现此错误代码: MissingReferenceException: The object of type 'Par
Unity 对象不在中心旋转。直到一个小时都很好,我不相信我更改了代码或任何东西。我也试过弄乱左上角的枢轴/中心按钮,但没有任何帮助。游戏对象没有在中间旋转。 旋转器代码: using UnityEn
我很难将一些游戏对象链接在一起以“跟随领导者”。 这就是我想要完成的: 有“头”对象的地方,它会拉动 body 对象。像蛇或蜈蚣。 然而,这是正在发生的事情: 它们都有点跟随头部,但它们似乎作为一个整
假设我的脚本定义如下。 public GameObject _GameObject; private void Start() { [![enter image description here][1
所以基本上我是在尝试将一群 child 添加到游戏对象中。父游戏对象称为 SnakeHead,而所有其他游戏对象称为 SnakeBodyParts public class GameControlle
我是一名优秀的程序员,十分优秀!