如何确定鼠标位置的对象类(Unity3d)

时间:2017-01-03 04:14:23

标签: c# unity3d mouseover

我的2D项目中有一个类(" foo"说),当我在鼠标位置获得对游戏对象的引用时,我想确定该对象是否属于foo类。我用

获取对象
GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject;

其中mousePos是我的鼠标的位置,它似乎按预期工作。为了测试课程,我尝试了以下内容:

  1. if(objAtMouse is foo){...}
  2. foo fooAtMouse = objAtMouse as foo; 如果(fooAtMouse){...}
  3. if((objAtMouse.GetComponent(" foo")as foo)!= null){...}
  4. 选项1.被建议here并且是唯一一个不会产生错误,但会产生警告

      

    给定的表达式永远不会提供(' foo')类型

    选项2.,也在上面的链接中提出,产生错误

      

    无法转换类型' UnityEngineGameObject'到了' foo'通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换

    选项3.被建议here并产生错误

      

    NullReferenceException:未将对象引用设置为对象的实例

    这似乎是一项简单的任务,但我在这方面遇到了一些麻烦。那么,我如何确定鼠标结束的对象的类/类型?

    非常感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

如果Foo是一个组件,可能是因为您将它附加到GameObject,那么选项3非常接近。但是你不需要把它as Foo

Foo fooComponent = objAtMouse.GetComponent<Foo>();

if (fooComponent == null) .. //no Foo component.

请注意,您应首先检查objAtMouse是否为null ..

答案 1 :(得分:1)

首先,第一行无法解决问题:

GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject;

这假设您有一个持续的成功命中。

Raycast2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero);
if(hit.transform != null)
{
     GameObject objAtMouse = hit.transform.gameObject;
     if(objAtMouse.GetComponent<Foo>() != null){
          // Object has component Foo on it
     }
}

另一种解决方案是让Foo类型告诉自己:

public class Foo:MonoBehaviour{
     private static HashSet<Transform>fooCollection;
     private void Awake()
     {
          if(fooCollection  == null)
          {
              fooCollection = new HashSet<Transform>(); 
          }
          fooCollection.Add(this.transform);
     }

     private void OnDestroy()
     {
          fooCollection.Remove(this.transform);
     }

     public static bool CompareFooObject(Transform tr)
     {
          if(tr == null) return false;
          return fooCollection.Contains(tr);
     }
}

然后您可以将其用作:

Raycast2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero);
if(Foo.CompareFooObject(hit.transform))
{
    // Is Foo type
}

HashSet的优点是找到项目相当快。您还可以扩展模式的使用,以便它可以与任何类型的泛型一起使用,但我想现在已经足够了。

答案 2 :(得分:0)

场景中的所有对象都是游戏对象本身并且不会成为cild类。您想要找到的其他类是组件

因此,您必须使用obj.GetComponents将其从游戏对象中删除

答案 3 :(得分:0)

您也可以为其指定标签,然后使用

objAtmouse.compareTag('your tag name');