Enemy AI to Discover Waypoints

Dear Coders,
I have coded for Waypoints to be Instantiated at random points along my plane :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class WaypointManager : MonoBehaviour {

	public Transform wayPointManager; 
	public GameObject wayPoint; 
	public List<GameObject> wayPoints = new List<GameObject>();

	public float timer;
	float x; 
	float y;
	float z; 

	void Start ()
	{

		wayPoint = GameObject.FindGameObjectWithTag("WayPoint");

		wayPoints.Add (wayPoint); 

	
	}

	void Update (){

		x = Random.Range(-500, 500);
		y = Random.Range (1, 5); 
		z = Random.Range(-500, 500);

		timer += Time.deltaTime;

		if (timer > 1.0f) {
			GenerateARandomWayPoint (); 
			timer = 0f;
		}
			
		if (wayPoints == null || wayPoints.Count == 0)
		{
			wayPoints.Add (GenerateARandomWayPoint());
		}

	}

	public GameObject GenerateARandomWayPoint(){
	


		bool setRelativeToWorld = true; 
		GameObject clone = Instantiate (wayPoint,wayPointManager,setRelativeToWorld) as GameObject;
		//Instantiate (wayPoint,wayPointManager,setRelativeToWorld) as GameObject;
		wayPoint.transform.position = new Vector3 (x,y,z);
		return clone; 
	
	}
}

I am trying to code for instantiated enemies to recognise these waypoints and navigate along the waypoints randomly. I’m having quite a bit of difficulty with this step and the script for enemy waypoint recognition is as follows :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class  RandomEnemyWander : MonoBehaviour {

	public float timer;
	private NavMeshAgent patrol; 
	public GameObject [] points; 
	 

	void Start ()
	{
		
		patrol = GetComponent<NavMeshAgent> ();

		GameObject [] points = GameObject.FindGameObjectsWithTag("WayPoint");

		Transform[] wayPoints = new Transform [points.Length]; 

		for (int i = 0; i < points.Length; i++) {
			
			wayPoints  _= points *.transform;*_

* }*

* }*

* void Update ()*
* {*
* wayPointList ();*

* }*

* void wayPointList ()*
* {*

* GameObject[] points = GameObject.FindGameObjectsWithTag (“WayPoint”);*

* Transform[] wayPoints = new Transform [points.Length];*

* for (int i = 0; i < points.Length; i++) {*

wayPoints = points .transform;

* }*
* }*
}

So in essence I want the enemy to recognise when a waypoint has been generated and to add this to a list of waypoints that it can randomly follow.
Could somebody help?
Thanks!

@ShadoX

Thanks for the reply. Would you be able to elaborate? I’ve been tinkering with the code but nothing seems to be working!

Thanks

@ShadoX

Thanks for your help.

So this is what I have so far -

Firstly a cleaner script for the waypoint manager :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.AI;

public class WaypointList : MonoBehaviour {

	public GameObject _gameObject;  
	public List<GameObject> _list = new List<GameObject>();
	public float timer;
	float x; 
	float y;
	float z; 

	void Start (){


	}

	void Update ()
	{

		List<GameObject> _list = new List<GameObject>();

		timer += Time.deltaTime;

		if (timer > 1.0f) {
			WaypointGenerate();
			timer = 0f;
		}


		x = Random.Range(-500, 500);
		y = Random.Range (1, 5); 
		z = Random.Range(-500, 500);
	}

	void WaypointGenerate ()
	{
		GameObject clone = Instantiate (_gameObject) as GameObject;
		clone.transform.position = new Vector3 (x,y,z);
		_list.Add (_gameObject); 
	
	}
}

and a script that allows the enemy to recognise the list :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.AI;

public class  RandomEnemyWander : MonoBehaviour {

	public float timer;
	private NavMeshAgent patrol; 
	public List<GameObject> points; 
	public GameObject wayPointManagerObject; 
	[HideInInspector] WaypointList wplist;  

	public int index; 
	GameObject currentPoint; 
	[HideInInspector] GameObject wpClone; 


	void Start ()
	{

		patrol = GetComponent<NavMeshAgent> ();
		wplist = wayPointManagerObject.GetComponent<WaypointList> (); 
		points = wplist._list;  
	 


	}

	void Update (){

		timer += Time.deltaTime;

		if (timer > 10.0f) {
			pickWayPoint (); 
			timer = 0f;
		}
			
	}

	public void pickWayPoint (){

		index = Random.Range (0, points.Count);
		currentPoint = points [index]; 
		patrol.destination = currentPoint.transform.position; 
	    Debug.Log (currentPoint.name); 


	}
}

These scripts are working beautifully. The enemy object generates a list of waypoints and can randomly pick an index in the list of waypoints. However theres another issue. The enemy only ever moves toward the original waypoint gameobject and none of the clones. So even though it can generate a random index in the waypoint list, it doesn’t want to move toward this. Instead, it just moves toward the original waypoint gameobject and stays there.

I’ve tried tinkering with the scripts - any suggestions?

Thankyou!