- Home /
Enemy chasing the player ?
Hello
I'm creating a 2D game. I created some enemies(Ghost) and I want to do these enemies chase the player like Ghosts of Mario Bros for example.
If my player goes right or left of position enemy, I want rotate position y of enemy also.
How can I do this ?
I'm trying this.
public class GhostEnemy : MonoBehaviour {
//player
private Transform player;
//ghost
public Transform ghost;
public float moveSpeed;
private bool chasing = false;
// Use this for initialization
void Start () {
player = GameObject.Find("PlayerObject").transform;
}
// Update is called once per frame
void Update () {
chasingPlayer();
}
private void chasingPlayer(){
//distance of ghost and player
float distance = Vector2.Distance(ghost.position, player.position);
if(chasing){
//rotate ghost
Vector3 dir = player.position - ghost.position;
float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
//attack player
Vector3 dir = player.position - ghost.position;
dir.Normalize();
ghost.position += dir * moveSpeed * Time.deltaTime;
//distance > range, chasing false
if(distance > 10f){
chasing = false;
}
}else{
//distance < range, chasing true(attack player)
if(distance < 5f){
chasing = true;
}
}
}
}
Answer by ferpa · Oct 16, 2014 at 01:11 PM
hi, I solved the problem.
I did this.
public class GhostEnemy : MonoBehaviour {
//player
private Transform player;
//ghost
public Transform ghost;
public float moveSpeed;
private bool chasing = false;
private Vector3 ghostPosition;
// Use this for initialization
void Start () {
player = GameObject.Find("PlayerObject").transform;
ghostPosition = ghost.position;
}
// Update is called once per frame
void Update () {
chasingPlayer();
}
private void chasingPlayer(){
//distance of ghost and player
float distance = Vector2.Distance(ghost.position, player.position);
if(chasing){
//attack player
Vector3 dir = player.position - ghost.position;
dir.Normalize();
ghost.position += dir * moveSpeed * Time.deltaTime;
//rotate ghost
if(ghost.position.x >= player.position.x){
ghost.eulerAngles = new Vector2(0,0);
}else{
ghost.eulerAngles = new Vector2(0,180);
}
//distance > range, chasing false
if(distance > 10f){
ghost.position = ghostPosition;
chasing = false;
}
}else{
//distance < range, chasing true(attack player)
if(distance < 5f){
chasing = true;
}
}
}
}
Answer by RayJr · Oct 16, 2014 at 01:07 PM
You can try this. Its working for me to reverse my sprites running annimation when he turns the other way.. Its' from this video. He explains how it works around the 42 minute mark.
https://unity3d.com/learn/tutorials/modules/beginner/2d/2d-controllers
Your answer
Follow this Question
Related Questions
Multiple resolutions considerations for Sprite Manger 2 0 Answers
How to get the position that is closest to a target within a given radius 0 Answers
How to calculate projectile range 2 Answers
Object instantiates on top of the previous object 2 Answers
Checking to see if a position is occupied by a GameObject 2 Answers