用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的功能。
事實上,你不能使用「新MonoBehaviour」在我工作的公司造成了很多問題。主要的問題是保存遊戲(我們決定使用BinaryFormatter,但是需要構造函數進行反序列化)。我們目前的解決方案是派生自MonoBehaviour的類將其變量保存在可以使用「new」創建的另一個類中。不利的一面是我們必須製作一些醜陋的屬性才能訪問它們以保持代碼的其他部分清潔。 – JinJi
如果你遵循獨立遊戲開發公司之一的Unity講座(我忘記了哪個),你會發現它們將他們的代碼與專門與Unity並列的解耦。它不僅允許您在Unity之外快速構建原型,還允許Unity行爲類不過是您的外部代碼的代理。如果你遵循這種行爲,那麼沒有理由以任何你想要的方式創建代碼。 – MickyD
使用引擎「as-a-library」似乎很吸引人,但我猜測我會以這種方式從預製中失去很多功能。此外,鍋爐板可能會移動到別的地方。我想念一些像Scala的特徵和案例類的強大結構。 關於xamarin代碼模板的東西的任何意見? – Felix