簡體   English   中英

如何指定多維數組的內容和 select 對象匹配列表中的條件?

[英]How can I specify the contents of a multidimensional array and select objects matching the criteria from a list?

前提

我們正在創建一款塔防類型的游戲。 所以我們想建立一個 Wave 系統,並且能夠根據他們各自的類型來設置每個敵人將 spring 起來的 Wave 次數。

  • Select 從EnemyFactor生成的敵人類型
  • Select 從EnemyAmount生成的敵人數量

在此處輸入圖像描述

你想達到什么

  • Select 列表和游戲中的敵人類型 object

適用的源代碼

    public class WaveListFactor : MonoBehaviour
    {
        public List<EnemyEnum> enemyFactor = new List<EnemyEnum>();

        public List<int> enemyAmount = new List<int>();
    }
    public class WaveList : MonoBehaviour
    {
        public List<GameObject> enemyList = new List<GameObject>();

        public List<WaveListFactor> waveEnemies = new List<WaveListFactor>();
    }
    public class WaveManager : MonoBehaviour
    {
        public void EnemySpawn()
        {
            int enemyFactor = waveList.waveEnemies.waveEnemyFactor;
            GameObject enemy = waveList.enemyList[enemyFactor];
            waveSpawner.Spawn(enemy);
        }
    }

問題

int enemyFactor = waveList.waveEnemies.waveEnemyFactor;

現在我無法將EnemyEnum中的EnemyFactor更改為int並且無法指定enemyList的內容。

補充信息(固件/工具版本等)

  • 統一 2020.3.20f

我建議你寧願使用SerializedDictionary<EnemyEnum, GameObject[]>並簡單地預先配置哪個枚舉值導致哪個GameObject預制選項(這樣你仍然可以隨機化一點)

public SerializedDictionary<EnemyEnum, GameObject[]> enemyList = new SerializedDictionary<EnemyEnum, GameObject[]>();

然后 select 一個在做

var options = enemyList[enemyFactor];

然后是 select 一個隨機的,例如

var selectedPrefab = options[Random.Range(0, options.Length)];

否則,您將需要一些專門用於敵人的組件,以提供有關它響應哪個EnemyEnum的信息,例如

public class Enemy : MonoBehaviour
{
    public EnymeEnum Type;
}

而有

public List<Enemy> enemyList = new List<Enemy>();

然后您可以使用Linq過濾可用選項

using System.Linq;

...

var options = enemyList.Where(enemy => enemy.Type == enemyFactor).ToArray();

並從現有的比賽中隨機挑選一個,比如

var selectedPrefab = options[Random.Range(0, options.Length)];

如果結果為null ,則意味着沒有匹配的預制件。

缺點:每個預制件只能屬於一個單一的枚舉類別。 其他兩種解決方案並非如此。


甚至更簡單:為什么要將信息存儲在單獨的 collections 中?

只是有一個

[Seriaizable]
public class EnemyInfo
{
    public GameObject Prefab;
    public int Amount;
}

[Seriaizable]
public class WaveInfo
{
    public EnemyInfo[] EnemyInfos;
}

這樣您就不必關心任何枚舉,而只需定義將產生多少個預制件的實例。

暫無
暫無

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

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