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); } }