簡體   English   中英

Unity根據參數“類型”設置Gameobject

[英]Unity set Gameobject based on parameter 'Type'

我想創建一個策略游戲。 當我單擊操作欄中的“ BuildHouse”按鈕時,我希望我的經理注冊應建造的建築物。

我所有的建築物都是組件,因此我嘗試將建築物類型作為參數傳遞。

我的按鈕執行

public void BuildFarm()
{
    buildManager.SetBuilding(typeof(Farm)); // Farm is a child of Building
}

現在, BuildManager知道了建築物的類型。 我嘗試遍歷所有建築物預制件,然后選擇與類型匹配的預制件。

public class BuildManager : MonoBehaviour
{
    [SerializeField]
    private GameObject[] buildings;

    public void SetBuilding(Type buildingType)
    {
        GameObject targetBuilding = buildings.Where(currentBuilding => buildingType == currentBuilding.GetComponent<Building>().GetType()).First();
    }
}

我不知道是否有更好的方法來使BuildManager知道要構建什么。 如果這個想法根本不好,請提供一種更好的實施方式。

在我看來,按組件類型過濾絕對好。 如果您具有“ Farm和“ House組件,並且它們都是建築物,那么很自然地用繼承層次結構來表達它。

關於使用enum :枚舉最適合表示簡單狀態或良好指定的,不太可能更改的值,例如一周中的幾天 一周的第8天沒有,對吧? 另一方面,您可能想自由擴展可用建築物的列表,並且每個建築物可能實現不同的游戲邏輯。 一種更自然的表達方式是創建類層次結構。 而且當這些類就位時,為相同的事情添加一個enum是多余的。

就是說,我建議您對代碼進行一些改進。

    public void SetBuilding<TBuilding>() where TBuilding : IBuilding
    {
        GameObject targetBuilding = buildings
           .Where(currentBuilding => 
              typeof(TBuilding) == currentBuilding.GetComponent<Building>().GetType())
           .SingleOrDefault();

        if(targetBuilding == null)
        {
           // throw or log an error here
        }
        else
        {
           // instantiate
        }
    }
  1. 如果在編譯時始終知道buildingType則可以使用泛型。 它使對該方法的調用更具可讀性: buildManager.SetBuilding<Farm>();

  2. 注意where TBuilding : IBuilding約束。 使您的FarmHouse類實現一個通用的接口IBuilding (它也可以是一個通用的基類): class Farm : Component, IBuilding 通過此編譯器,確保您無法調用諸如buildManager.SetBuilding<int>();類的東西buildManager.SetBuilding<int>();

  3. SingleOrDefault確保只有一個這樣的GO。 如果不超過1,則返回null。 如果是這種情況,請拋出或記錄錯誤。 我知道您要確保buildings數組正確,但是您應該使用代碼強制執行。

我建議定義一個enum

enum BuildingType
{
    Farm,
    House,
    ...
}

然后,您可以為Building定義Type屬性:

public class Building
{
    ...
    BuildingType Type { get; set; }
    ... 
}

然后,您可以像這樣調用SetBuilding (也許使用switch ):

public void SetBuilding(BuildingType buildingType)
{
    // act according to buildingType
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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