책장의 책을 상호작용하면 책이 슬라이드되며 빠져나오고, 그 안에 숨겨져 있던 쪽지(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 함수 호출

+ Recent posts