using UnityEngine; [RequireComponent(typeof(Rigidbody2D))] public class EnemyController : MonoBehaviour { public GameObject playerObj; public float viewDistance = 5f; public float viewAngle = 60f; public float moveSpeed = 3f; public float acceleration = 10f; private LayerMask obstacleMask; private Animator animator; private Rigidbody2D rb; private Vector2 targetVelocity = Vector2.zero; void Start() { rb = GetComponent(); animator = GetComponent(); playerObj = GameManager.Instance.playerObj; if (playerObj == null) { playerObj = GameObject.FindGameObjectWithTag("Player"); //Debug.Log("Player not found!"); } } void FixedUpdate() { if (playerObj != null && PlayerInSight()) { //Debug.Log("Scanned player"); //Debug.Log($"Player: {player}\n PlayerInSight: {PlayerInSight()}"); Vector2 dir = ((Vector2)playerObj.transform.position - rb.position).normalized; targetVelocity = dir * moveSpeed; } else { //Debug.Log("No player in sight"); targetVelocity = Vector2.zero; } rb.linearVelocity = Vector2.MoveTowards(rb.linearVelocity, targetVelocity, acceleration * Time.fixedDeltaTime); animator.SetFloat("Speed", Mathf.Abs(targetVelocity.magnitude)); } private bool PlayerInSight() { Transform player = playerObj.transform; Vector2 directionToPlayer = player.position - transform.position; float distanceToPlayer = directionToPlayer.magnitude; if (distanceToPlayer > viewDistance) return false; float angle = Vector2.Angle(transform.right, directionToPlayer); if (angle > viewAngle / 2f) return false; RaycastHit2D hit = Physics2D.Raycast(transform.position, directionToPlayer.normalized, distanceToPlayer, obstacleMask); if (hit.collider != null && hit.collider.transform != player) return false; return true; } void OnCollisionEnter2D(Collision2D collision) { if (collision.collider.CompareTag("Player")) { Rigidbody2D playerRb = collision.collider.GetComponent(); PlayerController playerController = playerObj.GetComponent(); if (playerRb == null) return; Vector2 contactNormal = collision.GetContact(0).normal; if (contactNormal.y < -0.5f) { playerRb.linearVelocity = new Vector2(playerRb.linearVelocity.x, 35f); Die(); } else { playerController.Die(); } } else if (collision.collider.CompareTag("Projectile")) Die(); } private void OnDrawGizmos() { if (playerObj == null) return; Vector2 origin = transform.position; Vector2 directionToPlayer = (playerObj.transform.position - transform.position); float distanceToPlayer = directionToPlayer.magnitude; Vector2 rightDir = Quaternion.Euler(0, 0, +viewAngle / 2f) * transform.right; Vector2 leftDir = Quaternion.Euler(0, 0, -viewAngle / 2f) * transform.right; Gizmos.color = Color.yellow; Gizmos.DrawLine(origin, origin + (rightDir * viewDistance)); Gizmos.DrawLine(origin, origin + (leftDir * viewDistance)); Gizmos.DrawWireSphere(origin, viewDistance); if (distanceToPlayer <= viewDistance) { Gizmos.color = Color.red; Gizmos.DrawLine(origin, playerObj.transform.position); RaycastHit2D hit = Physics2D.Raycast(origin, directionToPlayer.normalized, distanceToPlayer); if (hit.collider != null) { Gizmos.color = Color.green; Gizmos.DrawSphere(hit.point, 0.05f); } } } void Die() { Destroy(gameObject); } }