【问题标题】:Raycasting to find mouseclick on Object in unity 2d games光线投射以在统一 2d 游戏中找到对象上的鼠标点击
【发布时间】:2014-01-02 05:37:18
【问题描述】:

我正在尝试删除单击鼠标的对象。我正在使用新的 Unity3D 4.3 制作 2D 游戏。这是我正在使用的代码

void Update () {

    if (Input.GetMouseButtonDown(0)) 
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(ray,out hit))
        {
            isHit = false;
            Destroy(GameObject.Find(hit.collider.gameObject.name));

        }
    }

}

控件没有进入内部 if 循环。 (isHit 没有被设置为假)。

【问题讨论】:

  • 对象有碰撞器吗?它有对撞机和刚体吗?
  • 是的,它包含一个对撞机和一个刚体
  • 我使用了 Physics2D 并且它有效!这是修改后的代码 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Vector2 原点 = 新 Vector2(ray.origin.x,ray.origin.y); RaycastHit2D hit = Physics2D.Linecast(orgin,-Vector2.up,1
  • 不是你问的真正的一部分,但在这一行:Destroy(GameObject.Find(hit.collider.gameObject.name)); find 不需要。只需执行Destroy(hit.collider.gameObject); 就可以了。
  • 由于错误,我无法使用该条件。它说,“无法从'UnityEngine.Ray 转换为UnityEngine.vector2'。”与雷射线相同。

标签: unity3d unityscript


【解决方案1】:

您不能在新的 2D 东西上使用 3D 物理函数。请改用2D functions。示例:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

if(hit.collider != null)
{
    Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position);
}

【讨论】:

    【解决方案2】:

    这个问题有点老了,但我一直在寻找一种在统一 2D 中通过鼠标单击来获取 GameObject 的方法,而 Esa 的答案几乎帮助了我,但我无法让它工作,所以通过一些研究,我看到 Camera.main.ScreenToWorldPoint 正在返回相机屏幕区域的中心并且它可以正常工作。它需要输入相机和最近的游戏对象在 Z 位置的差异。默认情况下,我的相机设置为 -10,我的游戏对象设置为 0,所以我需要做的就是将 Input.mousePosition.z 设置为 10。因此,如果您在使用 Esa 的代码时遇到问题(比如我 :( )下面的代码可能会对您有所帮助:

    RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10)), Vector2.zero);
    
    if(hit.collider != null)
    {
        Debug.Log ("Target Position: " + hit.collider.gameObject.transform.position);
    }
    

    【讨论】:

      【解决方案3】:

      首先将任何类型的 2D 对撞机附加到您的游戏对象,然后选择其中一个解决方案;

      第一种情况 - 如果有超过 1 个 GameObject 在彼此之上,并且您尝试了解特定的 GameObject 被点击:

      void Update ()
      {
          if (Input.GetMouseButtonDown (0)) {
              Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
              RaycastHit2D[] hits = Physics2D.GetRayIntersectionAll (ray, Mathf.Infinity);
              foreach (var hit in hits) {
                  if (hit.collider.name == name) {
                      MyFunction ();
                  }
              }
          }
      }
      

      第 2 种情况 - 如果只有 1 个 GameObject,并且您尝试了解它是否被点击:

      void Update ()
      {
          if (Input.GetMouseButtonDown (0)) {
              Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
              RaycastHit2D hit = Physics2D.GetRayIntersection (ray, Mathf.Infinity);
              if (hit.collider != null && hit.collider.name == name) {
                  MyFunction ();
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        您必须先将一个网格对撞机(任何对撞机)与您的对象连接,然后才能进入内部 If。那么,

        Destroy(hit.collider.gameObject); 
        

        将简单地完成这项工作。

        这里可能还有其他工作。

        void Update () {
        
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
        
            if(Physics.Raycast(ray,out hit))
            {
                if(Input.GetMouseButtonDown(0))
                {
                    isHit = false;
                    Destroy(hit.collider.gameObject);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多