如何指定多维数组的内容和 select 与列表中的条件匹配的对象?

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

前提

我们正在制作塔防类型的游戏。所以我们想建立一个 Wave 系统,并且能够根据他们各自的类型设置每个敌人 spring 的 Wave 次数。

您想达到的目标

适用的源代码

    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;

现在我无法将EnemyFactor中的EnemyEnum更改为int并且无法指定enemyList的内容。

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

我建议你宁愿使用 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,则意味着没有匹配的预制件。

缺点:每个预制件只能属于一个枚举类别。其他两种解决方案并非如此。


或者更简单:为什么要将信息存储在单独的集合中?

干脆有一个

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

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

这样您就不必关心任何枚举,而只需定义将产生多少个预制件的实例。