플레이어가 상호작용 가능한 물체 앞에 섰을 때 "E키를 눌러 상호작용" 같은 안내 문구를 화면에 띄우는 것을 구현
WBP로 디자인 → C++ 타입 다리 연결 → 캐릭터가 "어떤 위젯/지금 떠있는 위젯"을 들고 있음 → 띄우기/숨기기 함수 → 오버랩 시점에 그 함수 호출 → 에디터에서 실제 에셋 연결
1. 위젯 블루프린트 만들기
콘텐츠 브라우저에서 우클릭 → User Interface → Widget Blueprint로 WBP_Interaction를 만든다
디자이너 화면에 캔버스 추가하고 그 밑에 Text 위젯 추가하고 "E키를 눌러 상호작용" 문구를 넣는다.
2. C++에서 위젯을 다룰 부모 클래스 만들기
UUserWidget을 상속하는 UInteractionWidget 클래스를 만든다.
블루프린트는 C++이 컴파일 시점에 직접 알 수 없는 에디터 데이터이기 때문에 코드와 연결하려면 이런 타입 다리가 필요하다.
3. WBP의 부모 클래스를 그 C++ 클래스로 지정
WBP_Interaction를 열고 File > Reparent Blueprint에서 UInteractionWidget을 선택한다.
처음 만들 때부터 지정해두었다면 이 단계는 생략된다
4. 캐릭터 헤더에 위젯 관련 변수 추가
TheRoomCharacter.h의 public 영역에 두 개의 변수를 추가한다
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Interaction, meta = (AllowPrivateAccess = "true"))
TSubclassOf<UInteractionWidget> InteractionWidgetClass; // 어떤 위젯을 띄울지
UPROPERTY()
UInteractionWidget* InteractionWidgetInstance; // 지금 실제로 떠있는 위젯 (실체)
5. 위젯을 띄우고/숨기는 함수 작성
void ShowInteraction();
void HideInteraction();
void ATheRoomCharacter::ShowInteraction()
{
if (!InteractionWidgetInstance && InteractionWidgetClass)
{
InteractionWidgetInstance = CreateWidget<UInteractionWidget>(GetWorld(), InteractionWidgetClass);
InteractionWidgetInstance->AddToViewport();
}
}
void ATheRoomCharacter::HideInteraction()
{
if (InteractionWidgetInstance)
{
InteractionWidgetInstance->RemoveFromParent();
InteractionWidgetInstance = nullptr;
}
}
필요한 include는 Blueprint/UserWidget.h와 InteractionWidget.h다.
6. ABaseItem의 오버랩 함수에서 호출 연결
// OnItemOverlap 안
PlayerCharacter->ShowInteraction();
// OnItemEndOverlap 안
PlayerCharacter->HideInteraction();
오버랩이 시작되는 순간 위젯을 띄우고, 오버랩이 끝나는 순간 제거한다.
7. 캐릭터 블루프린트에서 슬롯 연결
Details 패널의 InteractionWidgetClass 슬롯에 WBP_InteractionPrompt를 끼운다
설계도(TSubclassOf)와 실체(인스턴스 포인터)를 분리해두면 "무엇을 만들지"와 "지금 만들어진 게 있는지"를 각각 따로 관리할 수 있다. 그래서 ShowInteraction에서는 인스턴스가 없을 때만 새로 만들고, HideInteraction에서는 인스턴스가 있을 때만 제거하는 식으로 중복 생성이나 빈 제거를 막을 수 있다
'프로젝트 > The Room (방탈출 게임)' 카테고리의 다른 글
| 상호작용하면 열리는 서랍장 만들기 (0) | 2026.06.22 |
|---|---|
| 편지를 읽어야 문이 열리는 시스템 만들기 (0) | 2026.06.22 |
| 편지 토글과 안내 UI 겹침 문제 해결 (0) | 2026.06.22 |
| Enhanced Input으로 E키 상호작용 연결하기 (0) | 2026.06.22 |
| 인터페이스, Enhanced Input 매핑, UI 연결 (0) | 2026.06.21 |
