unity C# Raycast 鼠标点击

Dra*_*ber 0 c# mouse click unity-game-engine raycasting

我真的花了一整天的时间研究 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???");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Pro*_*mer 5

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");
   }

}
Run Code Online (Sandbox Code Playgroud)

2 .现在,如果您要检测触摸的游戏对象只是一个 2D 纹理或精灵,则使用以下代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果你看看“Gunnar B.”的评论,你就会明白原因。我认为你不明白他在说什么。简而言之,他告诉您“RaycastHit”应该更改为“RaycastHit2D”。另外,“Physics.Raycast”应更改为“Physics2D.Raycast”。带有“2D”一词的表示“2D”。您这样做是因为您的游戏是 2D 而不是 3D。当您将它们更改为 2D 时,您必须对参数进行较小的修改。就是这样。 (2认同)