如何在Unity中检查游戏对象是否有组件方法?

我正在编写一个方法来检查gameObject是否有一个组件。

这里是:

public static bool HasComponent (this GameObject obj) { return obj.GetComponent() != null; } 

而我正在使用它:

 void Update() { if (Input.GetKey("w")) { if (gameObject.HasComponent()) { print("Has a rigid body."); return; } print("Does not have rigid body."); } } 

gameObject没有刚体,但它仍然打印它确实有。

它只是……

 public static bool HasComponent (this GameObject obj) where T:Component { return obj.GetComponent() != null; } 

请注意,你忘记了

其中T:组件

第一行的一部分!

有了这个语法错误,扩展名是没有意义的:它总是找到“某个组件”(因为T类似于“空白”),因此永远不会为空。 这只是一个语法错误。


注意。

解释“什么是扩展”。

对于那些不熟悉c#类别的人来说这就是c#中的“扩展”…这里有一个简单的教程 ……

在此处输入图像描述

扩展在Unity中绝对至关重要 – 您在每行代码中至少使用一次。 基本上在Unity中,您几乎可以在扩展中执行所有操作。 请注意,OP甚至没有显示包装类。 你可以在这样的文件中使用它:

 public static class ExtensionsHandy // this class name is irrelevant and not used { public static bool HasComponent (this GameObject obj) where T:Component { return obj.GetComponent() != 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文件中 - 包装类的文件名完全不相关。)每个工程师和团队都有自己一直使用的“公共扩展”。

请注意,这里举例来说, 例子我在一个类别中的某些东西问了一个棘手的问题。 (谢天谢地,EricL就在那里!)顺便说一句,在大多数/某些/旧语言中,你称之为“类别”。 在c#中它是一个“扩展”,但人们总是说“类别”或“扩展”。

正如我所说,你在Unity中不断使用它们。 干杯


如果你喜欢那种东西,这里有一个漂亮的东西:

 // the unbelievably useful array handling category for games! public static T AnyOne(this T[] ra) where T:class { int k = ra.Length; int r = UnityEngine.Random.Range(0,k); return ra[r]; }