화면에 조준 기준점이 없어서 카메라가 정확히 어디를 보고 있는지 판단하기 위해 크로스헤어 생성
기존 위젯과의 차이
InteractionWidget은 상호작용 가능한 대상을 조준했을 때만 나타나고 벗어나면 사라지는 토글 방식이라, ShowInteraction/HideInteraction 함수가 따로 있음
반면 크로스헤어는 게임이 시작되면 끝까지 화면에 떠 있어야 하는 UI라 같은 패턴(생성 후 AddToViewport)을 쓰더라도 호출 시점이 달라야 함
토글이 필요한 위젯은 Tick에서 상태가 바뀔 때마다 호출하지만 크로스헤어는 한 번만 생성해서 계속 띄워두면 되므로 BeginPlay 시점에 생성
.h
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = UI, meta = (AllowPrivateAccess = "true"))
TSubclassOf<UUserWidget> CrosshairWidgetClass;
UPROPERTY()
UUserWidget* CrosshairWidgetInstance;
protected:
virtual void BeginPlay() override;
.cpp
void ATheRoomCharacter::BeginPlay()
{
Super::BeginPlay();
if (CrosshairWidgetClass)
{
CrosshairWidgetInstance = CreateWidget<UUserWidget>(GetWorld(), CrosshairWidgetClass);
CrosshairWidgetInstance->AddToViewport();
}
}
InteractionWidget이 TSubclassOf<UInteractionWidget>처럼 커스텀 위젯 클래스를 쓰는 것과 달리 크로스헤어는 별도 로직 없이 단순 표시만 하면 되므로 UUserWidget 기본 타입을 그대로 사용
WBP_Crosshair 에디터 작업
- Canvas Panel 안에 Border위젯 추가, 작은 점 형태로 Size 지정
- Anchor를 화면 중앙으로 설정

캐릭터 크로스헤어 위젯 클래스에 지정

배운 점
Anchor는 "캔버스 상에서 기준이 되는 좌표"를 정하는 것이고, Alignment는 "그 기준점에 위젯의 어느 지점을 맞출지"를 정하는 것이라 둘이 별개의 속성
기본 타입(UUserWidget)이란
언리얼이 기본으로 제공하는 위젯 클래스
화면에 뭔가를 띄우는 가장 기초적인 기능(생성, AddToViewport로 화면에 표시, 제거)만 갖고 있음
커스텀 위젯 클래스란
UUserWidget을 상속받아서 거기에 필요한 동작이나 데이터를 추가로 짜넣은 나만의 클래스
예를 들어 UInteractionWidget은 단순히 화면에 떠 있는 게 아니라 다양한 효과들이 들어감
이런 추가 기능이 필요하니까, UUserWidget을 그냥 쓰는 게 아니라 class UInteractionWidget : public UUserWidget처럼 새 클래스를 만들어서 필요한 변수나 함수를 더 얹는 것
'프로젝트 > The Room (방탈출 게임)' 카테고리의 다른 글
| 트러블 슈팅: Timeline의 Length 값과 Float Track 시간 차이 문제 (0) | 2026.06.26 |
|---|---|
| 책장-쪽지 인터랙션 구현 (0) | 2026.06.26 |
| 트러블슈팅: 라인트레이스가 상호작용 물체를 못 잡는 문제 (0) | 2026.06.26 |
| BrightLetter 추가, 메시 작업 (0) | 2026.06.25 |
| Custom Depth와 Post Process Material로 인터랙션 대상 외곽선 그리기 (0) | 2026.06.23 |
