1. EquipmentManager + 커맨드 패턴 구조화
- 추상화 계층 도입
- EquipmentManager 추상 클래스 정의
- IssueCommand(ICommand) 추상 메서드로 입력 커맨드를 분리
- 장착/해제 로직
- TryEquip(ItemStack stack) / TryUnequip() 메서드로 실제 장착·해제 처리
- 구현체
- PlayerEquipmentManager 서브클래스 작성
- EquipCommand / UnequipCommand 를 받아 내부에서 TryEquip·TryUnequip 호출
- 처리 완료 후 command.Complete() 호출로 BaseCommand 파이널라이저 에러 해소
2. UI 슬롯 드래그·드롭 비활성화
- 핫바 슬롯 Prefab(Slot_Equip)
- 붙어 있던 TransferableItemSlot 컴포넌트를 제거 혹은 enabled = false 처리
- 장착 슬롯
- 단일 아이콘 표시만 허용
- 드래그 이동 기능 비활성화
3. 트러블슈팅: 콜라이더 충돌로 플레이어 밀림 현상
- 문제
- 장착용 프리팹에 비Trigger 콜라이더가 붙어 있어,
- rightHand 하위에 붙이는 순간 물리 충돌로 플레이어 오브젝트가 밀려남
- 해결
- 프리팹 에디터에서 Collider → Is Trigger 체크
- 불필요하면 Collider 컴포넌트 제거
- Rigidbody가 붙어 있으면 isKinematic = true 혹은 아예 제거
4. 디버그 로그 활용
- 입력 감지 확인 (Update)
if (Input.GetKeyDown(KeyCode.R))
Debug.Log("R 눌림, Peek: " + equippedSlot.Slot.Peek());
→ 키 입력이 정상 수신되는지 검증
- Stack 정보 출력 (TryEquip)
var peek = equippedSlot.Slot.Peek();
Debug.Log($"[Equip] Peek ID={peek.ID}, Count={peek.Value}");
- Prefab 조회 여부
if (!accessor.TryGetValue(peek.ID, out var prefab))
Debug.LogError($"EquipableData에 ID {peek.ID}용 프리팹이 없습니다!");
- Instantiate 전후 플레이어 위치 체크 인스턴스화 확인
Debug.Log($"[Equip] 생성됨: {currentModel.name}, parent={currentModel.transform.parent.name}");
5. 실시간 지형 포함 NavMesh 매핑(맵 매핑) 시스템 구현
- AutoUpdateSceneNavmesh 스크립트에서 NavMeshBuilder.CollectSources + UpdateNavMeshDataAsync로 런타임 NavMesh 갱신
- TerrainCollider 대신 RenderMeshes 또는 NavMeshBuildSourceShape.Terrain 직접 추가로 지형 높이맵 포함
- NavMesh.GetSettingsByID 기반 기본 설정 로드 후 agentSlope↑, voxelSize↓, minRegionArea↓ 등으로 틈새 제거
- 범위(Bounds) 이동에 따라 주기적 업데이트, 에이전트 활성화 타이밍 보정으로 매끄러운 맵 매핑 완성
6. 배운 점
- 물리 콜라이더가 의도치 않게 부모 오브젝트에 영향을 줄 수 있으니, 시각용 오브젝트엔 반드시 isTrigger=true 혹은 삭제
- 커맨드 패턴을 도입할 땐 완료(Complete)/취소(Cancel) 호출을 잊지 않아야 BaseCommand 파이널라이저 에러가 발생하지 않음
- GetKeyDown 블록 안에 로직을 정확히 감싸서, 매 프레임 불필요한 호출을 방지
- Instantiate(prefab, parent, false) 오버로드를 사용하면 로컬 변형만 적용하고 부모 Transform이 흔들리지 않음