我是一个初学者,在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;
}
}
我猜您可以使用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);
}
}
}