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

时间:2016-02-03 01:05:14

标签: c# generics unity3d types unityscript

我正在编写一个方法来检查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.");
    }
}

游戏对象没有刚体,但它仍然打印它确实有。

1 个答案:

答案 0 :(得分:9)

只是......

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

请注意,您忘记了

其中T:Component

第一行的一部分!

由于语法错误,扩展名无意义:它总是找到&#34;某些组件&#34; (因为T有点&#34;空白&#34;)因此永远不会为空。这只是一个语法错误。

请注意

解释&#34;什么是扩展&#34;。

对于那些不熟悉c#类别的人来说,这就是&#34; Extensions&#34;在c#...这里很容易tutorial ...

enter image description here

扩展在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];
    }