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>();

私が思いつくことができる唯一のアイデアは、それを行うには複雑すぎるため(それぞれTransformを に置き換えるMyTransform)、試してみる価値さえありません。少なくとも、より良い構文のためだけではありません。

しかし、そうですか?または、これを達成できる他の方法はありますか?

4

3 に答える 3

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 に答える