플레이어 캐릭터와 다양한 오브젝트 간의 상호작용을 유연하게 처리할 수 있도록 구현한 상호작용 시스템입니다. 핵심 구조는 InteractionSystem 컴포넌트를 기반으로 하며, 상호작용 가능한 대상은 인터페이스 기반으로 분리하여 확장성과 재사용성을 고려했습니다.
시스템 구조 및 동작 방식
- 상호작용 기능은 InteractSystem이라는 ActorComponent에 구현되어 있으며, 해당 컴포넌트를 소유한 액터는 상호작용을 수행하는 주체가 됩니다.
- 상호작용 대상은 Interactable 인터페이스를 상속하여 구현되며, 이 인터페이스를 통해 상호작용 관련 데이터를 제공하고 상호작용을 실행합니다.
- 플레이어 캐릭터의 CapsuleComponent에 Overlap된 액터들 중 Interactable 인터페이스를 상속한 액터만을 필터링하여InteractableActors 배열에 저장합니다.
- 상호작용을 시작할 때는 InteractionSystem의 SelectInteractableIndex에 해당하는 액터를 선택하여 해당 액터의 Interactable 인터페이스 함수를 호출함으로써 상호작용을 실행합니다.
상호작용 정보 (InteractionData)
/**
* 상호작용에 대한 정보를 나타내는 구조체입니다.
*/
USTRUCT(Atomic, BlueprintType)
struct FPRInteractionData
{
GENERATED_BODY()
public:
FPRInteractionData()
: Icon(nullptr)
, InteractionText(FText::GetEmpty())
, InteractionType(EPRInteractionType::Press)
, HoldDuration(4.0f)
, HoldInProgressText(FText::GetEmpty())
, TapCount(4)
, bUseItemAcquisitionNotification(false)
{}
FPRInteractionData(UTexture2D* NewIcon, FText NewInteractionText, EPRInteractionType NewInteractionType,
FText NewHoldInProgressText, float NewHoldDuration, int32 NewTapCount, bool bNewbUseItemAcquisitionNotification)
: Icon(NewIcon)
, InteractionText(NewInteractionText)
, InteractionType(NewInteractionType)
, HoldDuration(NewHoldDuration)
, HoldInProgressText(NewHoldInProgressText)
, TapCount(NewTapCount)
, bUseItemAcquisitionNotification(bNewbUseItemAcquisitionNotification)
{}
public:
/** 상호작용 아이콘입니다. 아이템 또는 행동을 시각적으로 나타냅니다. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PRInteractionData")
UTexture2D* Icon;
/** 상호작용 대상의 이름 또는 설명입니다. (예: '오래된 코등이', '문 열기') */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PRInteractionData")
FText InteractionText ;
/** 상호작용 방식입니다. Press, Hold, Tap 중 하나입니다. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PRInteractionData")
EPRInteractionType InteractionType;
/** Hold 방식일 때, 상호작용이 실행되기까지 누르고 있어야 하는 시간입니다. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "PRInteractionData", meta = (EditCondition = "InteractionType == EPRInteractionType::Hold", ClampMin = "0.0"))
float HoldDuration;
/** Hold 방식일 때, 표시할 진행 상태 문구입니다. (예: "열기 진행 중...") */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "PRInteractionData", meta = (EditCondition = "InteractionType == EPRInteractionType::Hold", ClampMin = "0.0"))
FText HoldInProgressText;
/** Tap 방식일 때, 상호작용을 실행하기 위해 눌러야 하는 횟수입니다. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "PRInteractionData", meta = (EditCondition = "InteractionType == EPRInteractionType::Tap", ClampMin = "0"))
int32 TapCount;
/** 아이템 획득 알림의 사용 여부입니다. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PRInteractionData")
bool bUseItemAcquisitionNotification;
};
상호작용에 필요한 다양한 데이터를 하나로 관리하기 위해 FPRInteractionData 구조체를 설계했습니다.
이 구조체는 상호작용 아이콘, 상호작용 문구, 방식(Press/Hold/Tap), 진행 문구, 입력 지속 시간 또는 횟수 등의 정보가 포함되어 있어, 개별 오브젝트의 상호작용 동작을 유연하게 정의할 수 있습니다.
상호작용 방식
시스템은 다음의 3가지 상호작용 타입을 제공합니다.
유형 | 설명 |
Press | 버튼을 한 번 눌러 즉시 상호작용을 실행합니다. |
Hold | 일정 시간 동안 입력을 유지해야 상호작용이 완료됩니다. |
Tap | 정해진 횟수만큼 버튼을 눌러야 상호작용이 실행됩니다. |
Hold 및 Tap 방식의 경우, 상호작용 대상의 위치에 프로그래스 바를 생성하여 실시간 진행 상태를 시각적으로 제공합니다.
아이템 획득과 알림
아이템을 획득할 경우 획득한 아이템의 이름과 아이콘을 표시하는 알림 UI를 동적으로 생성하여 플레이어가 획득한 아이템 정보를 즉시 확인할 수 있도록 구현했습니다.
'Project > Replica' 카테고리의 다른 글
[Project Replica] PoolableInterface / EffectSytstem (0) | 2024.06.29 |
---|---|
[Project Replica] PoolableInterface / BaseObjectPoolSystem (0) | 2024.06.25 |
[Project Replica] EffectSystem (0) | 2024.04.30 |
[Project Replica] Vaulting / Vault / 장애물 뛰어넘기 (0) | 2024.04.15 |
[Project Replica] DamageSystem 대미지 시스템 (0) | 2024.01.11 |