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 컴포넌트 기반 아키텍처를 확정했습니다.

주요 설계 결정사항:

  1. 감지 방식: Overlap Zone + LineTrace 하이브리드 방식 채택

    • InteractableComponent가 DetectionRange(BoxComponent)로 플레이어 근접 감지
    • UInteractionSystem이 범위 내 객체만 LineTrace로 타겟팅
    • 성능 최적화 및 정확한 타겟팅 동시 달성
  2. 컴포넌트 분리: UInteractionSystem 신규 생성

    • APlayerActor에서 상호작용 로직 완전 분리
    • 단일 책임 원칙 준수
    • 다른 캐릭터에도 재사용 가능한 범용 시스템
  3. 타입 시스템: EInteractionType enum 도입

    • PickUp, Button, Lever, Door, Custom 타입 지원
    • 타입별 자동 처리 로직
    • 확장성 극대화
  4. 후방 호환성: 기존 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:

  1. InteractableComponent.h에 EInteractionType, 델리게이트, DetectionRange 추가
  2. UInteractionSystem.h/.cpp 신규 생성
  3. APredestalSwitch를 InteractableComponent 기반으로 리팩토링
  4. APlayerActor에서 상호작용 로직 제거 및 InteractionSystem 추가
  5. Luggage 호환성 테스트
  6. 빌드 및 통합 테스트

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

세부 내역:

  1. "클래스명 변경"

    • APlatformSwitch를 APredestalSwitch로 리네임
    • 발판 스위치의 명확한 의미 전달을 위한 네이밍 개선
  2. "파일 구조 정리"

    • 기존 APlatformSwitch.h/.cpp 삭제
    • APredestalSwitch.h/.cpp 신규 생성
    • 기능적 변경 없음, 순수 리네이밍

Note: 이 Compact Log는 설계 단계의 작업을 기록합니다. 실제 구현은 다음 작업에서 진행됩니다.


Compact Log 2

  • 20251123 17:30

요약 내용

UInteractionSystem 기반 상호작용 시스템 완전 구현 완료

Compact Log 1에서 설계한 상호작용 시스템을 완전히 구현하고, 추가로 ADoor 클래스를 새로 생성했습니다.

구현 완료 사항:

  1. InteractableComponent 확장

    • EInteractionType enum 추가 (None, PickUp, Button, Lever, Door, Custom)
    • FOnInteractionTriggered 델리게이트 추가
    • DetectionRange(BoxComponent) 자동 생성 시스템
    • DetectionDistance, bShowDetectionDebug 프로퍼티 추가
    • TickComponent에서 디버그 박스 시각화 (Green/Yellow)
    • TriggerInteraction() 범용 상호작용 함수
  2. UInteractionSystem 신규 생성

    • NearbyInteractables 배열 (Overlap 기반 등록)
    • CurrentTarget (LineTrace 기반 타겟팅)
    • HoldingInteractable (PickUp 상태 관리)
    • TryInteract(), TryPickUp(), TryDrop() 함수
    • RegisterInteractable(), UnregisterInteractable() 함수
    • DetectInteractableTarget() (화면 중앙 LineTrace)
  3. APredestalSwitch 리팩토링

    • InteractableComponent 통합
    • OnInteractionTriggered 델리게이트 바인딩
    • OnActivated() 콜백 함수
    • FTimerHandle을 이용한 Duration 기반 자동 리셋
    • ~150 라인 → ~40 라인 (70% 코드 감소)
  4. APlayerActor 간소화

    • 상호작용 로직을 UInteractionSystem으로 완전 분리
    • PrimaryActorTick.bCanEverTick = false (성능 개선)
    • Cmd_Interact() 추가
    • ~100 라인 코드 감소
  5. APlayerControl 업데이트

    • OnInteract(), Server_OnInteract() 추가
    • IA_Interact 입력 액션 바인딩
    • 멀티플레이 Server RPC 유지
  6. 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.h
  • Source/Onepiece/Character/Private/UInteractionSystem.cpp
  • Source/Onepiece/Interactable/Public/ADoor.h
  • Source/Onepiece/Interactable/Private/ADoor.cpp

수정:

  • Source/Onepiece/Interactable/Public/InteractableComponent.h
  • Source/Onepiece/Interactable/Private/InteractableComponent.cpp
  • Source/Onepiece/Interactable/Public/APredestalSwitch.h
  • Source/Onepiece/Interactable/Private/APredestalSwitch.cpp
  • Source/Onepiece/Character/Public/APlayerActor.h
  • Source/Onepiece/Character/Private/APlayerActor.cpp
  • Source/Onepiece/Character/Public/APlayerControl.h
  • Source/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

세부 내역:

  1. "ADoor 클래스 생성"

    • OnDoorMessage() 메시지 기반 제어 시스템
    • DoorIndex와 ReqCount 기반 카운팅
    • 여러 스위치가 하나의 문을 제어하는 구조
    • BlueprintNativeEvent로 OpenDoor/CloseDoor 블루프린트 확장 가능
  2. "메시지 기반 문 제어"

    • CurCount 카운터로 활성화된 스위치 개수 추적
    • ReqCount 도달 시 문 열림
    • 안전한 Clamp 처리

Note: 이 Compact Log는 설계 이후 전체 구현 완료를 기록합니다. 다음 작업은 ADoor 블루프린트 통합 및 최종 테스트입니다.

results matching ""

    No results matching ""