아이템 상자 구현

이득우의 Unreal C++ 게임 개발 표준

아이템 상자는 플레이어와의 교차점을 감지하는 충돌 상자와 시각화를 담당하는 정적 메쉬로 구성됩니다.

ABItemBox 액터를 만듭니다.


스태틱 메시 자산 SM_Env_Breakables_Box1을 엽니다.

왼쪽 상단의 정보에서 다음을 확인할 수 있습니다.

  • LOD 상태
  • 다각형 및 정점 수
  • 대략적인 크기
  • 충돌 유형 수
    상단의 Collision 메뉴에서 Simple 또는 Complex를 선택하면 Collision을 녹색으로 볼 수 있습니다.


현재 기본적으로 상자 충돌이 있지만 없으면 추가할 수 있습니다.


상자가 너무 작아서 작게 만들겠습니다.

디테일 패널의 LOD 0 섹션에서 빌드 스케일을 조정하여 크기를 변경할 수 있습니다.

  • 이런 식으로 원본 데이터의 스케일을 변경하면 게임 로직에서 변환의 스케일 값에 대해 걱정할 필요가 없습니다.


(X, Y, Z)에 각각 1.5를 곱했습니다.

  • 빌드 스케일을 변경한 후 아래의 변경 사항 적용 버튼을 클릭하여 적용합니다.


대략적인 치수는 53cm x 55cm x 27cm에서 80cm x 82cm x 41cm로 변경되었습니다.


항목 상자에 사용할 새 개체 충돌 채널을 만듭니다.


또한 ItemBox라는 새 사전 설정을 만듭니다.

  • 물리적 처리 없이 겹침만 감지하므로 Query Only로 설정합니다.
  • 기본값은 Ignore 이지만 캐릭터와의 겹침을 확인해야 하므로 ABCcharacter 채널을 겹침으로 설정합니다.
  • 기본적으로 ItemBox에 대한 ABCcharacter의 반응은 겹치도록 설정됩니다.
    설정하지 않으면 “무시”가 “겹침”보다 우선 순위가 높으므로 무시됩니다.

헤더 파일에 CoreMinimal.h 대신 ArenaBattle.h를 포함합니다.


플레이어를 감지하는 트리거로 사용할 Box 구성 요소와 시각적 부분을 담당하는 Static Mesh 구성 요소 변수를 만듭니다.

또한 OnCharacterOverlap() 함수를 생성하여 트리거에서 OnComponentBeginOverlap 대리자로 등록합니다.


OnComponentBeginOverlap 대리자는 다음과 같이 PrimitiveComponent.h에서 선언됩니다.

  • 대부분의 경우 이러한 충돌 검사기의 대리자는 매우 긴 함수 인수를 등록해야 합니다.
  • 익숙해지기 전까지는 직접 작성하는 것보다 F12를 눌러 선언된 부분을 찾아 복사하는 것이 좋다.


OnComponentBeginOverlap이 동적 멀티캐스트 델리게이트임을 알 수 있습니다.


Delegate에 등록할 함수는 다음 서명이 있어야 합니다.

  • 함수 이름은 중요하지 않습니다.
void OnCharacterOverlap(class UPrimitiveComponent* OverlappedComp,  // 나의 겹친 컴포넌트
                        AActor* OtherActor,                         // 겹친 상대 액터
                        class UPrimitiveComponent* OtherComp,       // 겹친 상대 컴포넌트
                        int32 OtherBodyIndex,
                        bool bFromSweep,                            // Sweep의 결과인지 여부
                        const FHitResult& SweepResult);             // 겹친 지점 등의 정보를
                                                                    // 담는 구조체

상자 구성 요소를 생성하고 정적 메시 구성 요소에 상자 자산을 할당합니다.

  • UBoxComponent->SetBoxExtent(FVector) 함수를 사용하여 박스 컴포넌트의 크기를 조정할 수 있습니다.
  • Transforms Scale과 다르며 각 축 값은 실제 크기의 절반을 의미합니다.

Box 구성 요소는 ItemBox 환경 설정을 설정하여 도형과의 겹침을 결정하고 Static Mesh 구성 요소는 NoCollision을 설정하여 충돌을 방지합니다.


PostInitializeComponents() 함수에서 Box 구성 요소의 OnComponentBeginOverlap 대리자에 OnCharacterOverlap 함수를 등록합니다.


ABCcharacter 채널과 겹치면 로그가 출력됩니다.


아이템 상자가 캐릭터를 인식했습니다.