58 lines
1.9 KiB
C#

using UnityEngine;
public class MissileAim : AimBase
{
[Header("Настройки рейкаста")]
[SerializeField] private float maxDistance = 3000f;
[SerializeField] private LayerMask targetLayers = -1;
[SerializeField] private bool showDebugRay = true;
[SerializeField] private Color rayColor = Color.red;
[SerializeField] private Color hitColor = Color.green;
private Transform currentTarget;
private float lastCheckTime;
[SerializeField] private float checkInterval = 0.1f;
public override Transform Target => currentTarget;
private void Start()
{
lastCheckTime = Time.time;
}
private void Update()
{
// Оптимизация: проверяем не каждый кадр
if (Time.time - lastCheckTime >= checkInterval)
{
lastCheckTime = Time.time;
FindTarget();
}
}
private void FindTarget()
{
if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, maxDistance, targetLayers))
{
if (hit.collider.TryGetComponent(out Hitbox hitbox))
{
if (hitbox.Owner != null && hitbox.Owner.TryGetComponent(out EnemyShip ship) && ship.HealthComponent.Alive)
{
currentTarget = ship.transform;
if (showDebugRay)
Debug.DrawRay(transform.position, transform.forward * hit.distance, hitColor);
return;
}
}
currentTarget = null;
if (showDebugRay)
Debug.DrawRay(transform.position, transform.forward * hit.distance, rayColor);
}
else
{
currentTarget = null;
if (showDebugRay)
Debug.DrawRay(transform.position, transform.forward * maxDistance, rayColor);
}
}
}