아이템 획득 및 게임스테이트, 플레이어 스테이트 활용

DevBison·2025년 8월 23일

언리얼 C++ 델리게이트와 아이템 점수 시스템 구현

1. 충돌 관련 델리게이트

  • OnComponentHit : 블록 충돌이 발생할 때 호출되는 델리게이트
  • OnComponentBeginOverlap : 오버랩 시작 시 호출되는 델리게이트
  • OnComponentEndOverlap : 오버랩 끝날 때 호출되는 델리게이트

블루프린트에서 이벤트 바인딩을 가능하게 해주는 매크로가 DYNAMIC이고,
MULTICAST는 여러 함수를 동시에 바인딩할 수 있다는 의미다.


2. 컴포넌트 충돌 이벤트 바인딩

헤더

cpp

mBody->OnComponentHit.AddDynamic(this, &APlatformItem::BoxHit);
mBody->OnComponentBeginOverlap.AddDynamic(this, &APlatformItem::BoxOverlap);
mBody->OnComponentEndOverlap.AddDynamic(this, &APlatformItem::BoxEndOverlap);


3. OnComponentHit / Overlap 함수 정의

OnComponentHit를 타고 들어가면 내부가 Dynamic Multicast로 구현되어 있어 여러 함수를 동시에 바인딩할 수 있음을 알 수 있다.



헤더에서 함수 선언

UFUNCTION()
void BoxHit(UPrimitiveComponent* HitComponent, AActor* OtherActor,
    UPrimitiveComponent* OtherComp, FVector NormalImpulse,
    const FHitResult& Hit);

UFUNCTION()
void BoxOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
    UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep,
    const FHitResult& SweepResult);

UFUNCTION()
void BoxEndOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
    UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);





세 개의 함수(BoxHit, BoxOverlap, BoxEndOverlap)를 최종적으로 정의한다.


4. 생성자와 Tick에서 등록

  • 생성자에서 AddDynamic을 통해 이벤트 연결
  • 디버그 메시지로 정상 동작 확인




5. 카메라 충돌 무시 설정

아이템 프리셋에서 카메라 채널을 무시하면, 플레이어 시점에서 카메라가 튕기지 않고 자연스럽게 유지된다.


6. 아이템 획득 시 점수 시스템

플레이어가 아이템과 블록되면 Hit가 발생한다.

아이템을 먹을 때마다 점수가 오르는 기능을 구현한다.
방법은 크게 두 가지:

  1. PlayerState 이용
  2. GameState 이용

7. GameState 기반 점수 관리

  1. APlatformGameState 클래스 생성 (GameStateBase 상속)
  2. PlatformGameMode.cpp에서 등록
GameStateClass = APlatformGameState::StaticClass();


GameState 헤더



8. PlayerState 기반 점수 관리

  1. APlatformPlayerState 클래스 생성 (PlayerState 상속)
  2. PlatformGameMode.cpp에 등록


PlayerState는 플레이어 개별 점수 관리에 적합하다.
GameState는 게임 전체 아이템 수 관리에 적합하다.


9. 아이템 클래스 점수 변수

아이템마다 점수를 다르게 줄 수 있도록 PlatformItem.h에 변수 선언.



컴파일 후 아이템 스코어를 에디터에서 직접 설정 가능하다.


10. 점수 적용 흐름

  • 아이템 오버랩 시 → DeleteItem() 실행
  • PlayerController를 통해 PlayerState를 가져와 점수 반영
  • GameState에서는 아이템 개수 카운트





11. EndPoint 액터 만들기

플레이어가 특정 지점에 닿으면 게임이 끝나는 기능 구현.

  1. EndPoint 액터 생성
  2. mBody 컴포넌트와 오버랩 이벤트 추가
  3. Kismet/KismetSystemLibrary.h 인클루드 후 QuitGame() 호출




플레이할 때 EndPoint 박스에 오버랩되면 게임이 종료된다.


정리

  • OnComponentHit, OnComponentBeginOverlap, OnComponentEndOverlap → 충돌 이벤트 델리게이트
  • AddDynamic으로 함수 바인딩
  • PlayerState / GameState로 점수 관리 구조 설계
  • 아이템 스코어 반영 + EndPoint에서 게임 종료 처리

profile
응애 개발자

0개의 댓글