0

Unity での C# でのプログラミングには、膨大な量のボイラープレートが必要です。これは、一部は C# によるものですが、エンジン自体の設計上の決定によるものでもあります。

MonoBehaviours を自分で構築できないという事実は、正しい初期化を強制するために、次のようにコードを記述する必要があることを意味します。

using System;
using System.Collections.Generic;
using UnityEngine;


public class MyClass : MonoBehaviour
{
    private int a;
    private float b;
    private string c;
    private List<int> lst;

    public static MyClass Construct (int a, float b, string c,List<int> lst)
    {
        //Boiler-plate stuff
        var go = new GameObject ();
        var mc = go.AddComponent<MyClass> ();

        /*
         * This part is fugly. The static method is setting
         * fields on the object. The responsibility to be
         * fully initialized after construction should
         * lie on the object. 
         * I could easily forget to set fields from the
         * outside.
         */
        mc.a = a;
        mc.b = b;
        mc.c = c;
        mc.lst = lst;

        return mc;
    }

    //Same as above, but this time without constructing a new GameObject.
    public static MyClass AddTo (GameObject go,int a, float b, string c,List<int> lst)
    {
        var mc = go.AddComponent<MyClass> ();

        mc.a = a;
        mc.b = b;
        mc.c = c;
        mc.lst = lst;

        return mc;
    }

}

Xamarin スタジオでこのコード スニペットを作成してボイラー プレートを削減する方法、またはこれらの関数を記述するプロセスを自動化するその他の巧妙なトリックはありますか?

私の未完成の試みは現在、Xamarin エディター テンプレートで次のようになっています。

public static $classname$ Construct(){
}

$classname$ は、関数を呼び出して現在のクラスの名前を取得します。関数ヘッダーにクラスの識別子をリストすることは実際には不可能だと思います。

人々を先取りするために: MonoBehaviour から派生していないクラスを作成できることは知っていますが、このクラスが実際にゲームオブジェクトの機能を必要としていると仮定しましょう。

4

1 に答える 1

2

工場のパターンを探していると思います。

コンテキストに応じて、3 つの提案があります。

1 プレハブ

ボイラー プレート コードを避けるため、プレハブを使用してインスタンス化することが非常に一般的です。原型のパターンです。シリアル化されたプロパティのセットを宣言し、現在のプロトタイプのクローンをインスタンス化します (これがコードで実行しようとしていることです)。

2 Awake で初期化する

オブジェクトが定義済みの値のセットで常に初期化される場合は、コンストラクターではなく Awake で初期化します。そうでない場合、すべてのコンポーネントは、関連するコンストラクターのオーバーロードを (コンストラクターに依存できないため、init メソッドとして) 提供するか、ファクトリ内にラップする必要があります。

3 ラムダを使う

それでも手続き型のオブジェクト作成を好む場合、または何らかの理由でそうする必要がある場合は、すべてのクラスのメソッドを宣言することを避け、オブジェクトを初期化する責任を単純に渡すことができます。何かのようなもの:

public class Test : MonoBehaviour {
    public int foobar;
}

public static T CreateAndAttach<T>(Action<T> init)
     where T : MonoBehaviour
{
    GameObject go = new GameObject();
    T t = go.AddComponent<T>();

    init(t);
    return t;
}

//usage
CreateAndAttach<Test>(t => { t.foobar = 10; });   

MonoBehaviours を自分で構築できないという事実は、正しい初期化を強制するために、次のようにコードを記述する必要があることを意味します。

実際には、エンジンの側にMonoBehaviours存在するコンポーネントの C# ラッパーであり、寿命を所有するのはエンジンです。これらは、(テクスチャ、メッシュなどの他のリソースと同様に) 要求し、場合によっては解放する事実上のリソースです。C++

于 2015-06-14T15:38:01.177 に答える