2026-05-25 14:48:16 +03:00

78 lines
2.8 KiB
C#

using UnityEngine;
public class AimToPlayer : AimBase
{
[SerializeField] private LayerMask targetMask; // Слой Player
[SerializeField] private LayerMask obstaclesMask; // Слои препятствий (вода, стены)
[SerializeField] private float maxDistance = 3000f;
[SerializeField] private bool debug = false;
/*тест*/ [SerializeField] private Transform targetPoint;
private float lastCheckTime;
private Vector3 debugHitPoint;
public override Transform Target => targetPoint;
// Объединённая маска (targetMask + obstaclesMask)
private LayerMask combinedMask;
private void OnEnable()
{
// Вычисляем объединённую маску при включении объекта
combinedMask = targetMask | obstaclesMask;
//Debug.Log("Маска просчитана");
}
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() =>
G.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, combinedMask))
{
if (debug) debugHitPoint = hit.point;
int hitLayer = hit.collider.gameObject.layer;
// Если попали в слой цели - успех
if ((targetMask & (1 << hitLayer)) != 0)
return true;
// Если попали в препятствие или любой другой слой - цель не достижима
return false;
}
if(debug) debugHitPoint = transform.position + transform.forward * maxDistance;
// Луч ни во что не попал (пустота) - тоже не цель
return false;
}
private void OnDrawGizmosSelected()
{
if (!debug) return;
Gizmos.color = Target == null ? Color.red : Color.green;
Gizmos.DrawLine(transform.position, debugHitPoint);
}
}