My wavesspawner script does a number of things, tracks enemies, awards nanites via the scoremanager when enemies get killled, deducts HP when enemies make it to the mainframe (the goal), etc. Everything in this script works great. What I am trying to add is an enemy that has its own spawner and creates replicants of itself.
I am having trouble with the UFOSpawner script (2nd one in this list) in adding active enemies to the wavespawner. When I add:
wavespawner2.Instance.ActiveEnemies.Add(EnemyEvent.enemyId, enemySpawned);
to the spawn section it does keep the level running, but when I kill the enemy it doesn’t end the level, nor does it give nanites or do damage to the mainframe. I have tried it a varries amount of ways with no luck, I don’t know what I am missing. I admit I barely understand how this works together as I am new to unity and C#. I have kinda been hammering my way through. Thanks all!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class wavespawner2 : MonoBehaviour
{
private static wavespawner2 instance;
public static wavespawner2 Instance
{
get { return instance; }
}
[System.Serializable]
public class wave
{
public string waveName;
public GameObject[] enemy;
public int count;
[Tooltip("Time between each spawn, lower = faster")]
public float rate;
public float waveTimer;
public Transform[] SpawnPos;
}
[Tooltip("Sign to turn on during the wave")]
public GameObject sign;
[Tooltip("The amount of gigabyte gained for winning with perfect state")]
[SerializeField] public int gigabyteForCleanWin;
[Tooltip("The amount of gigabyte gained for winning with less then perfect")]
[SerializeField] public int gigabyteForNormalWin;
[SerializeField] public int gigabyteForFail;
[SerializeField] public int levelunlock;
[SerializeField] public int startnanites;
public wave[] waves;
public float TimeBetweenWAves = 3f;
public bool spawn = true;
public bool wavespawn = true;
public int nextwave = 0;
private Dictionary<int, GameObject> activeEnemies;
public Dictionary<int, GameObject> ActiveEnemies { get => activeEnemies; set => activeEnemies = value; }
private Coroutine spawner;
private void Awake()
{
}
public void activate()
{
Debug.Log("Start spawning of " + gameObject.name);
sign.SetActive(true);
instance = this;
wavespawn = true;
nextwave = 0;
spawn = true;
ScoreManager.Instance.GainNanites(startnanites);
activeEnemies = new Dictionary<int, GameObject>();
if (spawner != null)
{
StopCoroutine(spawner);
}
spawner = StartCoroutine(DoSpawn());
}
public void StopSpawning()
{
if (spawner != null)
{
StopCoroutine(spawner);
spawner = null;
sign.SetActive(false);
}
}
IEnumerator DoSpawn()
{
while (nextwave <= waves.Length)
{
if (wavespawn)
{
yield return new WaitForSeconds(TimeBetweenWAves);
//set current wave data to HUD
if (nextwave < waves.Length)
{
SetWaveDataToHUD(waves[nextwave]);
}
for (int i = 0; i < waves[nextwave].count; i++)
{
{
yield return new WaitForSeconds(waves[nextwave].rate);
SpawnUnit(waves[nextwave].enemy[Random.Range(0, waves[nextwave].enemy.Length)], waves[nextwave]);
}
}
wavespawn = false;
}
yield return new WaitForSeconds(waves[nextwave].waveTimer);
if (nextwave + 1 > waves.Length - 1)
{
spawn = false;
yield break;
}
else
{
nextwave++;
wavespawn = true;
}
}
}
void SpawnUnit(GameObject enemy, wave _wave)
{
// Instantiate(enemy, _wave.SpawnPos.position, Quaternion.Euler(new Vector3(0, 180, 0)));
GameObject enemySpawned = Instantiate(enemy, _wave.SpawnPos[Random.Range(0, _wave.SpawnPos.Length)].position, Quaternion.Euler(new Vector3(0, 180, 0)));
EnemyEvent enemyEvent = enemySpawned.AddComponent<EnemyEvent>();
enemyEvent.MyEnemyId = ++EnemyEvent.enemyId;
enemyEvent.Agent = enemySpawned.GetComponent<NavMeshAgent>();
enemyEvent.OnEnemyStateChagned += OnEnemyStateChanged;
activeEnemies.Add(enemyEvent.MyEnemyId, enemySpawned);
}
public void ClearRemainingEnemies()
{
if (spawner != null)
{
StopCoroutine(spawner);
}
if (activeEnemies != null)
{
foreach (KeyValuePair<int, GameObject> enemy in activeEnemies)
{
if (enemy.Value != null)
{
Destroy(enemy.Value);
}
}
activeEnemies.Clear();
}
}
/// <summary>
/// Called by an enemy when it's state has changed
/// </summary>
/// <param name="currentEnemy">The current state an enemy has changed to</param>
private void OnEnemyStateChanged(int enemyobjectid, EnemyEvent.EnemyState currentEnemy)
{
switch (currentEnemy)
{
case EnemyEvent.EnemyState.DIED:
if (activeEnemies.ContainsKey(enemyobjectid))
{
activeEnemies.Remove(enemyobjectid);
}
if (ScoreManager.Instance != null)
{
ScoreManager.Instance.KilledAnEnemy();
}
else
{
Debug.LogError("There should be one ScoreManager script attached to a gameobject in your scene.");
}
break;
case EnemyEvent.EnemyState.REACHED_MAINFRAME:
if (activeEnemies.ContainsKey(enemyobjectid))
{
activeEnemies.Remove(enemyobjectid);
}
if (ScoreManager.Instance != null)
{
ScoreManager.Instance.EnemyReachedMainFrame();
}
else
{
Debug.LogError("There should be one ScoreManager script attached to a gameobject in your scene.");
}
break;
}
}
/// <summary>
/// Displays current wave data to the HUD
/// </summary>
/// <param name="waveData">The current wave</param>
private void SetWaveDataToHUD(wave waveData)
{
if (HUD.Instance != null)
{
HUD.Instance.SetWaveData(waveData);
// wavenumbersign.Instance.SetWaveData(waveData);
// else
// {
// Debug.LogError("There is no HUD script in the scene. Add the HUD prefab to your scene.");
// }
}
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
UFOSPAWNER:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UI;
public class ufospawner : MonoBehaviour
{
[System.Serializable]
public class wave
{
public GameObject[] enemy;
public int count;
public float rate;
public float waveTimer;
public Transform[] SpawnPos;
}
public wave[] waves;
public float TimeBetweenWAves = 3f;
public bool spawn = true;
public bool wavespawn = true;
public int nextwave = 0;
void Awake()
{
if (spawn)
{
StartCoroutine(DoSpawn());
}
}
IEnumerator DoSpawn()
{
while (nextwave <= waves.Length)
{
if (wavespawn)
{
yield return new WaitForSeconds(TimeBetweenWAves);
for (int i = 0; i < waves[nextwave].enemy.Length; i++)
{
for (int j = 0; j < waves[nextwave].count; j++)
{
yield return new WaitForSeconds(waves[nextwave].rate);
SpawnUnit(waves[nextwave].enemy[i], waves[nextwave]);
}
}
wavespawn = false;
}
yield return new WaitForSeconds(waves[nextwave].waveTimer);
if (nextwave + 1 > waves.Length - 1)
{
Debug.Log("waves completed");
spawn = false;
yield break;
}
else
{
nextwave++;
wavespawn = true;
}
}
}
void SpawnUnit(GameObject enemy, wave _wave)
{
GameObject enemySpawned = Instantiate(enemy, _wave.SpawnPos[Random.Range(0, _wave.SpawnPos.Length)].position, Quaternion.Euler(new Vector3(0, 180, 0)));
EnemyEvent enemyEvent = enemySpawned.AddComponent<EnemyEvent>();
enemyEvent.MyEnemyId = ++EnemyEvent.enemyId;
wavespawner2.Instance.ActiveEnemies.Add(EnemyEvent.enemyId, enemySpawned); // should add enemy to wavespawner
}
}