- Home /
Enemy Follow Player and a path with IEnumerator
Greetings. I would like to make the enemy follow a path at the start of the scene, and when the player walk into the sight of the enemy, the enemy will ignore the path and go chase the player. Then if the player walked away the enemy will go back to the path. I have made a set of empty object to be the path and the script below is enemy movement script, but the enemy is just ignoring the player. I think the problem is from IEnumerator FollowPlayer(), but I just can't find it out...The script look like this: public class monsterMovement : MonoBehaviour {
public Transform pathHolder;
public float speed = 5;
public float waitTime = .3f;
public float chaseSpeed = 10;
float viewAngle;
Transform player;
public float minDist;
public float maxDist;
public Light spotlight;
public float viewDistance;
public LayerMask viewMask;
public int targetWayPointIndex = 0;
public Vector3 targetWaypoint;
Vector3[] waypoints;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
viewAngle = spotlight.spotAngle;
waypoints = new Vector3[pathHolder.childCount];
for (int i = 0; i < waypoints.Length; i++)
{
waypoints[i] = pathHolder.GetChild(i).position;
waypoints[i] = new Vector3(waypoints[i].x, transform.position.y, waypoints[i].z);
}
StartCoroutine(FollowPath(waypoints));
}
void Update()
{
if (CanSeePlayer())
{
FollowPlayer();
}
}
IEnumerator FollowPlayer()
{
StopCoroutine(FollowPath(waypoints));
while (true)
{
transform.LookAt(player);
if(Vector3.Distance(transform.position,player.position) > minDist)
{
transform.position = Vector3.MoveTowards(transform.position, player.position, chaseSpeed * Time.deltaTime);
}
if (Vector3.Distance(transform.position,player.position) < maxDist)
{
yield return StartCoroutine(FollowPath(waypoints));
}
}
}
bool CanSeePlayer()
{
if(Vector3.Distance(transform.position,player.position)< viewDistance)
{
Vector3 dirToPlayer = (player.position - transform.position).normalized;
float angleBetweenMonsterAndPlayer = Vector3.Angle(transform.forward, dirToPlayer);
if(angleBetweenMonsterAndPlayer < viewAngle / 2)
{
if(!Physics.Linecast(transform.position,player.position, viewMask))
{
Debug.Log(player.position);
return true;
}
}
}
return false;
}
IEnumerator FollowPath(Vector3[] waypoints)
{
while (true)
{
transform.position = Vector3.MoveTowards(transform.position, targetWaypoint, speed * Time.deltaTime);
if (transform.position == targetWaypoint)
{
targetWayPointIndex = (targetWayPointIndex + 1) % waypoints.Length;
targetWaypoint = waypoints[targetWayPointIndex];
yield return new WaitForSeconds(waitTime);
yield return StartCoroutine(TurnToFace(targetWaypoint));
}
yield return null;
}
}
I'm sorry about the long and messy script above.. But it will be thankful if anyone can help me solve this problem. Thank You!
Your answer
Follow this Question
Related Questions
Laggy Movement 1 Answer
Chopping Enemies in half. 1 Answer
Movement speed doesn't change with variable C# 1 Answer
Joystick movement getting stuck. Any Reason why? 0 Answers
How to make gameObject (moving in sin wave) reach target position? 1 Answer