2015-06-14 32 views
0

用Unity編程C#需要大量的鍋爐板。這部分歸功於C#,但也是由於引擎本身的設計決定。Unity中用於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 Studio中的代碼片斷這個減少鍋爐板或其他任何花哨的技巧來自動完成寫這些功能的過程?

我未完成的嘗試目前看起來像這樣與Xamarin編輯模板:

public static $classname$ Construct(){ 
} 

其中$類名$調用一個函數來獲取當前類的名稱。我不認爲實際上可以在函數頭中列出類的標識符。

只是爲了搶先人:我知道可以創建不是從MonoBehaviour派生的類,但是讓我們假設這個類實際上需要GameObject的功能。

+0

事實上,你不能使用「新MonoBehaviour」在我工作的公司造成了很多問題。主要的問題是保存遊戲(我們決定使用BinaryFormatter,但是需要構造函數進行反序列化)。我們目前的解決方案是派生自MonoBehaviour的類將其變量保存在可以使用「new」創建的另一個類中。不利的一面是我們必須製作一些醜陋的屬性才能訪問它們以保持代碼的其他部分清潔。 – JinJi

+0

如果你遵循獨立遊戲開發公司之一的Unity講座(我忘記了哪個),你會發現它們將他們的代碼與專門與Unity並列的解耦。它不僅允許您在Unity之外快速構建原型,還允許Unity行爲類不過是您的外部代碼的代理。如果你遵循這種行爲,那麼沒有理由以任何你想要的方式創建代碼。 – MickyD

+0

使用引擎「as-a-library」似乎很吸引人,但我猜測我會以這種方式從預製中失去很多功能。此外,鍋爐板可能會移動到別的地方。我想念一些像Scala的特徵和案例類的強大結構。 關於xamarin代碼模板的東西的任何意見? – Felix

回答

1

我猜你在找什麼工廠模式。

根據上下文,我有三點建議:

1個預製件

避免鍋爐板代碼,這就是爲什麼是如此普遍使用預製件和實例化它們。這是prototype模式。聲明一組序列化的屬性並實例化當前原型的一個克隆(這就是你想要通過代碼實現的)。

2初始化清醒

如果你的對象始終與定義的一組值初始化,清醒而不是在構造函數初始化。 如果它們不是,那麼在任何情況下,每個組件都應該提供相關的構造函數重載(作爲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++一側,它的發動機擁有其使用壽命。它們是您要求並可能發佈的事實上的資源(如其他資源,如紋理,網格等)。

+0

拉姆達一是恕我直言,但有些語法的語法。 – Felix

+0

@Felix:你能否提供和編寫你想如何實例化和初始化對象的代碼片段? – Heisenbug

+0

我原來的帖子中的兩個靜態函數就是例子。 – Felix