Altri
How to make an enemy 2d chasing player?
I 'm doing a 2d platform game , I need to make enemies but do not know how. the enemy shall patrol and chase the player only when the player enters in the trigger of the enemy. i'd need a script because i am noob in c#. Sorry if I have not written correctly but i'm Italian. Thank you in advance. Please, is pretty urgent!
How simple is the platformer, Is it enough if the enemy simply move left/right depending where the player is?
If so you can have a check to see if player position.x is less than enemy position.x and change the direction of the enemy accordingly. This behavior could be activated by a trigger like you said.
You obviously need to handle things like gravity, jumping and the like but I'm guessing you have a system for that?
This is a very simple approach and if you require something more complex feel free to add some more info how your game is working currently when it comes to movement.
Answer by DFT-Games · Oct 30, 2015 at 08:38 PM
Well @thorr57,
what about my video in Italian about this? Sure, is 3D, but the system is identical, you only have to correct the target to ensure the correct plane is used ;)
Cheers
-Pino
I have already seen some tutorials from which I got this script
using UnityEngine;
using System.Collections;
using Pathfinding;
[RequireComponent (typeof(Rigidbody2D))]
[RequireComponent (typeof(Seeker))]
public class EnemyAI1 : $$anonymous$$onoBehaviour {
public Transform target;
public float UpdateRate =2f;
private Seeker seeker;
private Rigidbody2D rb;
public Path path;
public float speed = 300f;
public Force$$anonymous$$ode2D f$$anonymous$$ode;
[HideInInspector]
public bool pathIsEnded = false;
public float nextWaypointDistance = 3;
private int currentWaypoint = 0;
void Start ()
{
seeker = GetComponent <Seeker> ();
rb = GetComponent <Rigidbody2D> ();
if (target == null)
{
Debug.LogError ("No Player found, PANIC!");
return;
}
seeker.StartPath (transform.position, target.position, OnPathComplete);
StartCoroutine (UpdatePath ());
}
IEnumerator UpdatePath (){
if (target == null)
{
//TODO: Insert a player search here.
return false;
}
seeker.StartPath (transform.position, target.position, OnPathComplete);
yield return new WaitForSeconds (1f/UpdateRate);
}
public void OnPathComplete (Path p)
{
Debug.Log ("We got a path. Did it have an error?" + p.error);
if (!p.error)
{
path = p;
currentWaypoint = 0;
}
}
void FixedUpdate ()
{
if (target== null)
{
//TODO: Insert a player search here.
return;
}
//TODO: Always look at player?
if (path == null)
return;
if (currentWaypoint > - path.vectorPath.Count)
{
if (pathIsEnded)
return;
Debug.Log ("End of path reached");
pathIsEnded = true;
return;
}
pathIsEnded = false;
Vector3 dir = (path.vectorPath [currentWaypoint] -transform.position).normalized;
dir *= speed * Time.fixedDeltaTime;
rb.AddForce (dir, f$$anonymous$$ode);
float dist = Vector3.Distance (transform.position, path.vectorPath[currentWaypoint]);
if (dist < nextWaypointDistance) {
currentWaypoint++;
return;
}
}
}
but it does not work. the console does not have errors. where is the problem? Please, help!
Answer by Treyzania · Oct 30, 2015 at 08:41 PM
I would create attach a collider onto the enemy, in the shape of the region, and set it as a trigger. Then use some code like this in a script:
private bool seenPlayer = false;
void OnTiggerEnter() {
if (/* is it the player? */) seenPlayer = true;
}
void Update() {
if (seenPlayer) {
// do something
}
}
Then you would put whatever behavior you would like in place of the " // do something
". Just make sure that the player has a collider on it.
Follow this Question
Related Questions
How to make an enemy 2d chasing player? 1 Answer
How can I reset the score counter? 0 Answers
How do you make a random 2D shape in Unity? 0 Answers
Why won't my 2D Sprite Move? 1 Answer