58 lines
1.9 KiB
C#
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);
|
|
}
|
|
}
|
|
} |