EDIT: Nevermind! Solved it, I needed to re-drag the Wave configs onto the Enemy Spawner object in Inspector, somehow they had disappeared.
I will leave the initial question below just in case someone else has the same issue.
When I run my program at the 10 minute mark of the lecture, no enemies instantiate and the console gives me this error.
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRangeException (System.ExceptionArgument argument, System.ExceptionResource resource) (at :0)
System.ThrowHelper.ThrowArgumentOutOfRangeException () (at :0)
System.Collections.Generic.List`1[T].get_Item (System.Int32 index) (at :0)
EnemySpawner.Start () (at Assets/Scripts/EnemySpawner.cs:14)
Here is my EnemySpawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
[SerializeField] List<WaveConfig> waveConfigs;
int startingWave = 0; //(Sets startingWave to Wave1 Waveconfig i.e. element 0 in Player Spawner gameobject)
// Start is called before the first frame update
void Start()
{
Debug.Log("hello");
var currentWave = waveConfigs[startingWave]; //new variable created to track the current wave, initially set to starting wave as defined above
StartCoroutine(SpawnAllEnemiesInWave(currentWave)); //triggers spawn coroutine with current wave
}
private IEnumerator SpawnAllEnemiesInWave(WaveConfig waveConfig)
{
Instantiate(
waveConfig.GetEnemyPrefab(), //GetEnemyPrefab [waveConfig.cs method to instantiate enemy]
waveConfig.GetWaypoints()[0].transform.position, //GetWaypoints [waveConfig.cs method to get waypoints], [0] refers to the startingindex number which will be incremented
Quaternion.identity);
yield return new WaitForSeconds(waveConfig.GetTimeBetweenSpawns()); //runs the GetTimeBetweenSpawns method which returns the time for WaitForSeconds to use.
}
}
And here is my WaveConfig.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(menuName = "Enemy Wave Config")] //note this added line as well - seems to allow right clicking on the asset window to create new individual Wave Config files
public class WaveConfig : ScriptableObject //note that Monobehaviour has been changed to ScriptableObject (not sure why)
{
// the following are a bunch of variables that will be accessed by other scripts.
[SerializeField] GameObject enemyPrefab;
[SerializeField] GameObject pathPrefab;
[SerializeField] float timeBetweenSpawns = 0.5f;
[SerializeField] float spawnRandomFactor = 0.3f;
[SerializeField] int numberOfEnemies = 5;
[SerializeField] float moveSpeed = 2f;
// public methods allowing other scripts to access the above variables
public GameObject GetEnemyPrefab() { return enemyPrefab; }
//this method specifically creates a list of the transforms of each waypoint and returns it.
public List<Transform> GetWaypoints() //public list as it needs to be accessible from other scripts
{
var waveWaypoints = new List<Transform>(); //creates temporary variable which will inherit list
foreach (Transform child in pathPrefab.transform) //finds each child in the pathPrefab.transform (individual waypoints)
{
waveWaypoints.Add(child); //adds each waypoint the list
}
return waveWaypoints; // returns the list to the script that calls it.
}
public float GetTimeBetweenSpawns() { return timeBetweenSpawns; }
public float GetSpawnRandomFactor() { return spawnRandomFactor; }
public int GetNumberOfEnemies() { return numberOfEnemies; }
public float GetMoveSpeed() { return moveSpeed; }
}