Понедельник, 25 Ноября 2024, 16:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
не работает спавн врага
alex9999Дата: Воскресенье, 29 Апреля 2018, 18:47 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет, подскажите пожалуйста почему после добавления этого скрипта враг спавнится не после уничтожения 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
seamanДата: Воскресенье, 29 Апреля 2018, 19:00 | Сообщение # 2
старожил
Сейчас нет на сайте
У Вас тут со скобками полная неразбериха. Расставьте их нормально может даже и заработает сразу.
Abel399Дата: Воскресенье, 29 Апреля 2018, 19:04 | Сообщение # 3
Surpass your limits. Right now.
Сейчас нет на сайте
1) Используйте bb-код для оформления исходных текстов, читать невозможно.
2) Что это за дичь?
Код

// Не создавать новых врагов, пока не уничтожены старые
if (currentNumberOfEnemies <= 0) // <-- начиная отсюда
waveNumber++;
waveText.text = "WAVES: " + waveNumber;
{ // точно не перепутали?

3)

4) Уверены, что хотите использовать while (true) {} ? Хорошенько подумайте, ведь это можно сделать иначе. Подсказка: события, корроутины.


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Воскресенье, 29 Апреля 2018, 19:06
alex9999Дата: Воскресенье, 29 Апреля 2018, 19:41 | Сообщение # 4
был не раз
Сейчас нет на сайте
Цитата Abel399 ()
// Не создавать новых врагов, пока не уничтожены старые
if (currentNumberOfEnemies <= 0) // <-- начиная отсюда
waveNumber++;
waveText.text = "WAVES: " + waveNumber;
{ // точно не перепутали?

У меня просто еще в коде есть ссылки на очки и волны появления врагов, я не удалил просто, не заметил))
Спасибо за ответ, я поменял свою строку: if (currentNumberOfEnemies <= 0) на вашу: if (currentNumberOfEnemies > 0) continue; при запуске игры после спавна 10-го врага юнити просто мертво зависает пока не завершить процесс из диспетчера задач, может нужно еще что то добавить в код и еще, не подскажете как сделать чтобы после смерти игрока спавн прекращался?


Unity the best

Сообщение отредактировал alex9999 - Воскресенье, 29 Апреля 2018, 20:21
BrightSpotДата: Воскресенье, 29 Апреля 2018, 21:12 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
поменяй
Код
if (currentNumberOfEnemies > 0) continue;

на
Код
if (currentNumberOfEnemies > 0)
{
yield return null;
continue;
}

и почитай про корутины и их назначение...



Более мощный компьютер глючит быстрее и точнее.


Сообщение отредактировал BrightSpot - Воскресенье, 29 Апреля 2018, 21:17
alex9999Дата: Воскресенье, 29 Апреля 2018, 22:02 | Сообщение # 6
был не раз
Сейчас нет на сайте
Цитата BrightSpot ()
if (currentNumberOfEnemies > 0)
{
yield return null;
continue;
}

спасибо, все работает, а не подскажите как прекратить спавн после смерти игрока?


Unity the best
BrightSpotДата: Понедельник, 30 Апреля 2018, 00:56 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Цитата alex9999 ()
а не подскажите как прекратить спавн после смерти игрока?

поставь перед
Код
if (currentNumberOfEnemies > 0)

проверку на смерть игрока типа:
Код
if (_hero.hp<=0)
yield break;// выход из корутины или просто break - выход из цикла, а корутина и так закончится...



Более мощный компьютер глючит быстрее и точнее.
alex9999Дата: Понедельник, 30 Апреля 2018, 20:49 | Сообщение # 8
был не раз
Сейчас нет на сайте
Цитата BrightSpot ()
_hero

А что вместо этого вставить? У меня есть скрипт PlayerScript на игроке и HealthScript(там как раз hp)


Unity the best

Сообщение отредактировал alex9999 - Понедельник, 30 Апреля 2018, 20:51
Abel399Дата: Понедельник, 30 Апреля 2018, 21:04 | Сообщение # 9
Surpass your limits. Right now.
Сейчас нет на сайте
alex9999,
1) Добавить public поле:
Код

...
public Transform enemy; // например, после этой строки добавить:
public HealthScript heroHealth;
...

И после в инспекторе перетащить игровой объект в это поле

2) Динамически получить объект. Как? Зависит от вашей архитектуры. Если есть некий синглтон GameManager, то через него, иначе - например, через теги:
Код
...
void Start()
{
  if (heroHealth == null) {
    heroHealth = GameObject.FindWithTag('Player').GetComponent<HealthScript>();
  }
  ...
}
...


Ninja Slayer - 2D Physics Puzzle [cancelled]
alex9999Дата: Понедельник, 30 Апреля 2018, 21:35 | Сообщение # 10
был не раз
Сейчас нет на сайте
Спасибо всем отозвавшимся, проблема решена

Unity the best

Сообщение отредактировал alex9999 - Воскресенье, 06 Мая 2018, 19:12
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг