본문 바로가기

Unity/Unity 기타

Unity3D- FieldOfView 시야구현(최종)

1.예외처리하기

 

지금까지 방식으로는 이전의 Ray와 바로 다음의 Ray 둘중 하나가 방해물에 충돌하지 않았을 경우에만 FindEdge()함수를 실행시켰다 

하지만 아래경우와 같이 서로 다른 방해물에 각각의 Ray가 충돌한 경우에도 FindEdge()함수를 실행시켜 사각의 시야를 없애주고싶다 따라서 FindEdge()함수의 실행조건을 추가해준다

 

 

- 우리가 원하는 것은 일종의 거리 임계 값을 구현하는 것

 

 

-DrawFieldOfView() 함수내부

 

 

 - FindEdge()함수 내부

 

 

 

 

 - EdgeDstTreshold를 0.8로 주었을때 결과 => 2개의 Ray가 모두 방해물에 맞은 경우에도 FindEdge()함수를 실행하여 시야각을 넓혔다

 

 

 

 

 

2. FindEdge()함수 로직 변경

지금까지 기존의 이전의 Ray와 바로 다음의 Ray가 둘 중 하나만 방해물과 충돌할 때에만 FindEdge()함수를 실행했었던 경우에서 추가로 서로 다른 두개의 방해물에 이전의Ray와 바로 다음의 Ray가 충돌한 경우까지 FindEdge()함수를 실행하겠다는 뜻이였고,

위의 코드변화만을 다시 보자면 기본적으로 FindEdge()함수의 실행로직이 변화하였다 이를 자세히 살펴보자

 

*그전에 플레이어의 총 시야각도를 mesh 해상도로 조각내어 DrawFieldOfView()에서 실제Ray가 발사될 방향을 그려보았는데 어느쪽에서부터 Ray가 발사되는지 테스트 해보기 위해 색을 입혀 본 결과

플레이어의 forward 기준 좌측에서 부터 차례대로 Ray를 쏘는 것을 확인했다

따라서 2개의 연속된 Ray만을 상대적으로 비교했을때 이전의 Ray인 좌측Ray가 항상 minRay가 되고

바로 다음의 Ray인 우측 Ray가 항상 maxRay가 된다  

 

EdgeDstThreshold=0인경우                                                       EdgeDstThreshold=1.5인경우

 

EdgeDstThreshold의 값 즉 임계거리값에 따라 최초 minRay(초록색)최초 maxRay(파랑색)사이의 실제로 FindEdge()함수에 의해서 새롭게 재설정된 minRay와 maxRay의 Point 위치가 달라지는 것을 볼 수있다.

 

아래코드에서 edgeDstThresHold(임계거리값)과 비교하는 대상은

첫번째로 이전의 Ray를 가르키는 minRay(초록색)의 길이와 바로다음의 Ray인 maxRay(파랑색)의 중간각도를 발사한 middleRay(최초 검정색)의 길이이며 이것을 시작으로 임계거리값을 초과 하였는지에 대한 조건을 추가한다

 

결론적으로는 반복문을 돌릴수록 새로운middleRay(검정)가 maxRay로 재설정되다가(minRay(초록)는 그대로, maxRay는 파랑에서부터 검정 , 빨강까지 차례대로 재설정), middleRay(빨강)길이minRay(초록)길이 차이가 임계거리값보다 작아지는 순간을 기점으로 아래코드의 첫번째 if문 조건에 부합하게 되면서 새로운 middleRay(분홍)가 minRay로 재설정되기 시작하여 기점이된 빨강Ray중심가장가까운 좌측 Ray가 maxRay가 되고 가장가까운 우측Ray가 minRay가 된다 

 

 

 

즉, 새로이 발사한 middleRay과 최초minRay의 거리차이가 임계거리값이 되는 지점과 가장 가까운 두 Ray의 Point를

반환받기 위해서는 middleRay와 minRay 길이차이가 임계거리값보다 작을때 middleRay가 minRay로 변하도록 코드조건을 바꿔주어야 했던것이다

 

'Unity > Unity 기타' 카테고리의 다른 글

Unity - 싱글톤패턴  (0) 2021.04.28
Unity - C# List정리  (0) 2021.04.23
Unity3D- fieldOfView 시야구현(3)  (0) 2021.04.06
Unity3D- FieldOfView 시야구현(2)  (0) 2021.04.05
Unity3D- DrawRay와 DrawLine 차이점  (0) 2021.04.04