簡體   English   中英

使用C#在Unity中構建組件的模板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM