Всем привет, подскажите пожалуйста почему после добавления этого скрипта враг спавнится не после уничтожения 10 врагов а просто бесконечно каждые 1-2 секунды появляются 10 врагов, независимо от уничтожения, даже если не убито ни одного врага? Вот срипт
Код
[b] using System.Collections; using System.Collections.Generic; using UnityEngine;
public class GameController : MonoBehaviour {
// Создание переменной «враг» public Transform enemy; // Временные промежутки между событиями, кол-во врагов public float timeBeforeSpawning = 1.5f; public float timeBetweenEnemies = 0.25f; public float timeBeforeWaves = 2.0f; public int enemiesPerWave = 10; private int currentNumberOfEnemies = 0;
// Процедура уменьшения количества врагов в переменной public void KilledEnemy() { currentNumberOfEnemies--; }
// Use this for initialization void Start () { StartCoroutine(SpawnEnemies()); }
// Update is called once per frame void Update () {
} // Появление волн врагов IEnumerator SpawnEnemies() { // Начальная задержка перед первым появлением врагов yield return new WaitForSeconds(timeBeforeSpawning); // Когда таймер истекает, начинаем производить эти действия while (true) { // Не создавать новых врагов, пока не уничтожены старые if (currentNumberOfEnemies <= 0) { float randDirection; float randDistance; // Создать 10 врагов в случайных местах за экраном for (int i = 0; i < enemiesPerWave; i++) { // Задаём случайные переменные для расстояния и направления randDistance = Random.Range(5, 25); randDirection = Random.Range(0, 45); // Используем переменные для задания координат появления врага float posX = this.transform.position.x + (Mathf.Cos((randDirection) * Mathf.Deg2Rad) * randDistance); float posY = this.transform.position.y + (Mathf.Sin((randDirection) * Mathf.Deg2Rad) * randDistance); // Создаём врага на заданных координатах Instantiate(enemy, new Vector3(posX, posY, 0), this.transform.rotation); currentNumberOfEnemies++; yield return new WaitForSeconds(timeBetweenEnemies); } } // Ожидание до следующей проверки yield return new WaitForSeconds(timeBeforeWaves); } } }[/b]
Unity the best
Сообщение отредактировал alex9999 - Воскресенье, 29 Апреля 2018, 21:01
1) Используйте bb-код для оформления исходных текстов, читать невозможно. 2) Что это за дичь?
Код
// Не создавать новых врагов, пока не уничтожены старые if (currentNumberOfEnemies <= 0) // <-- начиная отсюда waveNumber++; waveText.text = "WAVES: " + waveNumber; { // точно не перепутали?
3)
Код
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class GameController : MonoBehaviour {
// Создание переменной «враг» public Transform enemy; // Временные промежутки между событиями, кол-во врагов public float timeBeforeSpawning = 1.5f; public float timeBetweenEnemies = 0.25f; public float timeBeforeWaves = 2.0f; public int enemiesPerWave = 1; private int currentNumberOfEnemies = 0;
// Процедура уменьшения количества врагов в переменной public void KilledEnemy() { currentNumberOfEnemies--; }
// Use this for initialization void Start () { StartCoroutine(SpawnEnemies()); }
// Update is called once per frame void Update () {
} // Появление волн врагов IEnumerator SpawnEnemies() { // Начальная задержка перед первым появлением врагов yield return new WaitForSeconds(timeBeforeSpawning); // Когда таймер истекёт, начинаем производить эти действия while (true) { // Не создавать новых врагов, пока не уничтожены старые if (currentNumberOfEnemies > 0) continue;
waveNumber++; waveText.text = "WAVES: " + waveNumber; float randDirection; float randDistance; // Создать 10 врагов в случайных местах за экраном for (int i = 0; i < enemiesPerWave; i++) { // Задаём случайные переменные для расстояния и направления randDistance = Random.Range(5, 25); randDirection = Random.Range(0, 45); // Используем переменные для задания координат появления врага float posX = this.transform.position.x + (Mathf.Cos((randDirection) * Mathf.Deg2Rad) * randDistance); float posY = this.transform.position.y + (Mathf.Sin((randDirection) * Mathf.Deg2Rad) * randDistance); // Создаём врага на заданных координатах Instantiate(enemy, new Vector3(posX, posY, 0), this.transform.rotation); currentNumberOfEnemies++; yield return new WaitForSeconds(timeBetweenEnemies); } // Ожидание до следующей проверки yield return new WaitForSeconds(timeBeforeWaves); } }
}
4) Уверены, что хотите использовать while (true) {} ? Хорошенько подумайте, ведь это можно сделать иначе. Подсказка: события, корроутины. Ninja Slayer - 2D Physics Puzzle [cancelled]
Сообщение отредактировал Abel399 - Воскресенье, 29 Апреля 2018, 19:06
// Не создавать новых врагов, пока не уничтожены старые if (currentNumberOfEnemies <= 0) // <-- начиная отсюда waveNumber++; waveText.text = "WAVES: " + waveNumber; { // точно не перепутали?
У меня просто еще в коде есть ссылки на очки и волны появления врагов, я не удалил просто, не заметил)) Спасибо за ответ, я поменял свою строку: if (currentNumberOfEnemies <= 0) на вашу: if (currentNumberOfEnemies > 0) continue; при запуске игры после спавна 10-го врага юнити просто мертво зависает пока не завершить процесс из диспетчера задач, может нужно еще что то добавить в код и еще, не подскажете как сделать чтобы после смерти игрока спавн прекращался? Unity the best
Сообщение отредактировал alex9999 - Воскресенье, 29 Апреля 2018, 20:21