반응형

 

 

 

 

동적 오브젝트인 경우 라이트맵을 사용하기 힘들다. (라이트 프로브를 안쓴 경우..)

그렇기 때문에 동적으로 생성하는 오브젝트는 라이트를 이용하는 쉐이더를 사용해야하는데 모바일 단말에서는 드로우콜 부하가 영향을 주므로 쉐이더 사용을 최소한으로 해야한다.

다음은 유니티가 제공하는 모바일용 기본 쉐이더에 대한 설명이다.

※※ 현재 사용하는 것 위주로 작성

 

 

 

Mobile/Particles/Additive

- 보통의 파티클 쉐이더와 다르게 알파 테스트, 컬러마스크, 소프트 파티클 등의 기능을 지운 경량판이다.

- 전체적으로 더해진 상태로 표시된다.

※※ Fog 사용시 수치조절을 잘 하지 않으면 비정상적으로 렌더링된다. (이런 경우 그냥 레거시 쉐이더에 있는 Additive사용함..)

 

 

 

Mobile/Particles/Alpha Blended

- 보통 파티클 쉐이더와 비교해서 알파 테스트, 컬러마스크, 소프트 파티클 등의 기능을 지운 경량판이다.

- 반투명으로 표시되므로 투과 이미지를 설정해야한다.

- Transparent와 비슷하지만, 이것은 양면 폴리곤으로 표시한다.

 

 

 

Mobile/Particles/Multiply

- 보통 파티클 쉐이더와 비교해서 알파 테스트, 컬러마스크, 소프트 파티클 등의 기능을 지운 경량판이다.

- 전체적으로 곱해진 상태로 표시된다.

 

 

 

Mobile/Paricles/VertexLit Blended

- 반투명의 양면 폴리곤으로, 그려지는 것 외에는 전후 관계를 갖지 않으므로 보통 VertexLit과는 역할이 다르다.

- 파티클에 라이트를 적용시키고자 할 때 사용한다.

 

 

 

Mobile/Diffuse

- 다양한 라이트를 지원한다.

- 정점(Vertex) 단위로 음영을 넣으므로 고속으로 동작한다.

- 하나의 라이트만 정확히 그려지고 나머지 라이트는 정밀도를 낮춰서 그린다.

 

 

 

Mobile/Bumped Diffuse

- Point light, Directional light 외에는 지원하지 않는 픽셀 단위로 음영을 넣는다.

- 노멀 맵을 사용할 수 있어서 표현의 폭이 넓다.

- 하나의 라이트만 정확하게 그려지고 나머지 라이트는 정밀도를 낮춰서 그린다.

 

 

 

Mobile/Bumped Specular (1 Directional Light)

- Bumped Diffuse와 차이는 거의 없는데 라이트를 1개만 지원함으로써 경량화한 것이다.

 

 

 

 

반응형
반응형

 

 

 

 

기본 개념은 다음 글에서 참고

 

[유니티] 오클루전 컬링 - 기본 개념

오클루전 컬링 - 오클루전 컬링은 어떤 게임 오브젝트가 다른 게임오브젝트에 의해 카메라 뷰에서 완전히 가려진 게임 오브젝트에 대한 렌더링 계산을 수행하지 못하도록 하는 프로세스이다. -

srdeveloper.tistory.com


 

 

 

다음은 오클루전 컬링 설정을 위한 예시이다.

위 그림에서 Wall 게임 오브젝트는 정적 게임오브젝트, Ball은 동적 게임오브젝트로 오클루전 컬링을 설정해 볼것이다.

 

 

 

카메라 설정

- 카메라 컴포넌트에서 Occlusion Culling 플래그를 활성화 시켜준다.

 

 

 

Wall 게임오브젝트

- 정적 게임오브젝트로 컬링 데이터를 베이크할 것이기 때문에 렌더러에서 Dynamic occlusion 플래그를 활성화시켜줄 필요는 없다.

- 게임 오브젝트의 Static 옵션에서 Occluder StaticOccludee Static 선택해준다.

※※ 일반적으로 정적 오브젝트는 일일이 선택하기보다는 모든 종류의 Static을 선택해주는데 여기서는 그렇게 하지 않았다.

 

 

 

Ball 게임 오브젝트

- 동적 게임오브젝트로 설정해야하므로 렌더러에서 Dynamic occlusion 플래그를 활성화 시켜준다.

 

 

 

 

오클루전 컬링 창

- 상단 메뉴에서 WindowRenderingOcclusion Culling을 눌러 오클루전 컬링 창을 연다.

- Bake 카테고리를 눌러 각 옵션을 설정해주는데 옵션별 기능은 다음과 같다.

 

  • Smallest Occluder

- 다른 게임 오브젝트를 가릴 수 있는 가장 작은 게임 오브젝트의 크기(M단위)이다.

- 일반적으로 가장 작은 파일 크기와 가장 빠른 베이크 시간을 위해 씬에서 최상의 결과를 제공하는 가장 높은 값을 선택해야한다.

  • Smallest Hole

- 카메라가 들여다 볼 수 있는 가장 작은 간격의 직경(M단위)이다.

- Smallest Occluder와 같이 최상의 결과를 제공하는 높은 값을 선택하는 것이 좋다.

  • Backface Threshold

- 베이크 된 크기를 줄여야 하는 경우 유니티는 베이크할 때 씬을 샘플링하고, 표시되는 오클루더 지오메트리가 특정 비율의 후면 이상으로 구성된 씬의 일부를 제외할 수 있다.

- 높은 비율의 후면이 있는 영역은 지오메트리 아래 또는 내부에 있을 가능성이 높으므로, 런타임 시점에 카메라가 있을 가능성이 낮다.

- 기본값 100은 데이터에서 영역을 제거하지 않는다. 값을 낮추면 파일 크기가 작아지지만, 시각적 결함이 발생할 수 있다.

 

 

 

베이크

- 가볍게 사용법을 파악하기 위한 글이니, Smallest Occluder값을 1로 하고 베이크를 한다.

- 베이크를 하게 되면, 프로젝트 창에는 씬의 이름으로 폴더가 생성되고 그 안에 컬링 데이터가 생성되어있는것을 확인할 수 있다.

- 오클루전 컬링이 적용된것을 눈으로 확인하고 싶으면 오클루전 컬링 창에서 Visualization을 선택하면 컬링 화면을 확인할 수 있다.

- 다음 사진과 같이 씬 뷰에서는 컬링된 결과를, Status창에서는 BatchesSaved by batching의 수치가 줄어든 것을 확인할 수 있다.

※※ 만약 Visualization을 눌러도 컬링이 되지 않는다면 카메라가 컬링 범위(노란색 범위)에 있는지 확인해볼 것. 카메라가 범위 밖으로 나가면 컬링 연산을 하지 않는다.

 

 

 

 

동적 오클루전(Dynamic Occlusion)

- 동적 게임오브젝트의 경우 오클루전 컬링을 하려면 Dynamic Occlusion 플래그를 활성화해야 한다고 언급했다.

- 만약 해당 플래그를 비활성화한 뒤, Visualization으로 확인해보면 다음과 같이 컬링이 되지않는것을 확인할 수 있다.

 

 

 

결과

 

 

 

 

추가 주의점

- Smallest Occluder의 값은 작을수록 컬링 정밀도가 올라가지만, 정밀도가 올라갈수록 데이터 크기가 늘어나고 연산 오버헤드가 발생하므로 적절한 수치를 적용하는것이 좋다. (이러한 경험적으로 얻는 수치를 매직 넘버라고 부른다.)

- 야외 씬과 같은 경우 폐쇠되지 않고 오픈되어있는 환경이기 때문에 오클루전 컬링이 그다지 효율적이지 않다.

 

 

 

 

 

반응형
반응형

 

 

 

 

오클루전 컬링

- 오클루전 컬링은 어떤 게임 오브젝트가 다른 게임오브젝트에 의해 카메라 뷰에서 완전히 가려진 게임 오브젝트에 대한 렌더링 계산을 수행하지 못하도록 하는 프로세스이다.

- 기본적으로 카메라 컴포넌트에 있는 Clipping planes의 값을 설정해 절두체 컬링을 할 수 있지만 절두체 컬링은 렌더러가 다른 게임 오브젝트에 가려져있는지 확인하지 않으므로 유니티에서 최종 프레임에 표시되지 않는 렌더러에 대한 렌더링 작업에 CPU 및 GPU 시간을 낭비할 수 있기때문에 오클루전 컬링으로 이러한 낭비를 방지한다.

 

 

 

오클루전 컬링의 작동 방식

- 유니티에서 씬에 대한 데이터를 생헝한 후 런타임 시점에서 해당 데이터를 사용하여 카메라가 볼 수 있는 요소를 결정한다. (베이크)

- 오클루전 컬링 데이터를 베이크하면 유니티는 씬을 셀로 나누고 셀 내 지오메트리와 인접 셀 간의 가시성을 설명하는 데이터를 생성한 뒤, 생성된 데이터의 크기를 줄이기 위해 가능한 경우 셀을 병합한다.

- 런타임 시점에서 유니티가 베이크된 데이터를 메모리에 로드하고, 오클루전 컬링 프로퍼티가 활성화된 각 카메라에 대해 해당 데이터에 대한 쿼리를 수행하여 카메라가 볼 수 있는 요소를 결정한다.

- 오클루전 컬링이 활성화 되면 카메라는 절두체 컬링과 오클루전 컬리을 둘 다 수행하게 된다.

 

 

 

오클루전 컬링 사용 시기

- 낭비되는 렌더링 작업을 방지하게 되면 CPU 및 GPU 시간 모두 절약할 수 있다.

- 유니티의 빌트인 오클루전 컬링은 CPU에서 런타임 계산을 수행하므로 절약되는 CPU 시간을 오프셋할 수 있다. 따라서 오클루전 컬링을 사용하면 오버드로우로 인해 프로젝트가 GPU 바운드일 떄 성능이 향상될 가능성이 매우 높다.

- 오클루전 컬링 데이터는 런타임 시점에서 메모리에 로드되므로 디바이스에 해당 데이터를 로드할 만큼 충분한 메모리가 있는지 확인해야한다.

- 오클루전 컬링은 작고 윤곽이 또렷한 영역이 견고한 게임 오브젝트에 의해 서로 명확하게 분리된 씬에서 잘 작동한다. (복도로 연결된 방을 예로 들 수 있다.)

- 오클루전 컬링을 사용하여 동적 게임 오브젝트를 가릴 수 있지만, 동적 게임 오브젝트는 다른 게임 오브젝트를 가릴 수 없다. 프로젝트가 런타임에 씬 지오메트리를 생성하는 경우에는 해당 기능이 프로젝트에 적합하지 않다.

 

 

 

오클루더(Occluder), 오클루디(Occludee), 동적 오클루전(Dynamic occlusion)

- 오클루더(Occluder) : 다른 렌더러를 가리는 게임오브젝트 (정적 게임 오브젝트)

- 오클루디(Occludee) : 다른 게임오브젝트에 의해 가려지는 렌더러 (정적 게임 오브젝트)

- 동적 오클루전(Dynamic occlusion) : 동적 게임 오브젝트인 경우 오클루더에 의해 컬링 되려면 렌더러에서 해당 플래그를 활성화 시켜야한다.

※※ 동적 게임 오브젝트의 경우, 오클루전 컬링 데이터에 베이크할 수 없다. 그렇기 때문에 동적 오클루전 플래그를 활성화하여 오클루더가 해당 렌더러를 가릴 때 컬링할 수 있도록 해준다.

※※ 동적 게임 오브젝트는 오클루디일 수는 있지만 오클루더일 수는 없다.

 

 

 

 

추가 문서

 

오클루전 컬링 - Unity 매뉴얼

오클루전 컬링은 Unity가 다른 게임 오브젝트에 의해 뷰에서 완전히 가려진(오클루전된) 게임 오브젝트에 대한 렌더링 계산을 수행하지 못하도록 하는 프로세스입니다.

docs.unity3d.com

 

 

[유니티] 오클루전 컬링 - 설정

기본 개념은 다음 글에서 참고 [유니티] 오클루전 컬링 - 기본 개념 오클루전 컬링 - 오클루전 컬링은 어떤 게임 오브젝트가 다른 게임오브젝트에 의해 카메라 뷰에서 완전히 가려진 게임 오브젝

srdeveloper.tistory.com

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

파티클 옵션

 

 

 

 

참고 사이트

- UnitychanKAGURA

 

ユニティちゃんKAGURA(URP) - ダウンロード - UNITY-CHAN! OFFICIAL WEBSITE

2018年末のイベントに登場した和装のユニティちゃんです。Unite In The Skyのリミックス曲と振り袖にあわせた新たなダンス、和風のステージデータも同梱されています。 Unity2019.4.16f1, Universal Ren

unity-chan.com

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

 

제작기간

- 약 8주

 

 

 

구현내용

  • UI

- Safe area를 활용하여 펀치홀(노치) 기종에 UI가 겹치지 않도록 조정

- 커스텀 버튼, 슬라이더 구현하여 적용

  • Game

- 제스처 기능(카메라 이동, 줌) 적용

- A* 알고리즘 적용 (OpenList에 Heap 적용)

- 싱글톤(Manager class), FSM(Unit) 디자인패턴 적용

  • Data

- Player data : JsonUtility를 사용해 저장

- Game data(보상, 유닛 레벨, 능력치 등) : 엑셀로 테이블을 만들어 CSV파일로 관리

- Encryption : JSON과 CSV 등 모든 데이터를 라인달(AES) 암호화를 통해 암호화, 복호화하여 저장하고 불러온다

 

 

 

최적화

- SpriteAtals를 활용하여 Batch 줄임

- A* 알고리즘에서 OpenList와 CloseList에 발생하는 GC로 인해 프레임 드랍 발생하여 각 리스트에서 발생하는 할당을 줄여서 프레임 드랍 완화

 

 

 

 

 

반응형

'Game > Personal development' 카테고리의 다른 글

[Unity] 두더지 잡기 게임 제작  (0) 2022.04.28
[Unity] 미로 게임 제작  (0) 2022.04.28
[WIN API] 서커스 찰리 게임  (0) 2022.02.05
[WIN API] 카드 맞추기 게임  (0) 2022.01.30
산성비 게임 제작 (C++)  (4) 2022.01.23

+ Recent posts