【问题标题】:Unity touch/mouse collide instead of MouseDown()Unity 触摸/鼠标碰撞而不是 MouseDown()
【发布时间】:2019-09-19 10:27:19
【问题描述】:

我有一个精灵,在我检测到鼠标点击它的那一刻。

但是我确实需要检测手指或鼠标何时触摸或在精灵上移动,因为手指/鼠标点击事件将发生在屏幕上的其他位置而不是精灵顶部。

public class Hand : MonoBehaviour
{

    private void OnMouseDown()
    {
        if (Input.GetMouseButtonDown(0))
        {
            this.transform.gameObject.SetActive(false);
        }
    }
}

更新: 我试图检测到触摸精灵和鼠标按下但我没有点击按钮。我可以删除&& Input.GetMouseButtonDown(0),如果鼠标移过它就会起作用,但我希望鼠标/手指都放在精灵上并按下。

private void Update()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if (Physics.Raycast(ray, out hit, 1000) && Input.GetMouseButtonDown(0))
        hit.collider.GetComponent<Button>().onClick.Invoke();
}

【问题讨论】:

  • 您能否尝试重新表述您的问题,我很难理解您想要实现的目标。
  • 当然,我已经更新了问题。希望它更清楚一点。
  • 听起来如果触摸点移动,您需要从触摸点进行 RayCast。

标签: c# unity3d


【解决方案1】:

有两种可能的解决方案:

首先:不只是使用精灵,而是使用按钮并将其分配给世界空间画布,在 如果您将canva的事件相机分配给主相机,这种情况下的触摸应该可以工作。

第二个:如果你只想使用精灵,那么给它分配一个碰撞器,并使用光线投射

Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position); 
           if (Physics.Raycast(ray,out hit,1000))
                hit.collider.gameobject.GetComponent<Button>.onClick().Invoke();

编辑:如果您有一个按钮组件附加到您的精灵,上面的代码将起作用。如果不 就这样称呼吧

if(hit.collider.gameobject.GetComponenet<Sprite>())
   DoWhateverYouWant()

【讨论】:

  • 谢谢,我认为第二个选项最适合我的用例。为了清楚起见,我是否将Ray 附加到精灵的Update 上?
  • 首先,我已经编辑了我的答案,第二次为您解决问题。假设我们有一个名为“TouchController.cs”的脚本,您可以在其 UpdateFunction 中写下类似的逻辑。然后将此脚本附加到场景中的任何游戏对象,您应该在手机上启动它。因为它无法在您的 PC 上运行,还要确保您检查是否 TouchCount 大于 0
  • 不幸的是,我需要一个可以同时使用鼠标和触摸的解决方案
  • 我已经用我认为你所说的更新了我的问题。我添加了一个按钮组件
  • 您可以执行#If Unity_Android 之类的操作,然后使用 touch #endif 添加您的逻辑,然后您可以为您的鼠标位置添加普通代码。看看这个:docs.unity3d.com/Manual/PlatformDependentCompilation.html
【解决方案2】:

使用 EventSystem 接口检测任何类型的鼠标与 UI 元素的交互。

EventSystem 接口列出here

例如,如果您想检测鼠标何时悬停在精灵上,您可以像这样向精灵对象添加一个脚本:

using UnityEngine.EventSystems;
using UnityEngine;

public class MouseOverHandler: MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
   public void OnPointerEnter(PointerEventData data){
        Debug.Log("MouseEnter");
   }

   public void OnPointerExit(PointerEventData data){
        Debug.Log("MouseExit");
   }
}

请注意,EventSystem 与关联精灵画布上的光线投射器一起使用。因此,如果精灵彼此重叠,它们可以阻止光线投射,因此 PointEnter 事件只会在最上面的精灵上触发

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多