[英]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
}
}
如果在編譯時始終知道buildingType
則可以使用泛型。 它使對該方法的調用更具可讀性: buildManager.SetBuilding<Farm>();
注意where TBuilding : IBuilding
約束。 使您的Farm
和House
類實現一個通用的接口IBuilding
(它也可以是一個通用的基類): class Farm : Component, IBuilding
。 通過此編譯器,確保您無法調用諸如buildManager.SetBuilding<int>();
類的東西buildManager.SetBuilding<int>();
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.