플레이어가 상호작용 가능한 물체 앞에 섰을 때 "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에서는 인스턴스가 있을 때만 제거하는 식으로 중복 생성이나 빈 제거를 막을 수 있다

+ Recent posts