我正在编写一个方法来检查gameObject是否有组件。
这是:
public static bool HasComponent <T>(this GameObject obj)
{
return obj.GetComponent<T>() != null;
}
我正在使用它:
void Update()
{
if (Input.GetKey("w"))
{
if (gameObject.HasComponent<Rigidbody>())
{
print("Has a rigid body.");
return;
}
print("Does not have rigid body.");
}
}
游戏对象没有刚体,但它仍然打印它确实有。
答案 0 :(得分:9)
只是......
public static bool HasComponent <T>(this GameObject obj) where T:Component
{
return obj.GetComponent<T>() != null;
}
请注意,您忘记了
第一行的一部分!
由于语法错误,扩展名无意义:它总是找到&#34;某些组件&#34; (因为T有点&#34;空白&#34;)因此永远不会为空。这只是一个语法错误。
请注意
解释&#34;什么是扩展&#34;。
对于那些不熟悉c#类别的人来说,这就是&#34; Extensions&#34;在c#...这里很容易tutorial ...
扩展在Unity中绝对至关重要 - 您在每行代码中至少使用一次。 基本上在Unity中,您几乎可以在扩展中执行所有操作。请注意,OP甚至不打算显示包装类。你可以在这样的文件中找到它:
public static class ExtensionsHandy // this class name is irrelevant and not used
{
public static bool HasComponent <T>(this GameObject obj) where T:Component
{
return obj.GetComponent<T>() != null;
}
public static bool IsNear(this float ff, float target)
{
float difference = ff-target;
difference = Mathf.Abs(difference);
if ( difference < 20f ) return true;
else return false;
}
public static float Jiggle(this float ff)
{
return ff * UnityEngine.Random.Range(0.9f,1.1f);
}
public static Color Colored( this float alpha, int r, int g, int b )
{
return new Color(
(float)r / 255f,
(float)g / 255f,
(float)b / 255f,
alpha );
}
}
在示例中,我包含了三个更典型的扩展。通常你会有几十甚至几百个。 (您可能更喜欢将它们分组到不同的HandyExtensions
文件中 - 包装类的文件名完全不相关。)每个工程师和团队都有自己的#34;共同扩展名&#34;他们一直都在使用。
请注意,例如EXAMPLE我在问一个关于某个类别中某些事情的棘手问题。 (谢天谢地,EricL就在那里!)顺便说一句,在大多数/某些/较旧的语言中,你称之为&#34;类别&#34;。在c#中,这是一个&#34;扩展&#34;,但人们说&#34;类别&#34;或者&#34;扩展&#34;一直以来。
正如我所说,你在Unity中不断使用它们。干杯
如果你喜欢那种东西,这里有一个漂亮的东西:
// the unbelievably useful array handling category for games!
public static T AnyOne<T>(this T[] ra) where T:class
{
int k = ra.Length;
int r = UnityEngine.Random.Range(0,k);
return ra[r];
}