inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

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

미해결

[유니티 3D] 실전! 생존게임 만들기 - Advanced

시야각 구현이 잘 안됩니다.. 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; } }

  • 케이디
  • unity
Lucyna 댓글 1 좋아요 0 조회수 630

인기 태그

인프런 TOP Writers

주간 인기글