【问题标题】:Unity C# Raycast Mouse ClickUnity C# Raycast 鼠标点击
【发布时间】:2016-05-01 20:59:37
【问题描述】:

我确实花了一整天的时间研究 Unity C# Raycasting 的光芒,但我没有什么可以展示的。我研究了教程、在线资源、堆栈溢出问题,甚至逐字复制了脚本,希望 Unity 最终能够识别我所有实际使用 Raycast 的尝试。下面是一个使用 Raycast 的脚本示例,它根本不适合我:

if (mouseDown) {
    print ("mouse is down");
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit)) {
        print ("response???");
    }
}

我觉得这应该可行……但事实并非如此。 mouseDown 正在正常工作,但是当我单击对象时,它拒绝确认从鼠标位置到对象的射线命中。我还应该提到该项目是二维的。有什么建议吗?

【问题讨论】:

  • 好吧,如果是 2D,你也应该使用 2D 光线投射。文档:docs.unity3d.com/ScriptReference/Physics2D.Raycast.html
  • 感谢@GunnarB 让我走上正轨。但是,真正让我困惑的是 raycast 函数的参数,我们将 RaycastHit 变量放在哪里?我不认为这是参数之一。另外,我对 layerMask 的用途以及最小和最大深度参数感到困惑。你能为我澄清一下吗?非常感谢您的帮助
  • 2D版本返回值所以你写RaycastHit2D hit = Physics2D.Raycast(...)。所有具有= something 的参数都是可选的,因此如果您的目的不需要,您不需要在其中放置一些东西。您将最喜欢只需要开始和方向。文档中的相应行可能是您需要的(也许方向不正确)。
  • 就是这条线RaycastHit2D hit = Physics2D.Raycast(transform.position, -Vector2.up);,我真的不能告诉你正确的方向是什么,因为这取决于你如何设置你的场景。如果没有从默认方向更改相机方向,我认为-Vector2.up 应该是正确的。如果你不能让它工作,也有可能是某些东西阻挡了光线投射,或者你的对象没有响应光线投射(例如,因为它没有对撞机,或者玩家所在的图层没有允许光线投射交互)。
  • Vector2D 没有forward。轴是默认的,所以 -up 应该这样做。否则你可以看看这个问题和前两个答案stackoverflow.com/questions/20583653/…

标签: c# unity3d click mouse raycasting


【解决方案1】:

1。如果您尝试检测触摸的对象是Image/Canvas,那么这不是执行此操作的方法。要使用 Image/Canvas 检测触摸,您必须从 IPointerDownHandlerIPointerClickHandler 派生,然后实现它们的功能。

public class YourClass : MonoBehaviour,IPointerDownHandler,IPointerClickHandler
{
   public void OnPointerClick(PointerEventData eventData)
   {
      Debug.Log("Clicked");
   }

   public void OnPointerDown(PointerEventData eventData)
   {
      Debug.Log("Down");
   }

}

2。现在,如果您要检测触摸的游戏对象只是 2D 纹理或 Sprite,请使用以下代码:

if (Input.GetMouseButtonDown(0))
{
    Vector2 cubeRay = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    RaycastHit2D cubeHit = Physics2D.Raycast(cubeRay, Vector2.zero);

    if (cubeHit)
    {
        Debug.Log("We hit " + cubeHit.collider.name);
    }
}

为此,您必须将 Collider2D 附加到 2D 纹理或 Sprite。通过重新调整对撞机的大小,确保对撞机覆盖 2D 纹理或 Sprite。由于这是一款 2D 游戏,因此您使用的任何 collider 都必须以 2D 结尾。例如,有一个 Box Collider 和一个 Box Collider 2D。您必须附上Box Collider 2D。到精灵/纹理。

3。如果 #2 不起作用,则您的项目被创建为 3D 而不是 2D >。删除项目,创建一个新项目并确保这次选择 2D。 #2 答案现在应该可以工作,只要将 2D collider 附加到它。

【讨论】:

  • 如果您查看Gunnar B.s cmets,您就会明白原因。我想你不明白他在说什么。简而言之,他告诉您应该将RaycastHit 更改为RaycastHit2D。另外Physics.Raycast 应更改为Physics2D.Raycast。带有2D 字样的是2D。你这样做是因为你的游戏是 2D 而不是 3D。当您将它们更改为 2D 时,您必须对参数进行较小的修改。就是这样。
  • 是的,我想我真的不明白 Gunnar B. 在说什么,直到你把它拼出来。我是 Unity 的新手,Unity C# 的这些简单方面并没有我想的那么容易。特别感谢@GunnarB。对我有耐心
  • @DrakeSwartzy 如果您遵循 youtube 上的 Unity 2D 项目教程并完成它,那么您将适合 2D 方面。该代码适用于 3D 而不是 2D。编码愉快!
  • 你真是个救命恩人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2018-06-29
  • 2019-03-21
  • 2014-09-26
  • 2011-04-29
相关资源
最近更新 更多