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


시야각 구현이 잘 안됩니다..
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;
}
}
Answer 1
0
영상 속 돼지들과 똑같이 구현하길 원하시면
transform.position + transform.up + transform.forward
를
transform.position + transform.up
로 바꿔보세요
코드 파일
0
100
1
currentFireRate 질문
0
107
0
thePlayerController의 값이 갑자기 null로 바뀌는 현상이 발생합니다
0
223
1
인벤토리 끄고 퀵슬롯 아이템 드래그앤 드랍시 공격
0
256
1
멀티로 개발하고 싶으면 어떤것을 알아야할까요?
0
360
1
유니티 3d 터레인 브러쉬 문제
0
527
1
moveposition 문제
0
361
2
navigation bake한 후 오류
0
290
1
무기 교체 오류
0
521
1
gun애니메이션이 손만 작동하고 총은 가만히 있어요
0
313
1
34:49 내용 생략 부분
0
500
0
고화질 서비스 안되나요..
0
371
1
바닥에 있는 아이템이 사라지지 않습니다
0
334
1
전체 프로젝트 파일 받을 수 있을까요?
0
412
1
질문 있습니다
0
285
0
움직이며 정조준을 하니까 총의 포지션 값이 이상해지네요;; 어떻게 해결해야되나요?
0
240
0
Quaternion 값은 왜 곱하나요?
0
312
0
Hand를 main camera에 넣으면 오류가 생깁니다.
0
242
0
웨폰 매니저 강의중 똑같은 내용 영상 중복됨
0
266
0
공격성을 띄고있는 동물이 죽어도 계속 쫓아옵니다.
0
324
1
크로스헤어 문제
1
744
7
재장전을 하고나면 정조준 값은 똑같은데 위치가 바꿔저요
0
359
0
효과음 넣을 때 오류
0
447
1
강의 잘 듣고 있는데 질문거리가 많네요 ㅠㅠ
0
192
0

