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 로 나란히 실행해 보세요. 결과는 같지만 오브젝트가 꺼질 때의 동작과 취소 처리가 다른 점을 패널 설명과 함께 보세요.