Unity3d 如何检测单击了哪个游戏对象

Unity3d 如何检测单击了哪个游戏对象,unity3d,gameobject,Unity3d,Gameobject,我想知道在2D项目上用鼠标点击哪个游戏对象 我曾经 void Update() { if (Input.GetMouseButtonDown(0)) { clickTime = DateTime.Now; mousePosition = Input.mousePosition; Ray ray = Camera.main.ScreenPointToRay(Input.mousePo

我想知道在2D项目上用鼠标点击哪个游戏对象

我曾经

 void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            clickTime = DateTime.Now;
            mousePosition = Input.mousePosition;

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);

            if (hit != null && hit.collider != null)
            {


            }

        }
}

但在第二种情况下,它永远不会去

编辑:我正在处理一个脚本,并使用gameobject.FindGameObjectWithTag()从那里访问所有gameobject,据我所知,这就是为什么主脚本中的碰撞器代码没有触发。 我添加了一个截图,我的代码在GameObject中

使用光线投射时,应在精灵上设置一个碰撞器

private void Update()
{
   if (Input.GetMouseButtonDown(0))
   {
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);

      if (hit.collider != null) {
         Debug.Log ("CLICKED " + hit.collider.name);
      }
   }
}
这在unity 5.6中对我有效

注意:“LeftClick”只是一个“GameObject”而已,我这样称呼它是为了更好地识别:)


已编辑

我为UI按钮测试了这个方法,但它不起作用;所以我用了不同的方法。对于UI按钮,您可以添加如下侦听器:

GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {

});
public class MyObject : MonoBehaviour, IPointerDownHandler
{
    private void Start()
    {
        AddPhysics2DRaycaster();
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    private void AddPhysics2DRaycaster()
    {
        Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
        if (physicsRaycaster == null)
        {
            Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
        }
    }
}
GameObject.Find(“YourButtonName”).GetComponent().onClick.AddListener(()=>{
});

使用光线投射时,应在精灵上设置一个碰撞器

private void Update()
{
   if (Input.GetMouseButtonDown(0))
   {
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction);

      if (hit.collider != null) {
         Debug.Log ("CLICKED " + hit.collider.name);
      }
   }
}
这在unity 5.6中对我有效

注意:“LeftClick”只是一个“GameObject”而已,我这样称呼它是为了更好地识别:)


已编辑

我为UI按钮测试了这个方法,但它不起作用;所以我用了不同的方法。对于UI按钮,您可以添加如下侦听器:

GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {

});
public class MyObject : MonoBehaviour, IPointerDownHandler
{
    private void Start()
    {
        AddPhysics2DRaycaster();
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
    }

    private void AddPhysics2DRaycaster()
    {
        Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
        if (physicsRaycaster == null)
        {
            Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
        }
    }
}
GameObject.Find(“YourButtonName”).GetComponent().onClick.AddListener(()=>{
});

考虑使用
OnMouseOver()
方法():

此方法仅适用于连接到gameobject的碰撞器,就像Raycast一样

因为没有多个
Update()。如果你有几十个或几百个可点击的对象,一定要记住这一点


(尽管有报道称此方法不适用于多个摄像头,其中一个摄像头是ortographic one,在这种情况下,您不能选择此方法。)

考虑使用
OnMouseOver()
方法():

此方法仅适用于连接到gameobject的碰撞器,就像Raycast一样

因为没有多个
Update()。如果你有几十个或几百个可点击的对象,一定要记住这一点


(尽管有报道称此方法不适用于多个摄像头,其中一个是ortographic one,在这种情况下,此方法不适用于您。)

此方法在桌面和移动应用程序上都非常有效:

  • 向要检测其单击事件的每个对象添加碰撞器组件
  • 将脚本添加到项目中(将其命名为MyObject.cs)。 此脚本必须实现IPInterDownHandler接口及其方法。此脚本必须将Physics2DRaycaster添加到相机。这个脚本的整体可能是这样的:

    GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {
    
    });
    
    public class MyObject : MonoBehaviour, IPointerDownHandler
    {
        private void Start()
        {
            AddPhysics2DRaycaster();
        }
    
        public void OnPointerDown(PointerEventData eventData)
        {
            Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
        }
    
        private void AddPhysics2DRaycaster()
        {
            Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
            if (physicsRaycaster == null)
            {
                Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
            }
        }
    }
    
    公共类MyObject:MonoBehavior,IPInterDownHandler
    {
    私有void Start()
    {
    AddPhysics2DRaycaster();
    }
    POINTERDOWN上的公共无效(PointerEventData事件数据)
    {
    Log(“单击:”+eventData.pointercurrentrycast.gameObject.name);
    }
    私有void AddPhysics2DRaycaster()
    {
    Physics2DRaycaster physicraycaster=FindObjectOfType();
    如果(physicsRaycaster==null)
    {
    Camera.main.gameObject.AddComponent();
    }
    }
    }
    
  • 将MyObject.cs脚本添加到要检测的每个对象,然后单击它。之后,当您单击这些对象时,它们的名称将显示在控制台上

  • 确保项目层次结构中存在EventSystem。如果没有,请右键单击添加

  • p.S.MyObject.cs脚本现在具有IPInterDownHandler。这会在您触摸对象时立即检测单击。您还可以出于不同的目的使用IPInterUpHandlerIDragHandler


    很抱歉我的英语不好。

    此方法在桌面和移动应用程序上都非常有效:

  • 向要检测其单击事件的每个对象添加碰撞器组件
  • 将脚本添加到项目中(将其命名为MyObject.cs)。 此脚本必须实现IPInterDownHandler接口及其方法。此脚本必须将Physics2DRaycaster添加到相机。这个脚本的整体可能是这样的:

    GameObject.Find ("YourButtonName").GetComponent<Button> ().onClick.AddListener (() => {
    
    });
    
    public class MyObject : MonoBehaviour, IPointerDownHandler
    {
        private void Start()
        {
            AddPhysics2DRaycaster();
        }
    
        public void OnPointerDown(PointerEventData eventData)
        {
            Debug.Log("Clicked: " + eventData.pointerCurrentRaycast.gameObject.name);
        }
    
        private void AddPhysics2DRaycaster()
        {
            Physics2DRaycaster physicsRaycaster = FindObjectOfType<Physics2DRaycaster>();
            if (physicsRaycaster == null)
            {
                Camera.main.gameObject.AddComponent<Physics2DRaycaster>();
            }
        }
    }
    
    公共类MyObject:MonoBehavior,IPInterDownHandler
    {
    私有void Start()
    {
    AddPhysics2DRaycaster();
    }
    POINTERDOWN上的公共无效(PointerEventData事件数据)
    {
    Log(“单击:”+eventData.pointercurrentrycast.gameObject.name);
    }
    私有void AddPhysics2DRaycaster()
    {
    Physics2DRaycaster physicraycaster=FindObjectOfType();
    如果(physicsRaycaster==null)
    {
    Camera.main.gameObject.AddComponent();
    }
    }
    }
    
  • 将MyObject.cs脚本添加到要检测的每个对象,然后单击它。之后,当您单击这些对象时,它们的名称将显示在控制台上

  • 确保项目层次结构中存在EventSystem。如果没有,请右键单击添加

  • p.S.MyObject.cs脚本现在具有IPInterDownHandler。这会在您触摸对象时立即检测单击。您还可以出于不同的目的使用IPInterUpHandlerIDragHandler


    很抱歉我的英语不好。

    因此,请使用调试工具绘制光线,并查看光线线的位置going@BugFinder是的。无论是按钮还是图像,都无法从HIT获取有关已单击游戏对象的任何信息。是否在游戏对象上设置了碰撞器