繁体   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