如果這是一個愚蠢的問題,我深表歉意!我目前有幾種不同的方法可以將選擇匯集到一個通用的 Spawn 方法中,由不同的列舉型別呼叫以訪問不同的物件陣列:
Prefab[] shipPrefabs;
Prefab[] rockPrefabs;
Prefab[] alienPrefabs;
Prefab[] shotPrefabs;
enum SHIP_TYPE{}
enum ROCK_TYPE{}
enum ALIEN_TYPE{}
enum SHOT_TYPE{}
void Spawn(SHIP_TYPE, ...) { Spawn(shipPrefabs[(int)SHIP_TYPE]); }
void Spawn(ROCK_TYPE, ...) { Spawn(rockPrefabs[(int)ROCK_TYPE]); }
void Spawn(ALIEN_TYPE, ...) { Spawn(alienPrefabs[(int)ALIEN_TYPE]); }
void Spawn(SHOT_TYPE, ...) { Spawn(shotPrefabs[(int)SHOT_TYPE]); }
void Spawn(Prefab) { create object, yada yada }
我希望能夠創建一個更通用的 Spawn 方法,該方法可以采用可變列舉引數并根據列舉型別對其進行相應處理,概念上類似于:
void Spawn(var OBJ_TYPE, ...) {
Prefab newObject;
switch(OBJ_TYPE){
case SHIP_TYPE: newObject = shipPrefabs[(int)OBJ_TYPE]); break;
case ROCK_TYPE: newObject = rockPrefabs[(int)OBJ_TYPE]); break;
case ALIEN_TYPE: newObject = alienPrefabs[(int)OBJ_TYPE]); break;
case SHOT_TYPE: newObject = shotPrefabs[(int)OBJ_TYPE]); break;
}
create newObject, yada yada
}
我嘗試過諸如“typeof”和“is”之類的東西,它們告訴我引數是什么,但我無法將其“轉換”為我可以使用的值。
有可能做我正在嘗試的事情嗎?
uj5u.com熱心網友回復:
一般來說,我寧愿保留您使用多載方法的第一種方法,而不是圍繞硬輸入c#.
運行時型別檢查總是較慢且容易出錯。
但是,使用型別開關,您只需稍作修改即可完全完成您嘗試過的操作。
enum您正在尋找的通用型別是System.Enum
void Spawn(Enum OBJ_TYPE, ...)
{
Prefab newObject = null;
switch(OBJ_TYPE)
{
// This also directly includes the type cast
case SHIP_TYPE shipType:
newObject = shipPrefabs[(int) shipType]);
break;
case ROCK_TYPE rockType:
newObject = rockPrefabs[(int)rockType]);
break;
case ALIEN_TYPE alienType:
newObject = alienPrefabs[(int) alienType]);
break;
case SHOT_TYPE shotType:
newObject = shotPrefabs[(int) shotType]);
break;
default:
throw new ArgumentException($"Enum {OBJ_TYPE} of unsupported type {OBJ_TYPE.GetType().FullName} ");
}
// create newObject, yada yada
}
enum如果您沒有對它做任何進一步的事情,那么包含的型別轉換可能甚至是多余的,因為您然后轉換為int無論如何應該與直接使用相同的值(int)OBJ_TYPE
但是請注意:正如在答案頂部所說的那樣,現在可以將其與任何 enum值一起使用,這當然比使用多載更容易出錯。
uj5u.com熱心網友回復:
也許像這樣的東西?
void Spawn(System.Enum otype, ...) {
Prefab newObject;
if (otype.GetType() == typeof(SHIP_TYPE))
newObject = shipPrefabs[(int)otype]);
else if (otype.GetType() == typeof(ROCK_TYPE))
newObject = rockPrefabs[(int)otype]);
else if (otype.GetType() == typeof(ALIEN_TYPE))
newObject = alienPrefabs[(int)otype]);
else if (otype.GetType() == typeof(SHOT_TYPE))
newObject = shotPrefabs[(int)otype]);
create newObject, yada yada
}
一件事,您不能為此使用 switch,因為它不會將 typeof 視為常量。我不確定你能克服這個問題。
這是否是一個好的設計方法是另一個問題。
uj5u.com熱心網友回復:
由于不允許嵌套列舉,使用多個列舉和多載的一種很酷的方法是:
GameObject[] shipPrefabs;
GameObject[] rockPrefabs;
GameObject[] alienPrefabs;
GameObject[] shotPrefabs;
GameObject[][] goArray = new GameObject[][] {
new GameObject[4],
new GameObject[4],
new GameObject[4],
new GameObject[4],
};
private void Start() {
goArray[0] = shipPrefabs;
goArray[1] = rockPrefabs;
goArray[2] = alienPrefabs;
goArray[3] = shotPrefabs;
}
enum ObjType {
SHIP_TYPE,
ROCK_TYPE,
ALIEN_TYPE,
SHOT_TYPE,
}
enum ShipType {
a, b, c, d, e
}
enum RockType {
a, b, c, d, e
}
enum AlienType {
a, b, c, d, e
}
enum ShotType {
a, b, c, d, e
}
void Spawn(GameObject go) { }
void Spawn(ObjType objType, ShipType shipType) {
Spawn(goArray[(int)objType][(int)shipType]);
}
void Spawn(ObjType objType, RockType rockType) {
Spawn(goArray[(int)objType][(int)rockType]);
}
void Spawn(ObjType objType, AlienType alienType) {
Spawn(goArray[(int)objType][(int)alienType]);
}
void Spawn(ObjType objType, ShotType shotType) {
Spawn(goArray[(int)objType][(int)shotType]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/395711.html
上一篇:以3列方式定位按鈕
下一篇:通過代碼更改材料屬性未顯示
