[英]Template for component construction in Unity with C#
在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 Studio中為此創建代碼段以減少樣板,或者通過其他任何花哨的技巧使這些功能的編寫過程自動化?
目前,我未完成的嘗試使用Xamarin Editor-templates進行,如下所示:
public static $classname$ Construct(){
}
$ classname $調用一個函數來獲取當前類的名稱。 我認為實際上不可能在函數頭中列出該類的標識符。
只是搶占先機:我知道可以創建不是從MonoBehaviour派生的類,但讓我們假設該類實際上需要GameObject的功能。
我猜您正在尋找某種工廠模式。
根據上下文,我有3條建議:
1預制件
避免使用樣板代碼,這就是為什么使用預制件並實例化它們如此普遍的原因。 這是原型模式。 聲明一組序列化的屬性並實例化當前原型的克隆(這就是您嘗試通過代碼執行的操作)。
2在喚醒中初始化
如果您的對象始終使用一組定義的值初始化,請在Awake中而不是在構造函數中對其進行初始化。 如果不是,那么每個組件都應該在任何情況下都提供相關的構造函數重載(作為init方法,因為您不能依賴構造函數),或者包裝在工廠中。
3使用lambda
如果您仍然更喜歡(或出於某些原因)堅持要創建過程對象,則可以避免為每個類聲明方法,而只需傳遞一個負責初始化對象的負責人。 就像是:
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#包裝器,而引擎則擁有生命周期 。 它們實際上是您要求並可能釋放的資源(就像其他資源,如紋理,網格等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.