Agent Log - dopple
- 작업일: 2025-11-23
Start Log
- 20251123 (시작 시간 미기록)
작업 목표
상호작용 시스템 리팩토링 설계
- APredestalSwitch와 InteractableComponent 통합 방안 검토
- UInteractionSystem 컴포넌트 기반 아키텍처 설계
- Overlap + LineTrace 방식의 최적화된 감지 시스템 구축
To Do
- [x] 현재 상호작용 시스템 분석 (APredestalSwitch, APlayerActor, InteractableComponent)
- [x] 옵션 2 방식 채택 (Overlap Zone + Tick LineTrace)
- [x] InteractableComponent 통합 재사용성 설계
- [x] UInteractionSystem 컴포넌트 분리 설계
- [ ] InteractableComponent에 EInteractionType 추가
- [ ] UInteractionSystem 구현
- [ ] APredestalSwitch 리팩토링
- [ ] Luggage 호환성 테스트
Compact Log 1
- 20251123 (현재)
요약 내용
상호작용 시스템 아키텍처 설계 완료
사용자와 함께 상호작용 시스템의 최적 설계 방향을 논의하고, UInteractionSystem 컴포넌트 기반 아키텍처를 확정했습니다.
주요 설계 결정사항:
감지 방식: Overlap Zone + LineTrace 하이브리드 방식 채택
- InteractableComponent가 DetectionRange(BoxComponent)로 플레이어 근접 감지
- UInteractionSystem이 범위 내 객체만 LineTrace로 타겟팅
- 성능 최적화 및 정확한 타겟팅 동시 달성
컴포넌트 분리: UInteractionSystem 신규 생성
- APlayerActor에서 상호작용 로직 완전 분리
- 단일 책임 원칙 준수
- 다른 캐릭터에도 재사용 가능한 범용 시스템
타입 시스템: EInteractionType enum 도입
- PickUp, Button, Lever, Door, Custom 타입 지원
- 타입별 자동 처리 로직
- 확장성 극대화
후방 호환성: 기존 Luggage 코드 변경 불필요
- InteractionType 기본값을 PickUp으로 설정
- PickUp()/Drop() 함수 유지
- 기존 코드 0라인 수정으로 호환
설계된 구조:
InteractableComponent (공통 인터페이스)
├─ Luggage (Type: PickUp)
├─ PredestalSwitch (Type: Button)
└─ Door (Type: Door)
UInteractionSystem (감지 및 처리)
├─ NearbyInteractables (Overlap 등록)
├─ DetectInteractableTarget() (LineTrace)
└─ TryInteract() (타입별 처리)
APlayerActor (간소화)
└─ InteractionSystem 컴포넌트만 소유
코드 간소화 예상:
- APlayerActor: ~100 라인 감소
- APredestalSwitch: ~70 라인 감소
- 재사용성: 새 타입 추가 시 ~10 라인만 필요
다음 단계
Next To Do:
- InteractableComponent.h에 EInteractionType, 델리게이트, DetectionRange 추가
- UInteractionSystem.h/.cpp 신규 생성
- APredestalSwitch를 InteractableComponent 기반으로 리팩토링
- APlayerActor에서 상호작용 로직 제거 및 InteractionSystem 추가
- Luggage 호환성 테스트
- 빌드 및 통합 테스트
Commit 정보
현재 staged 파일:
Source/Onepiece/Prop/Private/APlatformSwitch.cpp(삭제)Source/Onepiece/Prop/Private/APredestalSwitch.cpp(추가)Source/Onepiece/Prop/Public/APlatformSwitch.h(삭제)Source/Onepiece/Prop/Public/APredestalSwitch.h(추가)
Summary (EN): refactor: rename APlatformSwitch to APredestalSwitch for clarity
세부 내역:
"클래스명 변경"
- APlatformSwitch를 APredestalSwitch로 리네임
- 발판 스위치의 명확한 의미 전달을 위한 네이밍 개선
"파일 구조 정리"
- 기존 APlatformSwitch.h/.cpp 삭제
- APredestalSwitch.h/.cpp 신규 생성
- 기능적 변경 없음, 순수 리네이밍
Note: 이 Compact Log는 설계 단계의 작업을 기록합니다. 실제 구현은 다음 작업에서 진행됩니다.
Compact Log 2
- 20251123 17:30
요약 내용
UInteractionSystem 기반 상호작용 시스템 완전 구현 완료
Compact Log 1에서 설계한 상호작용 시스템을 완전히 구현하고, 추가로 ADoor 클래스를 새로 생성했습니다.
구현 완료 사항:
InteractableComponent 확장
- EInteractionType enum 추가 (None, PickUp, Button, Lever, Door, Custom)
- FOnInteractionTriggered 델리게이트 추가
- DetectionRange(BoxComponent) 자동 생성 시스템
- DetectionDistance, bShowDetectionDebug 프로퍼티 추가
- TickComponent에서 디버그 박스 시각화 (Green/Yellow)
- TriggerInteraction() 범용 상호작용 함수
UInteractionSystem 신규 생성
- NearbyInteractables 배열 (Overlap 기반 등록)
- CurrentTarget (LineTrace 기반 타겟팅)
- HoldingInteractable (PickUp 상태 관리)
- TryInteract(), TryPickUp(), TryDrop() 함수
- RegisterInteractable(), UnregisterInteractable() 함수
- DetectInteractableTarget() (화면 중앙 LineTrace)
APredestalSwitch 리팩토링
- InteractableComponent 통합
- OnInteractionTriggered 델리게이트 바인딩
- OnActivated() 콜백 함수
- FTimerHandle을 이용한 Duration 기반 자동 리셋
- ~150 라인 → ~40 라인 (70% 코드 감소)
APlayerActor 간소화
- 상호작용 로직을 UInteractionSystem으로 완전 분리
- PrimaryActorTick.bCanEverTick = false (성능 개선)
- Cmd_Interact() 추가
- ~100 라인 코드 감소
APlayerControl 업데이트
- OnInteract(), Server_OnInteract() 추가
- IA_Interact 입력 액션 바인딩
- 멀티플레이 Server RPC 유지
ADoor 클래스 신규 생성
- OnDoorMessage() 메시지 핸들러
- DoorIndex, ReqCount 기반 카운팅 시스템
- OpenDoor_Implementation(), CloseDoor_Implementation() (BlueprintNativeEvent)
- 여러 스위치가 하나의 문을 제어하는 구조
주요 버그 수정:
- Crash 수정: GetOwner() nullptr 체크 추가
- CurrentTarget nullptr 이슈: PickUp() 호출 전에 HoldingInteractable에 먼저 할당
- 원인: AttachToComponent → Overlap 해제 → UnregisterInteractable → CurrentTarget = nullptr
- 해결: 순서 변경 (HoldingInteractable 저장 → PickUp 호출)
성능 개선:
- APlayerActor Tick 비활성화
- Overlap + LineTrace 하이브리드로 불필요한 검사 최소화
- DetectionRange로 근접 객체만 타겟팅 후보로 등록
아키텍처 개선 결과:
Before:
APlayerActor (300+ 라인, Tick 매 프레임)
APredestalSwitch (150+ 라인, Overlap 직접 관리)
After:
APlayerActor (200 라인, Tick 없음)
└─ UInteractionSystem (200 라인, 재사용 가능)
InteractableComponent (범용 컴포넌트)
└─ APredestalSwitch (40 라인)
└─ ADoor (30 라인)
└─ Luggage (기존 코드 0라인 수정)
변경 파일
신규 생성:
Source/Onepiece/Character/Public/UInteractionSystem.hSource/Onepiece/Character/Private/UInteractionSystem.cppSource/Onepiece/Interactable/Public/ADoor.hSource/Onepiece/Interactable/Private/ADoor.cpp
수정:
Source/Onepiece/Interactable/Public/InteractableComponent.hSource/Onepiece/Interactable/Private/InteractableComponent.cppSource/Onepiece/Interactable/Public/APredestalSwitch.hSource/Onepiece/Interactable/Private/APredestalSwitch.cppSource/Onepiece/Character/Public/APlayerActor.hSource/Onepiece/Character/Private/APlayerActor.cppSource/Onepiece/Character/Public/APlayerControl.hSource/Onepiece/Character/Private/APlayerControl.cpp
블루프린트:
Content/CustomContents/Platfrom/Blueprint/Portal2/BP_PortalDoor.uasset(수정)Content/CustomContents/Blueprints/Enviroment/BP_PortalDoor.uasset(신규)
완료된 ToDo
- [x] InteractableComponent에 EInteractionType 추가
- [x] UInteractionSystem 구현
- [x] APredestalSwitch 리팩토링
- [x] APlayerActor 간소화
- [x] APlayerControl 업데이트
- [x] CurrentTarget nullptr 버그 수정
- [x] PredestalSwitch 자동 리셋 기능 추가
- [x] DetectionDistance 시각화 추가
- [x] ADoor 클래스 생성
진행 중 작업
- [ ] ADoor 블루프린트 통합 테스트
- [ ] Luggage 호환성 최종 검증
Commit 정보
현재 staged 파일:
Source/Onepiece/Interactable/Private/ADoor.cpp(신규)Source/Onepiece/Interactable/Public/ADoor.h(신규)
Summary (EN): feat: add ADoor class with multi-switch door control system
세부 내역:
"ADoor 클래스 생성"
- OnDoorMessage() 메시지 기반 제어 시스템
- DoorIndex와 ReqCount 기반 카운팅
- 여러 스위치가 하나의 문을 제어하는 구조
- BlueprintNativeEvent로 OpenDoor/CloseDoor 블루프린트 확장 가능
"메시지 기반 문 제어"
- CurCount 카운터로 활성화된 스위치 개수 추적
- ReqCount 도달 시 문 열림
- 안전한 Clamp 처리
Note: 이 Compact Log는 설계 이후 전체 구현 완료를 기록합니다. 다음 작업은 ADoor 블루프린트 통합 및 최종 테스트입니다.