2

Unity csharp中,我想创建一个GetOrAddComponent方法,这将简化相应的GetComponentAddComponent(我想没有充分的理由)。

通常的方法是这样的:

// this is just for illustrating a context
using UnityEngine;
class whatever : MonoBehavior {
public Transform child;
void whateverMethod () {

    BoxCollider boxCollider = child.GetComponent<BoxCollider>();
    if (boxCollider == null) {
        boxCollider = child.gameObject.AddComponent<BoxCollider>();
    }

}}

现在我可以上这门课了。. . :

public class MyMonoBehaviour : MonoBehaviour {

    static public Component GetOrAddComponent (Transform child, System.Type type) {
        Component result = child.GetComponent(type);
        if (result == null) {
            result = child.gameObject.AddComponent(type);
        }
        return result;
    }

}

. . . 所以这有效:

// class whatever : MyMonoBehavior {

BoxCollider boxCollider = GetOrAddComponent(child, typeof(BoxCollider)) as BoxCollider;

但我希望我可以这样写:

BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();

我能想出的唯一想法太复杂了(用Transforma替换每个MyTransform),因此甚至不值得尝试。至少不仅仅是为了更好的语法。

但是是吗?或者还有其他方法可以实现吗?

4

3 回答 3

5

您是否尝试过使用扩展方法?您可以像这样声明它们:

public static class MyMonoExtensions {

    public static T GetOrAddComponent<T>(this Transform child) where T: Component {
        T result = child.GetComponent<T>();
        if (result == null) {
            result = child.gameObject.AddComponent<T>();
        }
        return result;
    }

}

您可以像实例方法一样调用它,然后:

child.GetOrAddComponent<BoxCollider>();

有关扩展方法的更多详细信息,请参阅上面的链接。

于 2012-10-02T12:26:20.643 回答
2

从 c# 3.0 开始,您可以使用扩展方法

public static MonoBehaviourExtension
{
     public static void GetOrAdd(this MonoBehaviour thisInstance, <args>)
     {
           //put logic here
     }
}
于 2012-10-02T12:25:39.460 回答
1

您可以使用扩展方法。

public static class Extensions
{
    public static T GetOrAddComponent<T>(this Transform child) where T : Component 
    {
            T result = child.GetComponent<T>();
            if (result == null) {
                result = child.gameObject.AddComponent<T>();
            }
            return result;
    }
}

现在你可以使用BoxCollider boxCollider = child.GetOrAddComponent<BoxCollider>();

于 2012-10-02T12:27:48.830 回答