Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何确定鼠标位置的对象类别(Unity3d)_C#_Unity3d_Mouseover - Fatal编程技术网

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

C# 如何确定鼠标位置的对象类别(Unity3d),c#,unity3d,mouseover,C#,Unity3d,Mouseover,在我的2D项目中有一个类(“foo”,比如说),当我在鼠标位置获得对游戏对象的引用时,我想确定该对象是否属于foo类。我用计算机获取对象 GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject; 其中mousePos是我的鼠标的位置,它似乎按预期工作。为了测试类,我尝试了以下方法: 如果(objAtMouse是fo

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

GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject;
其中mousePos是我的鼠标的位置,它似乎按预期工作。为了测试类,我尝试了以下方法:

  • 如果(objAtMouse是foo){…}
  • foo fooAtMouse=objAtMouse作为foo; 如果(食鼠){…}
  • if((objAtMouse.GetComponent(“foo”)作为foo)!=null){…}
  • 备选案文1。是唯一一个不产生错误但产生警告的

    给定的表达式决不是提供的('foo')类型

    选项2,也在上面的链接中建议,会产生错误

    无法通过引用转换、装箱转换、取消装箱转换、换行转换或空类型转换将类型“UnityEngingameObject”转换为“foo”

    备选案文3。建议并产生错误

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

    这似乎是一项简单的任务,但我在这方面有点麻烦。那么,如何确定鼠标所在对象的类/类型


    非常感谢您的帮助

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

    Foo fooComponent = objAtMouse.GetComponent<Foo>();
    
    if (fooComponent == null) .. //no Foo component.
    
    fooocomponent=objAtMouse.GetComponent();
    如果(fooComponent==null)//没有Foo组件。
    

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

    如果
    Foo
    是一个组件,这可能是因为您将它附加到了
    游戏对象上,那么选项3非常接近。但是您不需要将它转换为Foo

    Foo fooComponent = objAtMouse.GetComponent<Foo>();
    
    if (fooComponent == null) .. //no Foo component.
    
    fooocomponent=objAtMouse.GetComponent();
    如果(fooComponent==null)//没有Foo组件。
    

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

    场景中的所有对象都是游戏对象本身,不会是cild类。您要查找的另一个类是component


    因此,您必须使用
    obj.GetComponents
    将其从gameobject中取出

    场景中的所有对象都是gameobject本身,而不是cild类。您要查找的另一个类是component


    因此,您必须使用
    obj.GetComponents
    将其从gameobject中取出

    您还可以为其分配一个标记,然后使用

    objAtmouse.compareTag('your tag name');
    

    您还可以为其指定一个标记,然后使用

    objAtmouse.compareTag('your tag name');
    

    首先,第一行不能按原样工作:

    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
         }
    }
    

    HashSet的优点是查找项的速度相当快。您还可以扩展该模式的使用范围,以便它可以用于任何具有泛型的类型,但我想现在这已经足够了。

    首先,第一行不能按原样工作:

    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
         }
    }
    

    HashSet的优点是查找项的速度相当快。您还可以扩展该模式的使用范围,以便它可以用于任何具有泛型的类型,但我想这就足够了。

    感谢您的回复:)我尝试了您的建议,但我得到了上面列出的NullReferenceException。我遗漏了什么吗?
    NullReferenceException
    发生在哪一行?您是否检查了
    objAtMouse
    是否为
    null
    ?您好。是的,我首先检查objAtMouse是否为null,并且仅在生成的if块中对fooComponent进行后续测试。错误发生在运行时;有没有办法获得关于哪一行导致错误的更多细节?谢谢是的,当unity console显示NullReferenceException错误消息时,您可以单击它来显示详细信息,例如它发生在哪个脚本和哪一行。如果您使用的是monodevelop编辑器,请双击错误,它将带您进入代码行。非常感谢您的提示!所以我这样做了,看起来这条线就是GameObject objAtMouse=Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos),Vector2.zero)上面的那条线;但这以前是可行的。有什么想法吗?谢谢你的回复:)我试过你的建议,但是我得到上面列出的NullReferenceException。我遗漏了什么吗?
    NullReferenceException
    发生在哪一行?您是否检查了
    objAtMouse
    是否为
    null
    ?您好。是的,我首先检查objAtMouse是否为null,并且仅在生成的if块中对fooComponent进行后续测试。错误发生在运行时;有没有办法获得关于哪一行导致错误的更多细节?谢谢是的,当unity console显示NullReferenceException错误消息时,您可以单击它来显示详细信息,例如它发生在哪个脚本和哪一行。如果您使用的是monodevelop编辑器,请双击错误,它将带您进入代码行。非常感谢您的提示!所以我这样做了,看起来这条线就是GameObject objAtMouse=Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos),Vector2.zero)上面的那条线;但这以前是可行的。有什么想法吗?谢谢你的回答,+1。我接受了@Lincoln的答案,因为检查无效性(你也提到过)才是关键,尽管还有其他一些问题我必须解决,他早些时候回答了。干杯谢谢你的回答,+1。我接受了@Lincoln的答案,因为检查无效性(你也提到过)才是关键,尽管还有其他一些问题我必须解决,他早些时候回答了。干杯