I have an enemy that follows or retreats from player based on the distance.
It all works fine until i make camera follow the player. When it does, enemy starts jittering while moving.
Here’s the scripts
Player Movement:
public class Movement : MonoBehaviour
{
public float moveSpeed = 5;
private Rigidbody2D rb;
[SerializeField] private Camera cam;
private Vector2 movement;
private Vector2 mousePos;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
cam = FindObjectOfType<Camera>();
}
private void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
}
private void FixedUpdate()
{
rb.AddForce(movement * moveSpeed, ForceMode2D.Impulse);
Vector2 lookDir = mousePos - rb.position;
float angle = Mathf.Atan2(lookDir.y, lookDir.x) * Mathf.Rad2Deg - 90;
rb.rotation = angle;
}
}
Camera follow:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CamScript : MonoBehaviour
{
private Camera cam;
private Transform playerPos;
private void Start()
{
cam = GetComponent<Camera>();
playerPos = GameObject.FindGameObjectWithTag("Player").transform;
}
private void Update()
{
transform.position = new Vector3(playerPos.position.x, playerPos.position.y, -10);
}
}
Enemy movement:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
[SerializeField] float speed = 3;
public bool isAggro = false;
private Rigidbody2D rb;
public Transform player;
[Header("Distances")]
[SerializeField] float followDistance;
[SerializeField] float retreatDistance;
private float distance;
private void OnEnable()
{
rb = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
if (!isAggro) return;
distance = Vector2.Distance(transform.position, player.position);
if (distance > followDistance)
{
rb.MovePosition(Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime));
}
else if (distance < retreatDistance)
{
rb.MovePosition(Vector2.MoveTowards(transform.position, player.position, -speed * Time.deltaTime));
}
}
}