我的2D项目中有一个类(" foo"说),当我在鼠标位置获得对游戏对象的引用时,我想确定该对象是否属于foo类。我用
获取对象GameObject objAtMouse = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(mousePos), Vector2.zero).transform.gameObject;
其中mousePos是我的鼠标的位置,它似乎按预期工作。为了测试课程,我尝试了以下内容:
选项1.被建议here并且是唯一一个不会产生错误,但会产生警告
给定的表达式永远不会提供(' foo')类型
选项2.,也在上面的链接中提出,产生错误
无法转换类型' UnityEngineGameObject'到了' foo'通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换
选项3.被建议here并产生错误
NullReferenceException:未将对象引用设置为对象的实例
这似乎是一项简单的任务,但我在这方面遇到了一些麻烦。那么,我如何确定鼠标结束的对象的类/类型?
非常感谢任何帮助!
答案 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');