11 코드 구조·패턴·에디터 - jes79/Unity-AI-Glossary-Playground GitHub Wiki
11 코드 구조·패턴·에디터
기능 요청 끝에 "이벤트로 분리해줘" 같은 구조 요구를 한 줄 덧붙이세요.
씬 13개 · 폴더 Assets/00_Scenes/11_Patterns
| 번호 | 용어 | 쉽게 말하면 | 씬에서 보여 주는 것 | 구현 방식 |
|---|---|---|---|---|
| 1101 | 싱글톤 (Singleton) | 게임에 하나만 있는 관리자 | 싱글톤 + DontDestroyOnLoad로 씬 재로드 후에도 점수 유지 | 런타임 데모 |
| 1102 | 이벤트 / 옵저버 (Action, UnityEvent) | "이 일이 생겼어"를 방송, 듣는 쪽이 반응 | OnPlayerDied 이벤트에 UI·사운드·카메라가 각자 반응 | 런타임 데모 |
| 1103 | 인터페이스 (Interface) | 공통 규칙 약속 | IInteractable로 문·상자·NPC·레버를 E키 하나로 | 런타임 데모 |
| 1104 | 컴포넌트 분리 | 한 스크립트에 다 넣지 않기 | 이동·공격·체력 컴포넌트 분리, 각각 켜고 끄기 | 런타임 데모 |
| 1105 | 상태 패턴 (State Pattern) | 상태를 클래스로 분리 | Idle/Run/Jump/Attack 상태 클래스 State 패턴 | 런타임 데모 |
| 1106 | 커맨드 패턴 | 입력을 명령 객체로, 되돌리기 가능 | 상자 밀기 퍼즐 Undo/Redo Command 패턴 | 런타임 데모 |
| 1107 | 프리팹 / 프리팹 변형 (Prefab Variant) | 재사용 오브젝트 / 일부만 바꾼 복사본 | Base 적 프리팹에서 Fast/Strong Prefab Variant 생성·소환 | 에디터 도구 데모 |
| 1108 | [SerializeField] / [Header] / Range(#1108) | Inspector에 변수 노출·정리 | SerializeField·Header·Range 등 Inspector 속성 모음 | 런타임 데모 |
| 1109 | Gizmos | 씬 뷰에 보조선 그리기 | OnDrawGizmos로 적 시야·공격 범위 그리기 | 런타임 데모 |
| 1110 | 에디터 확장 (Custom Editor, EditorWindow) | 나만의 툴 버튼·창 | Inspector '적 10마리 생성' 버튼 Custom Editor + EditorWindow | 에디터 도구 데모 |
| 1111 | 디버그 로그 / Debug.DrawRay | 콘솔 출력 / 레이 시각화 | Debug.DrawRay로 Raycast 시각화 + 미니 콘솔 | 런타임 데모 |
| 1112 | 버전 관리 (Git, .gitignore) | 작업 기록·백업 | Git·.gitignore·LFS 단계, 미니 Git 시뮬레이터 | 설명 + 대체 구현 |
| 1113 | 빌드 설정 (PC, Android, WebGL) | 플랫폼 출력 | PC/Android/WebGL→itch.io 빌드 단계, Build Settings 씬 목록 | 에디터 도구 데모 |
항목별 상세
1101
싱글톤 (Singleton) — 게임에 하나만 있는 관리자
요청 예문: "GameManager를 싱글톤으로 만들고 씬이 바뀌어도 유지(DontDestroyOnLoad)되게 해줘."
- 씬:
Assets/00_Scenes/11_Patterns/1101_Singleton.unity - 핵심 스크립트:
GameManager, SingletonDemoUI - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1101_Singleton.cs - 구현 방식: 런타임 데모
- 개념: 어디서나 접근할 수 있는 인스턴스를 하나만 두는 패턴. 매니저류에 편하지만 의존 관계가 숨고 테스트가 어려워지므로, 꼭 하나여야 하는 것에만 쓰는 게 좋다.
- 씬에서 보여 주는 것: 싱글톤 + DontDestroyOnLoad로 씬 재로드 후에도 점수 유지
- 확인 포인트: 점수를 올린 뒤 씬을 다시 로드해 보세요. DontDestroyOnLoad 싱글톤이라 점수가 유지되고, 매니저가 두 개로 늘지 않는지도 확인해 보세요.
1102
이벤트 / 옵저버 (Action, UnityEvent) — "이 일이 생겼어"를 방송, 듣는 쪽이 반응
요청 예문: "플레이어가 죽으면 OnPlayerDied 이벤트를 쏘고 UI와 사운드가 각각 반응하게 해줘."
- 씬:
Assets/00_Scenes/11_Patterns/1102_EventObserver.unity - 핵심 스크립트:
PlayerHealthSubject, EventObserverDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1102_EventObserver.cs - 구현 방식: 런타임 데모
- 개념: 어떤 일이 생겼다고 알리면 듣고 있던 쪽들이 각자 반응하는 구조. 알리는 쪽이 누가 듣는지 몰라도 되므로 UI·사운드·카메라를 서로 모르는 상태로 묶을 수 있다. 구독 해제를 잊으면 누수가 생긴다.
- 씬에서 보여 주는 것: OnPlayerDied 이벤트에 UI·사운드·카메라가 각자 반응
- 확인 포인트: 플레이어를 죽여 OnPlayerDied 하나에 UI·사운드·카메라가 각자 반응하는지 보세요. 구독자를 하나 끄면 그 반응만 사라지고 나머지는 그대로입니다.
1103
인터페이스 (Interface) — 공통 규칙 약속
요청 예문: "IInteractable 인터페이스로 상호작용 대상을 통일해줘."
- 씬:
Assets/00_Scenes/11_Patterns/1103_Interface.unity - 핵심 스크립트:
IInteractable, InteractorPlayer - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1103_Interface.cs - 구현 방식: 런타임 데모
- 개념: 클래스가 반드시 갖춰야 할 함수 목록만 약속해 두는 문법. 서로 상관없는 문·상자·NPC 를 같은 코드로 다룰 수 있게 해 주며, 상속과 달리 여러 개를 동시에 구현할 수 있다.
- 씬에서 보여 주는 것: IInteractable로 문·상자·NPC·레버를 E키 하나로
- 확인 포인트: 문·상자·NPC·레버를 모두 E 키 하나로 상호작용해 보세요. 각자 다른 동작을 하지만 호출하는 코드는 IInteractable 하나입니다.
1104
컴포넌트 분리 — 한 스크립트에 다 넣지 않기
요청 예문: "이 PlayerController를 이동, 공격, 체력 스크립트로 나눠줘."
- 씬:
Assets/00_Scenes/11_Patterns/1104_ComponentSplit.unity - 핵심 스크립트:
PlayerMovement, PlayerAttack, PlayerHealth - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1104_ComponentSplit.cs - 구현 방식: 런타임 데모
- 개념: 한 스크립트에 모든 기능을 넣지 않고 이동·공격·체력처럼 역할별로 쪼개는 설계. 필요한 조합만 붙여 쓸 수 있고, 기능을 하나씩 켜고 끄며 문제를 좁힐 수 있다.
- 씬에서 보여 주는 것: 이동·공격·체력 컴포넌트 분리, 각각 켜고 끄기
- 확인 포인트: 이동·공격·체력 컴포넌트를 하나씩 꺼 보세요. 해당 기능만 멈추고 나머지는 정상 동작합니다. 적에는 공격만 붙이는 식의 재조합도 가능합니다.
1105
상태 패턴 (State Pattern) — 상태를 클래스로 분리
요청 예문: "플레이어 상태(Idle, Run, Jump, Attack)를 State 패턴으로 리팩터링해줘."
- 씬:
Assets/00_Scenes/11_Patterns/1105_StatePattern.unity - 핵심 스크립트:
IPlayerState, StatePatternPlayer - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1105_StatePattern.cs - 구현 방식: 런타임 데모
- 개념: 상태마다 클래스를 만들어 진입·갱신·퇴장 로직을 그 안에 담는 패턴. if 뭉치로 커진 FSM 을 정리할 때 쓰고, 상태를 추가해도 기존 코드를 건드리지 않는다.
- 씬에서 보여 주는 것: Idle/Run/Jump/Attack 상태 클래스 State 패턴
- 확인 포인트: Idle/Run/Jump/Attack 을 전환하며 현재 상태 클래스 이름과 Enter/Exit 로그가 찍히는지 보세요. 상태별 코드가 서로 섞이지 않는 구조를 확인해 보세요.
1106
커맨드 패턴 — 입력을 명령 객체로, 되돌리기 가능
요청 예문: "퍼즐 게임에 Undo가 되도록 Command 패턴을 적용해줘."
- 씬:
Assets/00_Scenes/11_Patterns/1106_CommandPattern.unity - 핵심 스크립트:
ICommand, MoveCommand, CommandPuzzle - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1106_CommandPattern.cs - 구현 방식: 런타임 데모
- 개념: 입력이나 동작을 객체로 만들어 쌓아 두고 실행·되돌리기를 하는 패턴. 퍼즐 되돌리기, 에디터 Undo, 리플레이 기록에 쓴다.
- 씬에서 보여 주는 것: 상자 밀기 퍼즐 Undo/Redo Command 패턴
- 확인 포인트: 상자를 밀어 퍼즐을 움직인 뒤 Undo/Redo 를 눌러 보세요. 이동 전후 상태가 정확히 되돌아가고 다시 실행되는지 보세요.
1107
프리팹 / 프리팹 변형 (Prefab Variant) — 재사용 오브젝트 / 일부만 바꾼 복사본
요청 예문: "기본 적 프리팹에서 빠른 적, 강한 적을 Prefab Variant로 만드는 법 알려줘."
- 씬:
Assets/00_Scenes/11_Patterns/1107_PrefabVariant.unity - 핵심 스크립트:
VariantEnemy, VariantSpawner - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1107_PrefabVariant.cs - 구현 방식: 에디터 도구 데모
- 개념: 프리팹은 재사용할 오브젝트 원본이고, Prefab Variant 는 원본을 물려받아 일부만 바꾼 파생본이다. 원본을 고치면 Variant 에도 반영되므로 적 종류를 늘릴 때 유리하다.
- 씬에서 보여 주는 것: Base 적 프리팹에서 Fast/Strong Prefab Variant 생성·소환
- 확인 포인트: Base 적에서 파생된 Fast / Strong Variant 를 소환해 보세요. 공통 속성은 같고 바꾼 값만 다릅니다. Base 를 수정하면 둘 다 함께 바뀝니다.
1108
[SerializeField] / [Header] / [Range] — Inspector에 변수 노출·정리
요청 예문: "private 변수를 SerializeField로 노출하고 Header와 Range로 정리해줘."
- 씬:
Assets/00_Scenes/11_Patterns/1108_InspectorAttributes.unity - 핵심 스크립트:
InspectorAttributeDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1108_InspectorAttributes.cs - 구현 방식: 런타임 데모
- 개념: private 변수를 Inspector 에 노출하는 SerializeField, 항목을 묶는 Header, 범위를 제한하는 Range 등 Inspector 표시를 다듬는 속성들. 기획 값을 코드 수정 없이 조절하게 해 준다.
- 씬에서 보여 주는 것: SerializeField·Header·Range 등 Inspector 속성 모음
- 확인 포인트: Inspector 에서 Header 로 묶인 항목, Range 슬라이더, Tooltip 설명이 보이는지 확인하고, public 없이도 값이 노출되는 것을 보세요.
1109
Gizmos — 씬 뷰에 보조선 그리기
요청 예문: "적의 시야 범위와 공격 범위를 OnDrawGizmos로 그려줘."
- 씬:
Assets/00_Scenes/11_Patterns/1109_Gizmos.unity - 핵심 스크립트:
EnemyVisionGizmos, GizmosDemo - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1109_Gizmos.cs - 구현 방식: 런타임 데모
- 개념: Scene 뷰에만 그려지는 보조선. 적의 시야·공격 범위·순찰 경로처럼 눈에 보이지 않는 값을 보이게 만들어 디버깅 속도를 크게 올려 준다.
- 씬에서 보여 주는 것: OnDrawGizmos로 적 시야·공격 범위 그리기
- 확인 포인트: Scene 뷰에서 적의 시야 부채꼴과 공격 범위 원이 그려지는지 보세요. 값을 바꾸면 선도 함께 변합니다. 게임 화면에는 나오지 않는 것이 Gizmos 의 특징입니다.
1110
에디터 확장 (Custom Editor, EditorWindow) — 나만의 툴 버튼·창
요청 예문: "Inspector에 '적 10마리 생성' 버튼을 추가하는 Custom Editor를 만들어줘."
- 씬:
Assets/00_Scenes/11_Patterns/1110_EditorExtension.unity - 핵심 스크립트:
EnemySpawnerToolEditor, EnemySpawnerWindow - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1110_EditorExtension.cs - 구현 방식: 에디터 도구 데모
- 개념: Inspector 에 버튼을 넣거나(Custom Editor) 별도 창을 만들어(EditorWindow) 반복 작업을 자동화하는 기능. 이 프로젝트의 182개 씬도 전부 에디터 확장으로 생성한 것이다.
- 씬에서 보여 주는 것: Inspector '적 10마리 생성' 버튼 Custom Editor + EditorWindow
- 확인 포인트: Inspector 의 [적 10마리 생성] 버튼과 전용 EditorWindow 를 실행해, 손으로 배치하지 않고 씬이 채워지는지 보세요.
1111
디버그 로그 / Debug.DrawRay — 콘솔 출력 / 레이 시각화
요청 예문: "Raycast가 어디로 나가는지 Debug.DrawRay로 보여줘."
- 씬:
Assets/00_Scenes/11_Patterns/1111_DebugDrawRay.unity - 핵심 스크립트:
RaycastDebugTurret, OnScreenConsole - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1111_DebugDrawRay.cs - 구현 방식: 런타임 데모
- 개념: 콘솔에 값을 찍는 Debug.Log 와 Scene 뷰에 선을 그리는 Debug.DrawRay. 가장 원시적이지만 가장 빠른 디버깅 수단이고, 출시 빌드에서는 걷어내는 것이 좋다.
- 씬에서 보여 주는 것: Debug.DrawRay로 Raycast 시각화 + 미니 콘솔
- 확인 포인트: Raycast 를 쏘아 Scene 뷰에 선이 그려지고 미니 콘솔에 맞은 대상이 찍히는지 보세요. 선 색으로 맞았는지 여부를 구분하는 방식도 보세요.
1112
버전 관리 (Git, .gitignore) — 작업 기록·백업
요청 예문: "유니티 프로젝트용 .gitignore와 Git LFS 설정을 알려줘."
- 씬:
Assets/00_Scenes/11_Patterns/1112_VersionControl.unity - 핵심 스크립트:
GuidePages, MiniGitSimulator - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1112_VersionControl.cs - 구현 방식: 설명 + 대체 구현
- 개념: 작업 기록을 저장하고 되돌릴 수 있게 하는 도구. Unity 는 Library 등 생성 폴더를 제외하는 .gitignore 와, 큰 바이너리를 위한 LFS 설정이 함께 필요하다.
- 씬에서 보여 주는 것: Git·.gitignore·LFS 단계, 미니 Git 시뮬레이터
- 확인 포인트: 미니 Git 시뮬레이터에서 커밋·브랜치·되돌리기를 해 보세요. 패널의 Unity .gitignore 와 LFS 설정 단계가 실제 저장소 설정과 같은지 확인해 보세요.
1113
빌드 설정 (PC, Android, WebGL) — 플랫폼 출력
요청 예문: "WebGL로 빌드해서 itch.io에 올리는 순서를 알려줘."
- 씬:
Assets/00_Scenes/11_Patterns/1113_BuildSettings.unity - 핵심 스크립트:
BuildInfoDisplay, BuildSettingsTools - 빌더:
Assets/01_Scripts/Editor/Scenes/11_Patterns/Build1113_BuildSettings.cs - 구현 방식: 에디터 도구 데모
- 개념: 플랫폼별로 실행 파일을 만드는 설정. 씬 목록·아이콘·해상도·압축 방식이 플랫폼마다 다르고, Build Settings 에 씬을 등록하지 않으면 로드에 실패한다.
- 씬에서 보여 주는 것: PC/Android/WebGL→itch.io 빌드 단계, Build Settings 씬 목록
- 확인 포인트: Build Settings 씬 목록과 각 플랫폼(PC/Android/WebGL) 설정 단계를 확인해 보세요. 씬이 목록에 없을 때 어떤 오류가 나는지도 함께 읽어 보세요.