책장의 책을 상호작용하면 책이 슬라이드되며 빠져나오고, 그 안에 숨겨져 있던 쪽지(BrightLetter)가 드러나서 바닥에 떨어지는 연출을 만들어야 했음. 책은 다시 상호작용하면 제자리로 들어가는 토글 동작도 필요했고, 쪽지는 한 번 떨어진 이후로는 물리 시뮬레이션 상태로 바닥에 남아있으면 됨.
쪽지가 어떻게 드러나는지는 쪽지 자신(ABrightLetter)이 알고, 책(ABook)은 그냥 "이제 드러나라"는 신호만 보내는 구조로 나눔
ABook: 책의 위치 이동만 책임 (빠짐/들어감)
ABrightLetter: 노출 시 가시성, 콜리전, 물리 전환을 책임 (Reveal)
Book.h
UCLASS()
class THEROOM_API ABook : public ABaseItem
{
GENERATED_BODY()
public:
ABook();
virtual void ActivateItem(AActor* Activator) override;
protected:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Book")
ABrightLetter* HiddenNote;
UPROPERTY(BlueprintReadOnly, Category = "Book")
bool bIsPulled = false;
UFUNCTION(BlueprintImplementableEvent, Category = "Book")
void BookPull(); // C++엔 구현 없음, 블루프린트 Timeline이 채움
UFUNCTION(BlueprintImplementableEvent, Category = "Book")
void BookPush(); // 들어가는 연출도 동일한 방식
UFUNCTION(BlueprintCallable, Category = "Book")
void PullFinished(); // Timeline의 Finished 핀에서 호출
};
Book.cpp
ABook::ABook()
{
ItemType = "Book";
}
void ABook::ActivateItem(AActor* Activator)
{
if (Activator && Activator->ActorHasTag("Player"))
{
bIsPulled = !bIsPulled;
if (bIsPulled)
{
BookPull();
}
else
{
BookPush();
}
}
}
void ABook::PullFinished()
{
if (HiddenNote)
{
HiddenNote->Reveal();
}
}
서랍장(ADesk)에서 썼던 bIsOpen = !bIsOpen 토글 패턴을 그대로 가져와서 bIsPulled를 반전시키는 방식으로 빠짐/들어감을 분기함
BlueprintImplementableEvent로 선언만 해두고 실제 이동 로직은 블루프린트가 채우는 구조도 서랍장과 동일
BP_Book 에디터 작업
- ABook을 부모로 하는 블루프린트 생성
- StaticMesh에 책 메시 연결, HiddenNote에 BP_BrightLetter 인스턴스 연결

- EventGraph에 Event BookPull, Event BookPush 노드 추가
- Add Timeline으로 PullTimeline 생성, Float Track에 키 두 개 (0초→0, 0.5초→1)
- Event BookPull → PullTimeline의 Play from Start
- Event BookPush → PullTimeline의 Reverse (같은 커브를 거꾸로 재생해서 Timeline 하나로 양방향 처리)
- Timeline의 Update 핀 → Lerp(시작위치, 목표위치, 진행값) → Set Relative Location
- Timeline의 Finished 핀 → Pull Finished 함수 호출

'프로젝트 > The Room (방탈출 게임)' 카테고리의 다른 글
| 크로스헤어 생성 (UUserWidget, 커스텀 위젯 클래스) (0) | 2026.06.26 |
|---|---|
| 트러블 슈팅: Timeline의 Length 값과 Float Track 시간 차이 문제 (0) | 2026.06.26 |
| 트러블슈팅: 라인트레이스가 상호작용 물체를 못 잡는 문제 (0) | 2026.06.26 |
| BrightLetter 추가, 메시 작업 (0) | 2026.06.25 |
| Custom Depth와 Post Process Material로 인터랙션 대상 외곽선 그리기 (0) | 2026.06.23 |
