如何指定多维数组的内容和 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 列表和游戏对象中的敌人类型
适用的源代码
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
的内容。
补充信息(固件/工具版本等)
- 统一 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
,则意味着没有匹配的预制件。
缺点:每个预制件只能属于一个枚举类别。其他两种解决方案并非如此。
或者更简单:为什么要将信息存储在单独的集合中?
干脆有一个
[Seriaizable]
public class EnemyInfo
{
public GameObject Prefab;
public int Amount;
}
[Seriaizable]
public class WaveInfo
{
public EnemyInfo[] EnemyInfos;
}
这样您就不必关心任何枚举,而只需定义将产生多少个预制件的实例。
前提
我们正在制作塔防类型的游戏。所以我们想建立一个 Wave 系统,并且能够根据他们各自的类型设置每个敌人 spring 的 Wave 次数。
- Select 生成的敌人类型
EnemyFactor
- Select 生成的敌人数量
EnemyAmount
您想达到的目标
- Select 列表和游戏对象中的敌人类型
适用的源代码
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
的内容。
补充信息(固件/工具版本等)
- 统一 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
,则意味着没有匹配的预制件。
缺点:每个预制件只能属于一个枚举类别。其他两种解决方案并非如此。
或者更简单:为什么要将信息存储在单独的集合中?
干脆有一个
[Seriaizable]
public class EnemyInfo
{
public GameObject Prefab;
public int Amount;
}
[Seriaizable]
public class WaveInfo
{
public EnemyInfo[] EnemyInfos;
}
这样您就不必关心任何枚举,而只需定义将产生多少个预制件的实例。