提问者:小点点

C#生成管理器快速创建一波又一波的敌人


我是一个初学者,在Unity中制作我的第一个游戏,跟随Unity的Create With Code课程。 我正在创造一个射击游戏,将使用手追踪。 我还没有设置手部追踪,所以我创建了一个OnTrigger输入,当我击中空间时爆炸物体。 我创建了下面的产卵管理器来产卵敌人的攻击波,但是他们所有的波都是产卵敌人太快了。 它们似乎是在自动产卵,而不是在第一波被摧毁的时候。

有没有更简单的方法以更慢的速度产卵? 或者只有当没有更多的敌人活着的时候才产卵?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnAttack : MonoBehaviour
{
    public GameObject Trumps;
    private float spawnRange = 9;
    public int enemyCount;
    public int waveNumber = 1;

    void Start()
    {      
        SpawnEnemyWave(waveNumber);
        //InvokeRepeating("GenerateSpawnPosition", startDelay, randomInterval); 
    }

    // Update is called once per frame
    void Update()
    {
        enemyCount = FindObjectsOfType<Attack>().Length;
         if(enemyCount == 0)
             {
                waveNumber++;
                SpawnEnemyWave(waveNumber);
             }
     }   

    void SpawnEnemyWave(int enemiesToSpawn)
    {
        for (int i = 0; i < enemiesToSpawn; i++)
        {
            Instantiate(Trumps, GenerateSpawnPosition(), Trumps.transform.rotation);
        }
    }

    private Vector3 GenerateSpawnPosition()
     {
        float spawnPosX = Random.Range(-spawnRange, spawnRange);
        float spawnPosZ = Random.Range(-spawnRange, spawnRange);
        Vector3 randomPos = new Vector3(spawnPosX, 0, spawnPosZ);
        return randomPos;      
     }
    }

共2个答案

匿名用户

我猜您可以使用invoke方法:

Invoke("NameOfTheMethod", 1f)

此方法所做的是在调用方法之前等待一定量的秒。 您必须用引号写出方法的名称,然后选择在方法被调用之前要等待多长时间(“1F”表示以秒为单位的延迟。) 在您的情况下,您可以让脚本在产生敌人之前等待。

匿名用户

我不知道您的攻击脚本,但我会使用类似于

public class Attack : MonoBehaviour
{
    public static readonly HashSet<Attack> AliveAttackInstances = new HashSet<Attack>();

    private void Awake()
    {
        AliveAttackInstances.Add(this);
    }

    private void OnDestroy()
    {
        AliveAttackInstances.Remove(this);
    }
}

所以你可以用更便宜的方式随时检查有多少和哪些敌人活着

public class SpawnAttack : MonoBehaviour
{
    // I would change this type here to make sure your spawned prefab actually 
    // HAS an Attack attached .. otherwise your enemyCount will always be 0
    public Attack Trumps;

    ...

    void Update()
    {
        if(Attack.AliveAttackInstances.Count == 0)
        {
            waveNumber++;
            SpawnEnemyWave(waveNumber);
        }
    }   

然后,为了在产生下一波之前增加一定的延迟,您可以使用一个简单的定时器,例如

public class SpawnAttack : MonoBehaviour
{
    public Attack Trumps;

    [SerializeField] private float delay = 1f;
    private float timer;

    ...

    void Update()
    {
        if(Attack.AliveAttackInstances.Count == 0)
        {
            timer -= Time.deltaTime;
            if(timer <= 0)
            {
                timer = delay;

                waveNumber++;
                SpawnEnemyWave(waveNumber);
            }
        }
    }