250521 TIL

박소희·2025년 5월 21일

Unity_7기

목록 보기
93/94

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가 아니면 감지한 것이 아니게 수정했다.

0개의 댓글