NPC의 플레이어 감지 함수를 변경했다.
public bool IsPlayerInSight() //true -> 경계
{
Transform player = GameManager.Instance.Player.transform;
Vector3 directionPlayer = (player.position - stateMachine.npc.transform.position).normalized;
float angle = Vector3.Angle(stateMachine.npc.transform.forward, directionPlayer);
float distance = Vector3.Distance(stateMachine.npc.transform.position, player.position);
if (angle > stateMachine.npc.ViewAngle / 2f || distance > stateMachine.npc.ViewDistance)
{
return false;
}
//벽
Vector3 headPosition = stateMachine.npc.transform.position + new Vector3(0, 1.5f, 0);
Vector3 playerClosetPoint = stateMachine.npc.playerCollider.ClosestPoint(headPosition);
float sqrDistance = (playerClosetPoint - headPosition).sqrMagnitude;
Ray ray = new Ray(headPosition, directionPlayer);
RaycastHit[] hits = Physics.RaycastAll(ray, stateMachine.npc.ViewDistance, stateMachine.npc.layer);
if (hits.Length == 0)
{
return false;
}
Array.Sort(hits, (a,b) => a.distance.CompareTo(b.distance));
RaycastHit firstHit = hits[0];
if(firstHit.collider.gameObject.layer == LayerMask.NameToLayer("Player"))
{
if (GameManager.Instance.Player.isLockpick)
{
stateMachine.ChangeState(stateMachine.ActionState);
}
return true;
}
return false;
}
벽 넘어 플레이어가 감지되면 안돼서 Ray로 감지한 것들을 받아서 제일 가까운 것이 Player의 Layer가 아니면 감지한 것이 아니게 수정했다.