✅ What I did today
- Udemy Course : Unity Lighting
📝 Things I Learned
🏷️ 유나이트 서울 2020 - 최대 성능을 위한 최적화 팁
https://www.youtube.com/watch?v=tT9LS53HRx4
Script
- Object Pooling 써라
- 게임에서 변하지 않는 데이터를 위한 클래스 작성할 때 MonoBehaviour 말고 Scriptable Object 써라
- 프로퍼티 대신 그냥 변수 써라. 프로퍼티 사용하면 함수 호출하는 거라 특히 Update()같은 곳에서 잦은 호출할 때 안 좋다.
- Resources 폴더에 있는 리소스 많으면 앱 준비 시간에 나쁜 영향 준다. 가능하면 Addressable Assets 패키지의 AssetBundle 써라.
- Start()나 Update()같은 Unity 이벤트 함수는 비어 있으면 지워라. 비어있어도 선언돼있으면 매번 호출된다. 컴포넌트까지 같이 불려오기 때문에 느려진다.
- release에선 별다른 구현 없지만 디버깅 용으로 사용한다면 define 분기로 최종 빌드에선 제외되게 해라.
- Awake(), Start()가 무거우면 Scene() 초기 동작을 지연시킨다. 초기화 로직 무거우면 Update()에서 별도의 FSM으로 초기화 구간을 구성해라.
- Hierarchy 복잡성 줄여라. Transform 구조들은 배열로 저장돼서 수정할 때마다 모든 배열 값 재설정. 가급적 Hiearchy 구조 변경도 하지 말기.
- 계층적 구조가 필요한게 아니라면 Root에 GameObject를 배치하는게 성능면에서 가장 좋다.
- Find()는 모든 GameObject에 대해, GetComponent(), GetComponentInChildren()은 GameObject 내의 모든 컴포넌트에 대해 검사를 수행한다. 가능하면 미리 초기화 시점에 캐싱해둬라.
- 검사 대상도 많고, 비교 검사 자체가 문자열 조건을 비교해서 오버헤드가 높다. 자주 사용하지 마라.
Texture Import Settings
- Generate Mipmaps : 밉맵 안 쓰면 꺼라. 리소스 용량 24% 감소.
- Format : (대부분은 자동으로 잘 압축) 디바이스에서 지원하는 압축 포맷 선택해야 무압축 대비 1/4 감소.
- 불필요한 알파 채널 삭제한다. 이미지 퀄리티 손실 조금 감소시켜줌.
- Read/Write Enable 해제한다. (기본값도 해제)
Mesh Import Settings
- Mesh Compression : 원본과 안 달라지는 선에서 최대한 높은 압축 선택. Runtime 메모리는 영향 없지만 패키지 용량 감소.
- Read/Write Enabled, Blendshapes, Normals and Tangents, Rig 등 사용 안하면 다 꺼라.
Audio Import Settings
- 스테레오 꼭 필요한 거 아니면 Force to Mono 사용
- 퀄리티 손상 체크하며 Compression bitrate 낮추기
- Audio Clip 크기 별 Load Type
- 200kb 미만 : Decompress On Load
- 200kb 이상 : Compressed In Memory
- 1mb 이상 : Streaming
- Mute (볼륨 0) 상태에선 오디오 재생을 중지해라. 그리고 필요 없어지면 Audio Clip Unload해라.
Batching
- 가능하면 같은 Texture / Material 써서 Batching 성공률 높여라. 아니면 Atlas Texture 써라.
- Dynamic Batching 했는데 Batching 성공률 낮으면 그냥 꺼라.
Light
- 그림자 필요 없는 오브젝트는 Cast Shadow 꺼라.
- Light 효과 받는 대상은 별도 Layer로 구성해서 Culling Mask로 계산 비용 최소한으로 해라. Light(특히 Spot Light)는 계산 비용이 높다.
- 보이지 않는 UI는 Activate 끄거나 Hide해라 . 카메라 밖으로 벗어나거나 다른 UI에 가려져도 실제로는 매 프레임마다 렌더링된다.
UI
- 정적인 UI와 동적인 UI를 분리시켜라. UI 변경 시 발생하는 UI Mesh 재생성 최소화할 수 있다.
- 하나의 Canvas에 있는 UI의 Z값을 동일하게 설정해라. Z값 다르면 Batching이 깨진다.
- Atlas를 활용하여 같은 머테리얼과 텍스쳐를 쓰게 해라.
- 동일한 Clipping Rect를 사용해라.
- 입력 이벤트 필요없으면 Graphic Raycaster 꺼라.
- Pause나 Main menu 띄울 때 전체 화면 불투명으로 가리는 UI 써라. Camera도 꺼서 렌더링 비용 줄여라.
- Frame Rate 낮춰라.
🏷️ The Beginners Guide to Creating Realistic Graphics (In Unity)
https://m.youtube.com/watch?v=fBQvL5YR3eg&pp=ygUdaG93IHRvIG1ha2UgM2Qgc2NlbmUgaW4gdW5pdHk%3D
- symplygon addon은 lod 만드는거 자동으로 해줌
- node wrangler 깔았으면 shift t로 텍스쳐들 불러오면 노드 자동 연결해줌
- simpel bake라는 addon 깔면 블랜더에서 유니티로 머태리얼 export하는거 편해짐
🎞️ Udemy Course : Unity Lighting
1.15 ~ 1.18

라이팅 베이크
- 씬 저장
- Lighting tab > Scene > Lighting Settings Asset > New
- Light > Indirect Multiplier : 반사되는 정도 조절
- Edit > Preference > GI Cache (Global Illumination) : 캐시 최대 저장 용량 조절, 캐시 삭제
- Lighting tab의 Realtime Lighting, Mixed Lighting으로 각 라이팅을 골랐을 때의 설정
- static object들을 설정해줘야 lightmap이 생성된다.
- static 옆 화살표 클릭하면 static으로 반영될 것들 설정 가능
Mixed Lighting > Lighting Mode
- Baked Indirect : 퀄리티 적당히 좋은거. 반사광은 Lightmap에 bake해두고, Mixed Light가 실시간 그림자도 드리운다.
- Subrtactive : 퀄리티 제일 안 좋은거. Main Directional Light 하나 빼고 빛이랑 그림자 다 bake해버림.
- Shadowmask : 퀄리티 제일 좋은거. Baked Indirect랑 똑같은데 그림자 퀄리티가 더 좋아짐.
Lightmapping Settings
- Lightmapper : CPU는 느리고 정확, GPU는 훨씬 빠르고 살짝 부정확
- Samples : 높이면 퀄 좋아지고 bake 느려짐.
- Max Bounces : 반사 몇 번 계산할건지
- Lightmap resolution : 얼마나 세밀하게 bake할건지.
- Lightmap Parameters : 얼마나 퀄리티 좋게 bake할건지.
- Ambient Occlusion : AO bake할건지
- Directional Mode : 직선광인지 환경광인지

Area light