카테고리 없음

2025.07.01 13주차 화요일

mochoa 2025. 7. 1. 20:27

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 하위에 붙이는 순간 물리 충돌로 플레이어 오브젝트가 밀려남
  • 해결
    1. 프리팹 에디터에서 Collider → Is Trigger 체크
    2. 불필요하면 Collider 컴포넌트 제거
    3. 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이 흔들리지 않음