Проблема
Вы проверяете наличие столкновений на SPAWNER;когда кто-то попадает в Спавнер, он начинает отсчитывать врагов.Но у Spawner нет скриншотов, поэтому его нельзя ударить.Код изменения сцены никогда не может быть вызван.
Таким образом, игра, основанная на коде, выглядит следующим образом:
- Spawn X врагов,
- Hit SpawnerX раз,
- (Удалено: уничтожить Спавнера)
- Изменить сцену.
Я предполагаю, что это концептуально неверно, и вы действительно хотите проверить столкновенияна порожденных врагах, которые затем подсчитывают количество уничтоженных врагов и изменяют сцену, когда они все мертвы.
Решение
Концептуально, что вы хотите:
- Spawn X врагов
- Подсчитать переменную для каждого врага
- При смерти врага отсчитать
- Когда 0, сменить сцену
Так, как мы это закодируем?
Ну, каждому врагу нужна ссылка на объект, который содержит счет.Вы можете сделать это несколькими способами, когда я лично делаю это, у меня обычно есть только один спавнер, который отвечает за всех, поэтому я делаю это синглтоном, на который можно ссылаться откуда угодно:
EnemySpawner
public class EnemySpawner : MonoBehaviour
{
public static Spawner Instance = null;
int CurrentNumOfEnemies = 0;
// ... etc
void Start()
{
if (Instance == null)
Instance = this;
// Spawn enemies like you do already, CurrentNumOfEnemies++ for every spawned
}
public OnEnemyDeath() {
CurrentNumOfEnemies--;
if (CurrentNumOfEnemies < 1)
{
// You killed everyone, change scene:
LevelManager.LoadLevel("Your Level");
}
}
}
Вражеский скрипт (я не знаю, как выглядит ваш текущий код, но вот минимальное решение, основанное на том, как я ДУМАЮ ваш код выглядит):
void OnDestroy()
{
// This will run automatically when you run Destroy() on this gameObject
EnemySpawner.Instance.OnEnemyDeath(); // Tell the EnemySpawner that someone died
}
Этобудет работать только в том случае, если у вас есть только ОДИН спавнер.Если у вас их несколько, вам нужно будет отправить ссылку на экземпляр его создателя каждому появившемуся противнику.Я могу показать вам, как это сделать, если хотите.
Бонусное содержимое
LevelManager не обязательно должен быть в GameObject, вместо этого он может быть статическим:
- Удалите скрипт LevelManager из любого GameObject
- Измените свой код LevelManager на:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public static class LevelManager
{
public static void LoadLevel(string name)
{
Debug.Log("Level loading requested for" + name);
SceneManager.LoadScene(name);
}
}
Теперь вы можете использовать его из ЛЮБОГО, без необходимостиинициализировать ссылку на любой скрипт или GameObject:
LevelManager.LoadLevel("My Level");