• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

시야각 구현이 제대로 안되는데 어떻게 해결해야하나요.

21.06.12 17:17 작성 조회수 315

0

시야각 구현이 잘 안됩니다..

ViewAngle값을 아무리 많이 줘도 첫번째 스크린샷처럼 정면, 정면에서 진짜 살짝 벗어난정도 뺴고는 인식을 못합니다.

영상의 돼지들은 레이로 표시한 시야각만큼 플레이어를 인식 해주는것같은데 말이죠.. 코드를 어떻게 수정해야 제 문제를 해결할 수 있을까요?

현재 FOV의 코드는 다음과 같습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class FieldOfViewAngle : MonoBehaviour
{

    [SerializeField] private float viewAngle; // 시야각
    [SerializeField] private float viewDistance; // 시야거리
    [SerializeField] private LayerMask targetMask; // 타겟 마스크 (플레이어)

    private TPSCharacterController thePlayer;
    private NavMeshAgent nav;

    void Start()
    {
        thePlayer = FindObjectOfType<TPSCharacterController>();
        nav = GetComponent<NavMeshAgent>();
    }

    public Vector3 GetTargetPos()
    {
        return thePlayer.transform.position;
    }

    private Vector3 BoundaryAngle(float _angle)
    {
        _angle += transform.eulerAngles.y;
        return new Vector3(Mathf.Sin(_angle * Mathf.Deg2Rad), 0f, Mathf.Cos(_angle * Mathf.Deg2Rad));
    }

    public bool View()
    {
        Vector3 _leftBoundary = BoundaryAngle(-viewAngle * 0.5f);
        Vector3 _rightBoundary = BoundaryAngle(viewAngle * 0.5f);

        Debug.DrawRay(transform.position + transform.up + transform.forward, _leftBoundary, Color.red);
        Debug.DrawRay(transform.position + transform.up + transform.forward, _rightBoundary, Color.red);

        Collider[] _target = Physics.OverlapSphere(transform.position, viewDistance, targetMask);

        for (int i = 0; i < _target.Length; i++)
        {
            Transform _targetTf = _target[i].transform;
            if (_targetTf.name == "Character")
            {
                Vector3 _direction = (_targetTf.position - transform.position).normalized;
                float _angle = Vector3.Angle(_direction, transform.forward);

                if(_angle < viewAngle * 0.5f)
                {

                    if (Physics.Raycast(transform.position + transform.up + transform.forward, _direction, out RaycastHit _hit, viewDistance))
                    {
                        Debug.Log(_hit);
                        if (_hit.transform.name == "Character")
                        {
                            Debug.Log("플레이어가 소 시야내에 있습니다.");
                            Debug.DrawRay(transform.position + transform.up + transform.forward, _direction, Color.blue);
                            return true;
                        }
                    }
                }
            }

            if (thePlayer.GetRun())
            {
                if(CalcPathLength(thePlayer.transform.position) <= viewDistance)
                {
                    Debug.Log("동물이 주변에서 뛰고있는 플레이어의 움직임을 파악했습니다.");
                    return true;
                }
            }
        }
        return false;
    }

    private float CalcPathLength(Vector3 _targetPos)
    {
        NavMeshPath _path = new NavMeshPath();
        nav.CalculatePath(_targetPos, _path);

        Vector3[] _wayPoint = new Vector3[_path.corners.Length + 2];

        _wayPoint[0] = transform.position;
        _wayPoint[_path.corners.Length + 1] = _targetPos;


        float _pathLength = 0;
        for (int i = 0; i < _path.corners.Length; i++)
        {
            _wayPoint[i + 1] = _path.corners[i]; // 웨이포인트에 경로를 넣음.
            _pathLength += Vector3.Distance(_wayPoint[i], _wayPoint[i + 1]); // 경로 길이 계산.
        }

        return _pathLength;
    }
}

답변 1

답변을 작성해보세요.

0

hyeon님의 프로필

hyeon

2021.06.23

영상 속 돼지들과 똑같이 구현하길 원하시면

transform.position + transform.up + transform.forward

transform.position + transform.up

로 바꿔보세요