10 조명·렌더링·최적화 - jes79/Unity-AI-Glossary-Playground GitHub Wiki
10 조명·렌더링·최적화
"렉 걸려" 대신 Profiler에서 본 숫자(FPS, Batches, GC Alloc)를 AI에게 붙여 주세요.
씬 19개 · 폴더 Assets/00_Scenes/10_Rendering
조명·렌더링
| 번호 | 용어 | 쉽게 말하면 | 씬에서 보여 주는 것 | 구현 방식 |
|---|---|---|---|---|
| 1001 | 렌더 파이프라인 (URP / HDRP / Built-in) | 그래픽 처리 방식 | 현재 파이프라인·URP 에셋 정보 표시, 분홍 Built-in 머티리얼을 [고치기]로 URP Lit 교체 | 런타임 데모 |
| 1002 | Directional / Point / Spot Light | 태양 / 전구 / 손전등 | 1/2/3으로 Directional·Point·Spot 켜고 끄기, F로 손전등 | 런타임 데모 |
| 1003 | 실시간 / 베이크 조명 (Lightmap) | 매 프레임 계산 / 미리 구워둠 | Static 건물 + Baked 가로등 + Light Probe, 메뉴 Tools/Glossary/Rendering/Bake Lighting for 1003으로 굽기 | 에디터 도구 데모 |
| 1004 | Shadow (그림자) 설정 | 그림자 품질·거리 | 그림자 거리 10~150m, Soft/Hard 전환, 모바일 프리셋(30m, Soft 끔) | 런타임 데모 |
| 1005 | Skybox / 환경광 | 하늘 배경 / 전체 밝기 | Procedural Skybox + 태양·환경광·안개 색이 바뀌는 낮밤 사이클 | 런타임 데모 |
| 1006 | Fog (안개) | 멀리 있는 것 흐리게 | 던전 복도 Linear Fog 20m, Exp/Exp2 전환 | 런타임 데모 |
| 1007 | Render Texture | 카메라 화면을 텍스처로 | Render Texture로 벽 너머 금고실 CCTV를 모니터에 표시, 채널 전환 | 런타임 데모 |
| 1008 | Sorting Layer / Order in Layer | 2D 그리는 순서 | SortingGroup + Y축 정렬 3가지 방식 비교 | 런타임 데모 |
| 1009 | 2D Light (URP 2D) | 2D 게임용 조명 | 라이트 맵 RT를 Multiply로 덮어 횃불 주변만 밝게, URP 2D Light 설정법 설명 | 설명 + 대체 구현 |
최적화
| 번호 | 용어 | 쉽게 말하면 | 씬에서 보여 주는 것 | 구현 방식 |
|---|---|---|---|---|
| 1010 | Profiler | 성능 측정 도구 | ProfilerRecorder로 FPS·ms·GC·Batches 표시, [스파이크] 버튼과 Profiler 사용 단계 | 런타임 데모 |
| 1011 | 오브젝트 풀링 (Object Pooling) | 만들고 지우는 대신 재사용 | Instantiate/Destroy vs ObjectPool 총알 카운터 비교 | 런타임 데모 |
| 1012 | Draw Call / Batching | 그리기 호출 수 / 묶어서 줄이기 | 400개 그리드 Static Batching·SRP Batcher 전환, Batches/SetPass 표시 | 런타임 데모 |
| 1013 | GPU Instancing | 같은 모델 대량 그리기 | Graphics.RenderMeshInstanced로 나무 1000~10000그루, GameObject 방식과 비교 | 런타임 데모 |
| 1014 | LOD (Level of Detail) | 멀면 저품질 모델 | 코드로 만든 LOD Group 3단계(60/25/8%), 단계별 색칠·ForceLOD | 런타임 데모 |
| 1015 | Occlusion Culling | 가려진 것 안 그리기 | 3x3 방 실내 맵 보임/가려짐 시각화, 굽기 메뉴 제공 | 에디터 도구 데모 |
| 1016 | Sprite Atlas | 2D 이미지 묶기 | 빌더가 SpriteAtlas 생성, 개별 PNG vs Atlas 텍스처 수·Batches 비교 | 런타임 데모 |
| 1017 | GC (가비지) 줄이기 | 메모리 쓰레기로 인한 끊김 | 나쁜 코드(LINQ·new List·문자열) vs 좋은 코드 KB/프레임 비교 | 런타임 데모 |
| 1018 | Addressables | 리소스를 필요할 때 불러오기 | Resources.LoadAsync 스테이지 비동기 로드·해제, Addressables 사용법 설명 | 설명 + 대체 구현 |
| 1019 | 코루틴 / async | 시간 걸리는 작업 나눠 실행 | 3초 뒤 문 열기를 코루틴과 async/await(Awaitable)로 나란히 | 런타임 데모 |
항목별 상세
1001
렌더 파이프라인 (URP / HDRP / Built-in) — 그래픽 처리 방식
요청 예문: "Built-in 프로젝트를 URP로 바꾸고 분홍색 머티리얼을 고치는 법 알려줘."
- 씬:
Assets/00_Scenes/10_Rendering/1001_RenderPipeline.unity - 핵심 스크립트:
RenderPipelineInfo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1001_RenderPipeline.cs - 구현 방식: 런타임 데모
- 개념: 화면을 그리는 전체 방식. URP 는 범용·모바일까지, HDRP 는 고사양 사실적 표현, Built-in 은 구형 기본이다. 파이프라인이 다르면 셰이더가 호환되지 않아 머티리얼이 분홍색으로 나온다.
- 씬에서 보여 주는 것: 현재 파이프라인·URP 에셋 정보 표시, 분홍 Built-in 머티리얼을 [고치기]로 URP Lit 교체
- 확인 포인트: 현재 파이프라인과 URP 에셋 정보를 확인하고, 분홍색으로 나온 Built-in 머티리얼을 [고치기]로 URP Lit 으로 바꿔 보세요. 분홍이 사라지는 것이 호환 문제의 증거입니다.
1002
Directional / Point / Spot Light — 태양 / 전구 / 손전등
요청 예문: "플레이어가 Spot Light 손전등을 F키로 켜고 끄게 해줘."
- 씬:
Assets/00_Scenes/10_Rendering/1002_LightTypes.unity - 핵심 스크립트:
LightTypesDemo, FlashlightPlayer - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1002_LightTypes.cs - 구현 방식: 런타임 데모
- 개념: Directional 은 태양처럼 방향만 있는 빛, Point 는 전구처럼 한 점에서 퍼지는 빛, Spot 은 손전등처럼 원뿔로 퍼지는 빛. 실시간 광원 수가 늘면 비용도 함께 늘어난다.
- 씬에서 보여 주는 것: 1/2/3으로 Directional·Point·Spot 켜고 끄기, F로 손전등
- 확인 포인트: 1/2/3 으로 세 종류 광원을 끄고 켜며 그림자 방향과 감쇠가 어떻게 다른지 보세요. F 로 손전등을 들면 Spot 의 원뿔 범위가 보입니다.
1003
실시간 / 베이크 조명 (Lightmap) — 매 프레임 계산 / 미리 구워둠
요청 예문: "움직이지 않는 건물은 Baked 조명으로 구워서 성능을 올려줘."
- 씬:
Assets/00_Scenes/10_Rendering/1003_RealtimeBakedLighting.unity - 핵심 스크립트:
BakedLightingDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1003_RealtimeBakedLighting.cs - 구현 방식: 에디터 도구 데모
- 개념: 실시간 조명은 매 프레임 계산하고, 베이크 조명은 미리 계산해 텍스처(라이트맵)로 구워 둔다. 움직이지 않는 물체와 광원은 구워 두면 품질과 성능을 동시에 얻는다.
- 씬에서 보여 주는 것: Static 건물 + Baked 가로등 + Light Probe, 메뉴 Tools/Glossary/Rendering/Bake Lighting for 1003으로 굽기
- 확인 포인트: 굽기 전후를 비교해 보세요. 구운 뒤에는 정적 건물에 부드러운 간접광과 그림자가 생기고, Light Probe 덕분에 움직이는 물체도 그 분위기를 받습니다.
1004
Shadow (그림자) 설정 — 그림자 품질·거리
요청 예문: "모바일용으로 그림자 거리 30m, Soft Shadow 끄는 설정을 알려줘."
- 씬:
Assets/00_Scenes/10_Rendering/1004_ShadowSettings.unity - 핵심 스크립트:
ShadowSettingsDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1004_ShadowSettings.cs - 구현 방식: 런타임 데모
- 개념: 그림자의 해상도·거리·부드러움을 정하는 설정. 그림자 거리는 성능에 가장 크게 영향을 주므로, 모바일에서는 거리를 줄이고 Soft 를 끄는 것이 보통이다.
- 씬에서 보여 주는 것: 그림자 거리 10~150m, Soft/Hard 전환, 모바일 프리셋(30m, Soft 끔)
- 확인 포인트: 그림자 거리를 10m 와 150m 로 바꿔 보세요. 멀리 있는 물체의 그림자가 사라지는 경계가 보입니다. Soft ↔ Hard 와 모바일 프리셋도 비교해 보세요.
1005
Skybox / 환경광 — 하늘 배경 / 전체 밝기
요청 예문: "낮→밤으로 Skybox와 조명 색이 바뀌는 낮밤 사이클을 만들어줘."
- 씬:
Assets/00_Scenes/10_Rendering/1005_SkyboxAmbient.unity - 핵심 스크립트:
DayNightCycle - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1005_SkyboxAmbient.cs - 구현 방식: 런타임 데모
- 개념: 하늘 배경을 그리는 Skybox 와, 그 하늘색이 모든 물체에 은은하게 더해지는 환경광. 환경광 설정을 빼먹으면 그림자 부분이 완전히 검게 떨어진다.
- 씬에서 보여 주는 것: Procedural Skybox + 태양·환경광·안개 색이 바뀌는 낮밤 사이클
- 확인 포인트: 낮밤 사이클을 돌려 하늘색이 바뀔 때 물체의 그림자 쪽 색과 안개 색까지 함께 바뀌는지 보세요. 환경광을 끄면 그림자가 새까맣게 됩니다.
1006
Fog (안개) — 멀리 있는 것 흐리게
요청 예문: "던전에 짙은 Fog를 넣어 시야를 20m로 제한해줘."
- 씬:
Assets/00_Scenes/10_Rendering/1006_Fog.unity - 핵심 스크립트:
FogDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1006_Fog.cs - 구현 방식: 런타임 데모
- 개념: 멀리 있는 물체를 배경색에 섞어 흐리게 만드는 효과. 시야 거리를 자연스럽게 가려 주므로 컬링 거리와 함께 쓰면 성능에도 도움이 된다.
- 씬에서 보여 주는 것: 던전 복도 Linear Fog 20m, Exp/Exp2 전환
- 확인 포인트: 복도를 걸어 20m 밖이 안개에 묻히는지, 안개를 끄면 멀리까지 선명하게 보이는지 비교해 보세요. Linear/Exp/Exp2 의 농도 변화 차이도 보세요.
1007
Render Texture — 카메라 화면을 텍스처로
요청 예문: "CCTV 화면을 Render Texture로 모니터에 띄워줘."
- 씬:
Assets/00_Scenes/10_Rendering/1007_RenderTexture.unity - 핵심 스크립트:
CctvMonitor - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1007_RenderTexture.cs - 구현 방식: 런타임 데모
- 개념: 카메라가 그린 화면을 텍스처로 받아 다른 곳에 쓰는 에셋. CCTV 화면, 미니맵, 거울, 초상화 미리보기에 쓰며 카메라가 하나 더 도는 비용이 든다.
- 씬에서 보여 주는 것: Render Texture로 벽 너머 금고실 CCTV를 모니터에 표시, 채널 전환
- 확인 포인트: 모니터에 벽 너머 금고실 화면이 실시간으로 나오는지, 채널을 바꾸면 다른 카메라 화면으로 교체되는지 보세요.
1008
Sorting Layer / Order in Layer — 2D 그리는 순서
요청 예문: "2D에서 캐릭터가 나무 뒤로 가면 가려지도록 Y축 정렬해줘."
- 씬:
Assets/00_Scenes/10_Rendering/1008_SortingLayer.unity - 핵심 스크립트:
YSortDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1008_SortingLayer.cs - 구현 방식: 런타임 데모
- 개념: 2D 에서 무엇을 먼저 그릴지 정하는 순서. Sorting Layer 가 큰 묶음, Order in Layer 가 그 안의 순서이고, 캐릭터끼리는 보통 Y 좌표로 정렬해 앞뒤를 만든다.
- 씬에서 보여 주는 것: SortingGroup + Y축 정렬 3가지 방식 비교
- 확인 포인트: 캐릭터를 위아래로 움직여 보세요. Y 축 정렬을 쓰면 아래쪽 캐릭터가 앞에 그려집니다. 세 가지 정렬 방식을 전환해 결과 차이를 보세요.
1009
2D Light (URP 2D) — 2D 게임용 조명
요청 예문: "URP 2D Renderer로 횃불 주변만 밝은 2D 조명을 만들어줘."
- 씬:
Assets/00_Scenes/10_Rendering/1009_Light2D.unity - 핵심 스크립트:
TorchLight2DFallback - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1009_Light2D.cs - 구현 방식: 설명 + 대체 구현
- 개념: 2D 전용 광원 시스템. 스프라이트에 빛과 그림자를 주어 횃불·조명 분위기를 만든다. URP 2D Renderer 설정이 필요하고 3D 조명과는 별개 체계다.
- 씬에서 보여 주는 것: 라이트 맵 RT를 Multiply로 덮어 횃불 주변만 밝게, URP 2D Light 설정법 설명
- 확인 포인트: 횃불 주변만 밝고 멀어지면 어두워지는지 보세요. 라이트 맵을 Multiply 로 덮는 방식이라, 라이트를 끄면 화면 전체가 균일하게 밝아집니다.
1010
Profiler — 성능 측정 도구
요청 예문: "Profiler에서 이 스파이크 원인을 찾는 방법을 알려줘."
- 씬:
Assets/00_Scenes/10_Rendering/1010_Profiler.unity - 핵심 스크립트:
ProfilerStatsDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1010_Profiler.cs - 구현 방식: 런타임 데모
- 개념: 프레임 시간·CPU/GPU·메모리·GC 를 측정하는 Unity 내장 도구. 느리다는 느낌만으로 고치지 말고, 어디서 시간을 쓰는지 먼저 측정하는 것이 최적화의 출발점이다.
- 씬에서 보여 주는 것: ProfilerRecorder로 FPS·ms·GC·Batches 표시, [스파이크] 버튼과 Profiler 사용 단계
- 확인 포인트: [스파이크] 버튼을 눌러 FPS 와 ms 가 튀는지, GC 와 Batches 숫자가 어떻게 변하는지 보세요. 패널의 Profiler 창 사용 단계도 함께 읽어 보세요.
1011
오브젝트 풀링 (Object Pooling) — 만들고 지우는 대신 재사용
요청 예문: "총알을 Instantiate/Destroy 대신 ObjectPool로 재사용하게 바꿔줘."
- 씬:
Assets/00_Scenes/10_Rendering/1011_ObjectPooling.unity - 핵심 스크립트:
BulletPoolingDemo, PoolBullet - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1011_ObjectPooling.cs - 구현 방식: 런타임 데모
- 개념: 오브젝트를 만들고 지우는 대신 미리 만들어 두고 켜고 끄며 재사용하는 기법. Instantiate/Destroy 가 만드는 GC 부담과 프레임 끊김을 없애 준다. 총알·이펙트·적에 필수다.
- 씬에서 보여 주는 것: Instantiate/Destroy vs ObjectPool 총알 카운터 비교
- 확인 포인트: 두 방식으로 총알을 연사해 보세요. Instantiate/Destroy 쪽은 오브젝트 수와 GC 가 계속 늘고 끊김이 생기는데, 풀 쪽은 개수가 일정하게 유지됩니다.
1012
Draw Call / Batching — 그리기 호출 수 / 묶어서 줄이기
요청 예문: "Draw Call을 줄이도록 Static Batching과 SRP Batcher 설정을 알려줘."
- 씬:
Assets/00_Scenes/10_Rendering/1012_DrawCallBatching.unity - 핵심 스크립트:
BatchingDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1012_DrawCallBatching.cs - 구현 방식: 런타임 데모
- 개념: GPU 에 그리기를 명령하는 횟수가 Draw Call 이고, 같은 조건의 물체를 묶어 횟수를 줄이는 것이 Batching 이다. Static Batching, SRP Batcher, GPU Instancing 이 각각 다른 조건에서 작동한다.
- 씬에서 보여 주는 것: 400개 그리드 Static Batching·SRP Batcher 전환, Batches/SetPass 표시
- 확인 포인트: 400개 그리드를 두고 Static Batching 과 SRP Batcher 를 전환하며 Batches / SetPass 숫자가 어떻게 줄어드는지 보세요. 머티리얼을 섞으면 묶임이 깨지는 것도 보세요.
1013
GPU Instancing — 같은 모델 대량 그리기
요청 예문: "나무 1000그루를 GPU Instancing으로 그려줘."
- 씬:
Assets/00_Scenes/10_Rendering/1013_GPUInstancing.unity - 핵심 스크립트:
InstancedForest - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1013_GPUInstancing.cs - 구현 방식: 런타임 데모
- 개념: 같은 메시를 한 번의 명령으로 수천 개 그리는 기법. GameObject 를 만들지 않고 변환 행렬 배열만 넘기므로, 나무·풀·바위처럼 같은 모델이 많을 때 압도적으로 빠르다.
- 씬에서 보여 주는 것: Graphics.RenderMeshInstanced로 나무 1000~10000그루, GameObject 방식과 비교
- 확인 포인트: 나무 수를 1000 → 10000 으로 올리며 프레임을 보세요. GameObject 방식으로 바꾸면 같은 수에서 프레임이 크게 떨어지는 것이 비교됩니다.
1014
LOD (Level of Detail) — 멀면 저품질 모델
요청 예문: "건물에 LOD Group 3단계를 설정해줘."
- 씬:
Assets/00_Scenes/10_Rendering/1014_LOD.unity - 핵심 스크립트:
LodDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1014_LOD.cs - 구현 방식: 런타임 데모
- 개념: 거리에 따라 더 단순한 모델로 바꿔 그리는 기법. 멀리 있는 물체는 화면에서 작으니 폴리곤을 줄여도 티가 나지 않는다. 전환 거리를 잘못 주면 눈에 띄게 바뀐다(팝핑).
- 씬에서 보여 주는 것: 코드로 만든 LOD Group 3단계(60/25/8%), 단계별 색칠·ForceLOD
- 확인 포인트: 카메라를 멀리 당기며 LOD 단계가 바뀌는지, 단계별 색칠로 전환 거리가 보이는지 확인해 보세요. ForceLOD 로 특정 단계를 고정해 폴리곤 차이도 보세요.
1015
Occlusion Culling — 가려진 것 안 그리기
요청 예문: "실내 맵에 Occlusion Culling을 굽는 법 알려줘."
- 씬:
Assets/00_Scenes/10_Rendering/1015_OcclusionCulling.unity - 핵심 스크립트:
OcclusionVisualizer - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1015_OcclusionCulling.cs - 구현 방식: 에디터 도구 데모
- 개념: 다른 물체에 가려 보이지 않는 것을 아예 그리지 않는 기법. 실내·복도형 맵에서 효과가 크고, 미리 굽는 과정이 필요하며 움직이는 물체는 가리는 쪽이 될 수 없다.
- 씬에서 보여 주는 것: 3x3 방 실내 맵 보임/가려짐 시각화, 굽기 메뉴 제공
- 확인 포인트: 방 사이를 이동하며 가려진 방의 물체가 그려지지 않는지 시각화로 보세요. 굽기 전에는 보이지 않는 방까지 모두 그려지는 것과 비교됩니다.
1016
Sprite Atlas — 2D 이미지 묶기
요청 예문: "UI 아이콘들을 Sprite Atlas로 묶어 Draw Call을 줄여줘."
- 씬:
Assets/00_Scenes/10_Rendering/1016_SpriteAtlas.unity - 핵심 스크립트:
SpriteAtlasDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1016_SpriteAtlas.cs - 구현 방식: 런타임 데모
- 개념: 여러 2D 이미지를 큰 텍스처 한 장으로 묶는 에셋. 텍스처 교체가 줄어 Draw Call 이 묶이고, 작은 이미지가 많은 UI·2D 게임에서 효과가 크다.
- 씬에서 보여 주는 것: 빌더가 SpriteAtlas 생성, 개별 PNG vs Atlas 텍스처 수·Batches 비교
- 확인 포인트: 개별 PNG 와 Atlas 를 전환하며 텍스처 개수와 Batches 가 어떻게 달라지는지 보세요. 화면은 똑같은데 숫자만 줄어드는 것이 핵심입니다.
1017
GC (가비지) 줄이기 — 메모리 쓰레기로 인한 끊김
요청 예문: "Update에서 GC Alloc이 생기는 코드를 찾아서 고쳐줘."
- 씬:
Assets/00_Scenes/10_Rendering/1017_GCReduction.unity - 핵심 스크립트:
GcAllocDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1017_GCReduction.cs - 구현 방식: 런타임 데모
- 개념: 매 프레임 새 객체를 만들면 가비지가 쌓이고, 수거될 때 프레임이 끊긴다. LINQ·new List·문자열 결합을 Update 에서 피하고 재사용·StringBuilder·구조체로 바꾸는 것이 기본이다.
- 씬에서 보여 주는 것: 나쁜 코드(LINQ·new List·문자열) vs 좋은 코드 KB/프레임 비교
- 확인 포인트: 나쁜 코드와 좋은 코드를 전환하며 프레임당 할당 KB 와 GC 횟수를 비교해 보세요. 나쁜 쪽에서 주기적으로 프레임이 튀는 것도 보세요.
1018
Addressables — 리소스를 필요할 때 불러오기
요청 예문: "Addressables로 스테이지별 리소스를 따로 로드하게 해줘."
- 씬:
Assets/00_Scenes/10_Rendering/1018_Addressables.unity - 핵심 스크립트:
StageResourceLoader - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1018_Addressables.cs - 구현 방식: 설명 + 대체 구현
- 개념: 에셋을 주소로 관리하며 필요할 때 비동기로 불러오고 해제하는 시스템. Resources 폴더 방식의 빌드 용량·로딩 문제를 해결하며, 원격 번들 배포도 가능하다.
- 씬에서 보여 주는 것: Resources.LoadAsync 스테이지 비동기 로드·해제, Addressables 사용법 설명
- 확인 포인트: 스테이지를 비동기로 불러오고 해제해 보세요. 로딩 중에도 화면이 멈추지 않고, 해제 후 메모리 표시가 줄어드는지 보세요.
1019
코루틴 / async — 시간 걸리는 작업 나눠 실행
요청 예문: "3초 뒤 문이 열리는 걸 코루틴으로 만들어줘."
- 씬:
Assets/00_Scenes/10_Rendering/1019_CoroutineAsync.unity - 핵심 스크립트:
DelayedDoorDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/10_Rendering/Build1019_CoroutineAsync.cs - 구현 방식: 런타임 데모
- 개념: 긴 작업을 여러 프레임에 나눠 실행하는 두 방식. 코루틴은 Unity 생명주기에 묶여 간단하고, async/await(Awaitable)은 취소·예외 처리와 결과 반환이 깔끔하다.
- 씬에서 보여 주는 것: 3초 뒤 문 열기를 코루틴과 async/await(Awaitable)로 나란히
- 확인 포인트: 같은 3초 대기를 코루틴과 async 로 나란히 실행해 보세요. 결과는 같지만 오브젝트가 꺼질 때의 동작과 취소 처리가 다른 점을 패널 설명과 함께 보세요.