![](/img/trans.png)
[英]How can I search a list of objects that contains a list of objects for the first entry that contains an element matching my search criteria?
[英]How can I specify the contents of a multidimensional array and select objects matching the criteria from a list?
我们正在创建一款塔防类型的游戏。 所以我们想建立一个 Wave 系统,并且能够根据他们各自的类型来设置每个敌人将 spring 起来的 Wave 次数。
EnemyFactor
生成的敌人类型EnemyAmount
生成的敌人数量 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
的内容。
我建议你宁愿使用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.