我目前正在制作一个游戏,我想产生许多不同的敌人。目前,我有很多通过ScriptableObjects创建的单位数据容器。这些单位包含不同类型的数据,例如HP,战利品,伤害等。我曾考虑添加另一种类型的数据,这些数据将是它们各自生成的百分比或类似的内容,但是我仍然不知道如何实现这样的事情。
这是我当前的代码,其中我从近战或远程敌人的两个不同列表中完全随机产生敌人。
IEnumerator SpawnEnemies()
{
//Spawn enemies while amount of enemies are under predetermined enemy amount.
while (spawnedEnemies < totalEnemiesInCurrentWave)
{
//Randomize if Melee or Ranged enemy.
whichEnemyType = Random.Range(0, 2);
GameObject enemy = waves[currentWave].enemyPrefab[whichEnemyType];
spawnedEnemies++;
enemiesInWaveLeft++;
//Can I get a probability % to spawn each enemy? Currently completely random.
switch (whichEnemyType)
{
case 0:
GameObject Melee = Instantiate(enemy, spawnPoint.position, Quaternion.identity);
Melee.GetComponent<Melee>().unit = meleeUnits[Random.Range(0, meleeUnits.Count)];
break;
case 1:
GameObject Ranged = Instantiate(enemy, spawnPoint.position, Quaternion.identity);
Ranged.GetComponent<Ranged>().unit = rangedUnits[Random.Range(0, rangedUnits.Count)];
break;
default:
break;
}
yield return new WaitForSeconds(timeBetweenEnemies);
}
yield return null;
}
有人可以为我指出一个更好的方法来处理随机敌人吗?或者,如果可以的话,给我一些如何做的想法。
谢谢。
答案 0 :(得分:2)
此代码未考虑您的远程和近战单位的单独列表,但是您可以使用它为每个敌人的可编脚本对象分配权重,然后产生的敌人将基于所有敌人的权重你的敌人。我建议只列出一个敌人列表,而不是分别列出近战和远程敌人的列表。
此代码假定您的脚本对象称为Enemy
,并且向其中添加了weight
字段。如果您希望权重特定于每个波浪(而不是每个敌人的类型),则将weight
字段移到敌人的预制件上,而不是其ScriptableObject上。
IEnumerator SpawnEnemies()
{
int totalWeight = 0;
foreach (var enemy in waves[currentWave].enemyPrefab)
{
totalWeight += enemy.GetComponent<Enemy>().weight;
}
// Spawn enemies while amount of enemies are under predetermined enemy amount.
while (spawnedEnemies < totalEnemiesInCurrentWave)
{
spawnedEnemies++;
enemiesInWaveLeft++; // I think you should be decrementing instead of incrementing?
// Determine which enemy to spawn, based on all enemy weights
var enemy = GetEnemyToSpawn(totalWeight);
var spawnedEnemy = Instantiate(enemy, spawnPoint.position, Quaternion.identity);
// Here you'll have to handle adding the enemy to the appropriate
// "enemies" list
yield return new WaitForSeconds(timeBetweenEnemies);
}
yield return null;
}
// Suppose:
// enemy A: weight 2
// enemy B: weight 6
// enemy C: weight 3
// Then
// enemy A: 2/11 chance of spawning
// enemy B: 6/11 chance of spawning
// enemy C: 3/11 chance of spawning
private GameObject GetEnemyToSpawn(int totalWeight)
{
int weight = Random.Range(1, totalWeight);
foreach (var enemy in waves[currentWave].enemyPrefab)
{
if (weight <= enemy.GetComponent<Enemy>().weight)
{
return enemy;
}
weight -= enemy.GetComponent<Enemy>().weight;
}
}
答案 1 :(得分:0)
与其使用df.sort_values(['A','B','C','H']).groupby(['A','B','C']).first()
而不返回0或1,而是使用 A B C H
0 A1 B1 C1 HM
1 A2 B2 C2 M
2 A3 B3 C3 NaN
来产生0到1之间的浮点数。
Random.Range((int)0, (int)2)