بنقرة واحدة
verify-ingame-core
인게임 핵심 시스템(GameManager, UIManager), 초기화 순서 안전성, UI 데이터 바인딩을 검증합니다.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
인게임 핵심 시스템(GameManager, UIManager), 초기화 순서 안전성, UI 데이터 바인딩을 검증합니다.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
로비 UI의 팝업 관리 및 뒤로가기(ESC) 로직을 검증합니다. PopupManager 등록 및 중복 입력 처리 여부를 확인합니다.
타이틀 씬의 로그인 흐름(MVVM), 어드레서블 로딩, 앱 업데이트 관리를 검증합니다.
프로젝트 전체의 사운드 구현 패턴을 검증합니다. 싱글톤(Singleton) 대신 인터페이스 주입(DI) 방식의 사용을 권장합니다.
세션 변경사항을 분석하여 검증 스킬 누락을 탐지합니다. 기존 스킬을 동적으로 탐색하고, 새 스킬을 생성하거나 기존 스킬을 업데이트한 뒤 GEMINI.md를 관리합니다.
플레이어 데이터의 DTO/Service 구조, 암호화 처리, 로컬 저장소 정합성을 검증합니다.
프로젝트의 모든 verify 스킬을 순차 실행하여 통합 검증 보고서를 생성합니다. 기능 구현 후, PR 전, 코드 리뷰 시 사용.
| name | verify-ingame-core |
| description | 인게임 핵심 시스템(GameManager, UIManager), 초기화 순서 안전성, UI 데이터 바인딩을 검증합니다. |
인게임 플레이의 안정성을 확보하기 위해 핵심 매니저 클래스와 UI 간의 데이터 바인딩 구조가 올바른지 검증합니다:
GameManager 및 UIManager가 올바르게 초기화되고 수명 주기 내에서 안정적으로 동작하는지 확인InGameViewModel이 PlayerDataService 주입을 통해 데이터를 안정적으로 수신하는지 확인UIManager가 ViewModel의 상태 변화를 감지하여 뷰를 적절히 갱신하는지 확인GameManager가 ISoundManager를 UIManager 및 하위 개체들에 올바르게 전파하여 주입하는지 확인(권장)GameManager.cs, UIManager.cs)을 수정한 후PlayerDataService.cs)가 변경되었을 때| File | Purpose |
|---|---|
Assets/_Game/Scripts/InGame/Manager/GameManager.cs | 인게임 전체 흐름 관리 |
Assets/_Game/Scripts/InGame/Manager/UIManager.cs | 인게임 UI 전환 및 상태 관리 |
Assets/_Game/Scripts/InGame/UI/ViewModels/InGameViewModel.cs | 인게임 UI용 데이터 바인딩 뷰모델 |
Assets/_Game/Scripts/InGame/Player/Player_Base/PlayerBase.cs | 플레이어 핵심 로직 및 이벤트 발생지 |
Assets/_Game/Scripts/Data/Services/PlayerDataService.cs | 플레이어 데이터 비즈니스 로직 관리 |
Assets/_Game/Scripts/Data/DTOs/PlayerDataDTO.cs | 플레이어 핵심 데이터 구조 |
Assets/_Game/Scripts/InGame/GameSceneCompositionRoot.cs | 인게임 씬 DI 조립 진입점 |
Assets/_Game/Scripts/Lobby/Core/LobbySceneCompositionRoot.cs | 로비 씬 DI 조립 진입점 |
Assets/_Game/Scripts/Lobby/SceneLoader.cs | 씬 전환 로더 및 초기화 관리 |
Assets/_Game/Scripts/InGame/UI/Views/GameOverPopup.cs | 게임 오버 팝업 뷰 |
Assets/_Game/Scripts/Lobby/SoundManager.cs | 사운드 매니저 (DontDestroyOnLoad 대상) |
Assets/_Game/Scripts/InGame/JoystickSetter/JoysticSetter.cs | 조이스틱 시각적 설정 관리 UI |
Assets/_Game/Scripts/InGame/JoystickSetter/JoyStickPosDragandDrop.cs | 조이스틱 부모 영역 내 드래그 핸들러 |
GameManager나 UIManager 내에서 타 시스템의 싱글톤(Instance)을 직접 참조하는지 검사합니다. 아키텍처 원칙에 따라 주입(DI) 또는 Init 메서드를 통한 참조 권장.
파일: Assets/_Game/Scripts/InGame/Manager/*.cs
검사:
grep ".Instance" Assets/_Game/Scripts/InGame/Manager/*.cs
PASS: 발견되지 않거나, Awake 내 캐싱용으로만 사용됨
FAIL: 비즈니스 로직 내에서 전역 인스턴스 직접 사용
수정: 생성자나 Init 메서드를 통해 전달받도록 리팩토링
InGameViewModel이 PlayerDataService를 생성자 또는 초기화 메서드를 통해 올바르게 주입받고 구독하고 있는지 확인합니다.
파일: Assets/_Game/Scripts/InGame/UI/ViewModels/InGameViewModel.cs
검사:
grep -E "(On[A-Za-z]+Changed|\.Subscribe)" Assets/_Game/Scripts/InGame/UI/ViewModels/InGameViewModel.cs
PASS: 데이터 변경에 대한 이벤트 핸들러 또는 구독 로직 존재
FAIL: 단순 Getter/Setter만 존재하거나 갱신 로직 누락
수정: 반응형 프로퍼티(ReactiveProperty, Action) 적용
유니티 오브젝트 참조에 대한 Null 체크가 Allman Style로 구현되어 있는지 확인합니다.
파일: Assets/_Game/Scripts/InGame/**/*.cs
검사:
grep "?." Assets/_Game/Scripts/InGame/**/*.cs | grep -v "Assets/_Game/Scripts/InGame/External"
PASS: 결과 없음 (사용자 규칙에 따라 Unity Object에 ?. 금지)
FAIL: Unity Object 참조에 ?. 사용 중
수정: if (obj != null) 블록으로 변경
GameManager에서 주입받은 ISoundManager 및 IPopupService가 하위 개체들에 올바르게 전달되는지 확인합니다.
파일: GameManager.cs, UIManager.cs, OptionPopupView.cs
검사:
GameManager.OnInitialize (또는 InitializeAsync)에서 m_uiManager.Initialize(m_soundManager) 호출 확인.GameManager.OpenOptionPopup에서 popup.Initialize(m_soundManager, m_popupService) 호출 확인. (핵심: IPopupService 주입 필수)ObjectPoolSpawner.Init 또는 유사 메서드를 통해 ISoundManager가 전달되는지 확인.권장: 싱글톤에 의존하지 않고 주입받은 서비스를 활용하도록 구현.
Unity 라이프사이클(OnEnable/Start)에서 DI 의존 코드를 호출하지 않는지 확인합니다.
원칙: OnEnable/Start에서는 자체 컴포넌트 캐싱만 수행, 외부 의존성 로직은 Initialize()/Init()에서만 실행.
파일: PlayerBase.cs, UIManager.cs
검사:
# 1. PlayerBase.OnEnable에서 Init() 호출 없음 확인
grep -A5 "void OnEnable" Assets/_Game/Scripts/InGame/Player/Player_Base/PlayerBase.cs | grep "Init()"
# 2. UIManager.Start에서 SubscribeToEvents 호출 없음 확인
grep -A10 "void Start" Assets/_Game/Scripts/InGame/Manager/UIManager.cs | grep "SubscribeToEvents"
PASS: 두 검색 모두 결과 없음
FAIL: 라이프사이클에서 DI 의존 메서드 호출 발견
수정: DI 의존 코드를 Initialize() 또는 Init()으로 이동
이벤트 핸들러에서 async void를 사용하면 예외 발생 시 전체 이벤트 체인이 중단됩니다. void + UniTaskVoid.Forget() 패턴으로 대체해야 합니다.
파일: Assets/_Game/Scripts/InGame/Manager/GameManager.cs
검사:
grep "async void" Assets/_Game/Scripts/InGame/Manager/GameManager.cs
PASS: 결과 없음 (모든 비동기 핸들러가 void + Forget 패턴 사용)
FAIL: async void 메서드 존재
수정: void Method() { MethodAsync().Forget(); } + async UniTaskVoid MethodAsync() 패턴으로 변환
UIManager의 게임 오버 시퀀스에 디버깅용 추적 로그가 구현되어 있는지 확인합니다.
파일: UIManager.cs
검사:
grep -n "OnGameOverAsync: Delay" Assets/_Game/Scripts/InGame/Manager/UIManager.cs
PASS: 상세 추적 로그 존재
FAIL: 로그 누락
수정: OnGameOverAsync 내 주요 단계에 추적 로그 추가
CompositionRoot 클래스들이 리모트 데이터 동기화가 완료될 때까지 안전하게 대기하는지 확인합니다.
파일: LobbySceneCompositionRoot.cs, GameSceneCompositionRoot.cs
검사:
# 1. RemoteDataUpdateManager의 IsReady 플래그 대기 확인
grep -E "DefaultSceneInitializer\.WaitForRemoteInitialization\|m_remoteDataUpdateManager\.IsReady" Assets/_Game/Scripts/**/*.cs
PASS: 리모트 데이터 초기화 완료를 대기하는 while 루프나 UniTask.WaitUntil 로직이 존재함
FAIL: 대기 없이 바로 초기화 진행 (데이터 불일치 위험)
조이스틱 드래그 핸들러가 화면 전체가 아닌 부모 RectTransform 내부로 이동 범위를 제한하는지 확인합니다.
파일: Assets/_Game/Scripts/InGame/JoystickSetter/JoyStickPosDragandDrop.cs
검사:
# 1. Canvas가 아닌 parentRect.rect를 사용하는지 확인
grep "parentRect.rect" Assets/_Game/Scripts/InGame/JoystickSetter/JoyStickPosDragandDrop.cs
# 2. 앵커(Anchor) 위치를 계산에 포함하는지 확인
grep "anchorPosInParent" Assets/_Game/Scripts/InGame/JoystickSetter/JoyStickPosDragandDrop.cs
PASS: parentRect.rect를 기준으로 m_minBoundary/m_maxBoundary를 계산하고, anchorPosInParent 오프셋을 적용함
FAIL: 여전히 m_canvas를 기준으로 전체 화면 이동을 허용하거나 앵커 보정 누락
수정: CalculateBoundaries 메서드 내 경계 계산식을 부모 rect 기반으로 변경
플레이어 스폰 시 UI 토글 상태가 명확히 전달되는지, 무기 획득 시 즉시 공격이 트리거되는지 확인합니다.
파일: UIManager.cs, GameManager.cs
검사:
# 1. OnPlayerChanged에서 UI 토글 상태 동기화 여부 확인
grep -A10 "OnPlayerChanged" Assets/_Game/Scripts/InGame/Manager/UIManager.cs | grep "AutoAttackEnabledByToggle"
# 2. EquipNewWeapon에서 즉시 Attack() 호출 여부 확인
grep -A20 "EquipNewWeapon" Assets/_Game/Scripts/InGame/Manager/GameManager.cs | grep "controller.Attack"
PASS: 참조 갱신 후 토글 값 할당 로직 및 획득 시 Attack 호출 존재
FAIL: 참조만 갱신하거나 강제 공격 로직 누락
수정: OnPlayerChanged 및 EquipNewWeapon에 최신 동기화/트리거 코드 보강
GameManager에서 BGM을 재생할 때 하드코딩된 문자열 대신 SoundKeys enum을 사용하는지 확인합니다.
파일: Assets/_Game/Scripts/InGame/Manager/GameManager.cs
검사:
# SoundKeys enum 사용 여부 확인 (예: Play(SoundKeys.InGame.ToString(), ...))
grep "m_soundManager.Play(SoundKeys\..*\.ToString()" Assets/_Game/Scripts/InGame/Manager/GameManager.cs
PASS: SoundKeys enum을 통한 안정적인 키 참조 확인
FAIL: 하드코딩된 문자열 사용 발견 (예: "BGM_Ingame_Wave")
수정: SoundKeys enum 값을 사용하는 코드로 변경
| 검사 항목 | 상태 | 파일/상세 |
|---|---|---|
| 싱글톤 의존성 | PASS | 초기화 단계에서만 사용됨 |
| 데이터 바인딩 | PASS | ViewModel 구독 확인됨 |
| 서버 업로드 무결성 | PASS | SaveGameResult 내 absolute upload(true) 확인 |
| Null 안전성 | PASS | ?. 사용 발견되지 않음 |
| 초기화 안전성 | PASS | CompositionRoot 내 리모트 데이터 대기 로직 확인 |
| 조이스틱 경계 | PASS | 부모 Rect 기준 Clamp 및 앵커 보정 확인 |
| 서비스 주입 | PASS | GameManager 내 IPopupService 전파 확인 |
| 토글 동기화 | PASS | OnPlayerChanged 내 토글 상태 재전달 확인 |
| 공격 트리거 | PASS | 무기 획득 시 즉시 Attack() 호출 확인 |
UniTask, UniRx 등) 내부 코드나 플러그인 디렉토리는 검사에서 제외합니다.?. 사용이 허용될 수 있으나, 가급적 명시적 체크를 권장합니다.