본문 바로가기

Unreal/언리얼 엔진 5로 개발하는 멀티플레이어 게임(Book)

[Unreal] US_BaseWeaponProjectile.cpp 코드 분석

SphereCollision

SphereCollision = CreateDefaultSubobject<USphereComponent>("Collision"); // Collision 가져오기
SphereCollision->SetGenerateOverlapEvents(true);// 오버랩 이벤트 활성화
SphereCollision->SetSphereRadius(10.0f); // Collision 크기 설정
SphereCollision->BodyInstance.SetCollisionProfileName("BlockAll");
SphereCollision->OnComponentHit.AddDynamic(this, &AUS_BaseWeaponProjectile::OnHit); // 충돌 이벤트 바인딩

RootComponent = SphereCollision; // 루트 컴포넌트 지정

 

SphereCollision->BodyInstance.SetCollisionProfileName("BlockAll"): 해당 옵션은 오브젝트의 이름으로 충돌 여부를 결정할 수 있다. 다만, 현재는 모든 충돌 채널과 상호작용하도록 설정되어 있다.

Mesh

Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh"); // mesh 가져오기
Mesh->SetupAttachment(RootComponent); // 루트의 자식 선언
Mesh->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); // 물리 충돌만 활성화
Mesh->SetRelativeLocation(FVector(-40.f, 0.f, 0.f)); // 위치 설정
Mesh->SetRelativeRotation(FRotator(-90.f, 0.f, 0.f));// 회전 설정

// 설정할 mesh 가져오기
static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMesh(TEXT("/Game/KayKit/DungeonElements/dagger_common"));
if (StaticMesh.Succeeded())
{
    // mesh 설정
    GetMesh()->SetStaticMesh(StaticMesh.Object);
}

 

Mesh->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly): 물리 충돌만 활성화한다. 즉, SphereCollision은 오브젝트의 충돌을 활성화하는 것이고, 해당 옵션은 물리적 충돌에 반응하게 하기 위한 것이다.

ProjectileMovement

ProjectileMovement = CreateDefaultSubobject<UProjectileMovementComponent>("ProjectileMovement"); // ProjectileMovement 설정
ProjectileMovement->UpdatedComponent = SphereCollision; 
ProjectileMovement->ProjectileGravityScale = 0; // 중력 영향 제거
ProjectileMovement->InitialSpeed = 3000; // 초기 속도
ProjectileMovement->MaxSpeed = 3000; // 최대 속도(가속 없음)
ProjectileMovement->bRotationFollowsVelocity = true; // 이동 방향으로 회전
ProjectileMovement->bShouldBounce = false; // 충돌 시 튕김 비활성화

bReplicates = true; // 네트워크 복제 활성화

 

ProjectileMovement->UpdatedComponent = SphereCollision: 해당 옵션은 언리얼 문서에 따르면 "이동하고 업데이트할 구성요소를 할당합니다."라고 되어 있는데, 정확하지는 않지만 날아가는 방향을 정하기 위해 사용되는 듯하다.