有没有更好的方法来随机化产生哪个敌人?

时间:2019-05-13 19:55:57

标签: c# unity3d

我目前正在制作一个游戏,我想产生许多不同的敌人。目前,我有很多通过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;

    }

有人可以为我指出一个更好的方法来处理随机敌人吗?或者,如果可以的话,给我一些如何做的想法。

谢谢。

2 个答案:

答案 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)