55 lines
2.0 KiB
C#
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;
|
|
}
|
|
} |