134 lines
4.3 KiB
C#
134 lines
4.3 KiB
C#
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<Rigidbody2D>();
|
|
animator = GetComponent<Animator>();
|
|
|
|
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<Rigidbody2D>();
|
|
PlayerController playerController = playerObj.GetComponent<PlayerController>();
|
|
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
|
|
{
|
|
//GameManager.Instance.ResetLevel();
|
|
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;
|
|
|
|
// --- 1. Нарисуем конус обзора ---
|
|
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));
|
|
|
|
// Полукруг радиуса viewDistance
|
|
Gizmos.DrawWireSphere(origin, viewDistance);
|
|
|
|
// --- 2. Нарисуем луч до игрока ---
|
|
if (distanceToPlayer <= viewDistance)
|
|
{
|
|
Gizmos.color = Color.red;
|
|
Gizmos.DrawLine(origin, playerObj.transform.position);
|
|
|
|
// Если хотим показать «RaycastHit»:
|
|
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);
|
|
}
|
|
|
|
}
|