C# 如何确定鼠标位置的对象类别(Unity3d)
在我的2D项目中有一个类(“foo”,比如说),当我在鼠标位置获得对游戏对象的引用时,我想确定该对象是否属于foo类。我用计算机获取对象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
GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject;
其中mousePos是我的鼠标的位置,它似乎按预期工作。为了测试类,我尝试了以下方法:
非常感谢您的帮助 如果
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的答案,因为检查无效性(你也提到过)才是关键,尽管还有其他一些问题我必须解决,他早些时候回答了。干杯