sega 23c305bc2c Реализована вражеская пушка
Стреляет как торпеда по прямой
2026-04-30 17:58:47 +03:00

55 lines
2.0 KiB
C#

using UnityEngine;
public class AimToPlayer : AimBase
{
[SerializeField] private LayerMask targetMask; // Слой Player
[SerializeField] private LayerMask obstaclesMask; // Слои препятствий (вода, стены)
[SerializeField] private float maxDistance = 3000f;
private Transform targetPoint;
private float lastCheckTime;
public override Transform Target => targetPoint;
private void Update()
{
Transform potentialTarget = GetTargetPoint();
if (potentialTarget != null && Time.time - lastCheckTime > 0.1f)
{
lastCheckTime = Time.time;
targetPoint = CanAcquireTarget(potentialTarget.position) ? potentialTarget : null;
//поворот в сторону цели
Vector3 directionToTarget = (potentialTarget.position - transform.position).normalized;
transform.rotation = Quaternion.LookRotation(directionToTarget, Vector3.up);
}
}
private Transform GetTargetPoint() =>
GameState.PlayerStateModel.PlayerComponent.EnemiesTarget;
private bool CanAcquireTarget(Vector3 target)
{
Vector3 direction = target - transform.position;
float distance = direction.magnitude;
if (distance > maxDistance) return false;
// Пускаем луч по всем слоям (targetMask + obstaclesMask + всё остальное)
if (Physics.Raycast(transform.position, direction, out RaycastHit hit, distance))
{
int hitLayer = hit.collider.gameObject.layer;
// Если попали в слой цели - успех
if ((targetMask & (1 << hitLayer)) != 0)
return true;
// Если попали в препятствие или любой другой слой - цель не достижима
return false;
}
// Луч ни во что не попал (пустота) - тоже не цель
return false;
}
}