I want to make enemy follow me when they see me and stop when i pressed a certain key. I’ve tried it and didn’t work. The enemy can follow me but it won’t stop when i pressed a key. This is my code:
public class SlithMovement : MonoBehaviour
{
private Animator sAnim;
private Transform target;
[SerializeField] private float speed;
[SerializeField] private float maxRange;
[SerializeField] private float minRange;
// Start is called before the first frame update
void Start()
{
sAnim = GetComponent<Animator>();
target = FindObjectOfType<PlayerMovement>().transform;
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(target.position, transform.position) <= maxRange && Vector3.Distance(target.position, transform.position) >= minRange)
{
FollowPlayer();
}
else
{
StopChasing();
}
}
public void FollowPlayer()
{
sAnim.SetFloat("directionX", (target.position.x - transform.position.x));
sAnim.SetFloat("directionY", (target.position.y - transform.position.y));
sAnim.SetBool("isMoving", true);
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, speed * Time.deltaTime);
}
public void StopChasing()
{
if (Input.GetKeyDown(KeyCode.G))
{
sAnim.SetBool("isMoving", false);
}
}
}
Currently the StopChasing method is called only if the player is not in range, since it’s in the else statement. Since I’m assuming that the enemy should stop chasing the player when the player is out of range I’d rewrite it as
public class SlithMovement : MonoBehaviour
{
private Animator sAnim;
private Transform target;
[SerializeField] private float speed;
[SerializeField] private float maxRange;
[SerializeField] private float minRange;
bool stopped = false;
// Start is called before the first frame update
void Start()
{
sAnim = GetComponent<Animator>();
target = FindObjectOfType<PlayerMovement>().transform;
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(target.position, transform.position) <= maxRange && Vector3.Distance(target.position, transform.position) >= minRange && !stopped)
{
FollowPlayer();
}
else
{
StopChasing();
}
if (Input.GetKeyDown(KeyCode.G))
{
StopChasing();
}
}
public void FollowPlayer()
{
sAnim.SetFloat("directionX", (target.position.x - transform.position.x));
sAnim.SetFloat("directionY", (target.position.y - transform.position.y));
sAnim.SetBool("isMoving", true);
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, speed * Time.deltaTime);
}
public void StopChasing()
{
sAnim.SetBool("isMoving", false);
stopped = true;
}
}
You have problem in StopChasing() because you are setting animation false. But enenmy still see you.
Let’s change like that. I just added one bool.
public class SlithMovement : MonoBehaviour
{
private Animator sAnim;
private Transform target;
[SerializeField] private float speed;
[SerializeField] private float maxRange;
[SerializeField] private float minRange;
private bool StopChk = true;
// Start is called before the first frame update
void Start()
{
sAnim = GetComponent<Animator>();
target = FindObjectOfType<PlayerMovement>().transform;
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(target.position, transform.position) <= maxRange && Vector3.Distance(target.position, transform.position) >= minRange)
{
if(StopChk){
FollowPlayer();
}
}
else
{
StopChasing();
}
}
public void FollowPlayer()
{
sAnim.SetFloat("directionX", (target.position.x - transform.position.x));
sAnim.SetFloat("directionY", (target.position.y - transform.position.y));
sAnim.SetBool("isMoving", true);
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, speed * Time.deltaTime);
}
public void StopChasing()
{
if (Input.GetKeyDown(KeyCode.G))
{
sAnim.SetBool("isMoving", false);
StopChk = false;
}
}
}
I’ve tried @lvjuvan method and it works perfectly! Thanks for the replies both of you!