본문 바로가기

3D_FPS

08_17 (패트롤 기능구현, Occulusion , View Frustum Culling)

목차

 

 


Patrol 기능 구현

Patrol 기능

영역에서 랜덤한 포인트로 배회
다 지워놓고 Bake 해보자

Move 안에서 Patrol State 를 뽑아도 되고,

Move() 함수 내부에 작성.

패트롤 => 내가 랜덤으로 찍어준 값으로 이동해야하는데

내가 찍어준 값으로 이동가능한지 체크해야함

SamplePosition() 이다!

이동가능한지 체크 할 수 있는 네브메시 메소드

 


네비메쉬가 움직일 수 있는 위치를 가능한지 판단해주는 함수 구현

 

함수를 만들어보자!

함수 틀 작성 모습

네임스페이스 Using System; 을 지워줌!

Random 함수의 기능을 UnityEngine 네임스페이스꺼를  사용하고싶기 때문에!

 

함수

 

근데 이렇게 하면 지점에 갔다가 다른곳을로 가는게 아니라, 

계속 찾고 있음.

 

지정했던 지점에 도착 한 후, 그 다음 지점 을 찾게 해야함!

 

아직 이동할 곳을 못찾았다면

이동할 곳을 계속 찾고

 

찾으면

움직이게 해야함

 

여기서 Mission

 

사이 각을 구하면 됨!!

 

코사인 함수

내적을 취하면 cos(theta) 값을 구할 수 잇음!

이 코사인의 부호만 사용하면 됨!

즉, 코사인의 부호가 양수이면 -90~90 인거임!

 

cos(theta) 로 가시적으로 시야 구하기

이렇게 else 에 페트롤을 뺄 수도 있음!

 

그리고 if문에 거리와 내적값을 넣어줘서

구조를 따로 짤 수 있음!

 

 

좀더 가시적으로 볼 수 잇게 DrawLine 으로 그림!!

가시적으로 생김!

(참고)

이거 추가!


Occulusion Culling (최적화)

 

복잡도가 늘어나버리면 성능이 떨어짐!

 

그래서 이럴 때 속도와 성능을 어떻게 조절 할 수 있을까에 대해서 알아보자!

 

보이지 않는곳은 안그리게 해보자!!

culling (최적화)

view frustum culling

시야 밖에 있는것들은 안그려 버림

 

근데 안보이는데도, 시야 안에 있으면 굳이 그림...

차폐되서 가려진 애들을 culling 하는 기법이 있음!

 

이게 Occulusion Culling 이다!

이런식으로  큐브를 세세히 깔아보자

 

Environment 에 다 넣고

다 Static 체크 하고 네비게이션으로 처리!

복잡도가 높을때

원래는 기획적으로 봤을 때는 미리 위치를 찍어서 배열값으로 넣어주어 랜덤으로 뽑아서 쓰는게 훨씬 낫다!

 

 

오컬루젼 테스트를 위해서 이걸 그냥 true 로 바꿔보자!

 

 

차폐된곳은 안그리게 해주자!!

Occlusion Culling 을 연다

 

 

베이크!
메인카메라 시야에 있는 오브젝트만 나옴!

와.. 대박

 

장단점.

CPU가 알아서 해주는데, 덩어리가 클수록 알아보기 쉬울텐데

오브젝트가 작아지면 작아질 수록 CPU 가 연산량이 많아짐.

 

그렇기 때문에 오픈월드인데, 자잘한게 많으면 오히려 오래걸리게 됨!

 


View Frustum 컬링

여기서 Far 를 줄여서 하면 더 좋음!

Far 값을 늘리면 알다시피 멀리까지 보는 시야가 늘어난다!

 

 

큰박스 안에 작은 박스를 하나 넣어놨다.

 

Near 값을 늘리면

near 값을 늘리다보면

저기 박스 안에 있는 박스도 볼 수 있고

작은 박스가 보이는 모습

 

 

이렇게, Culling 에 Near, Far 를

그냥 카메라를 가까이 , 멀리 시키는게 아니라 

응용해서 좋은 효과를 구현 할 수 있다!

이런 연습을 많이 해보자!