본문 바로가기

Unreal

UE - 총알 제작하기

 목표

  • 총알 만들기

 

 

구현 순서

  1. Bullet 클래스 생성
  2. 필요 컴포넌트 추가
  3. 블루프린트 Bullet 만들고 테스트

 

 

1. Bullet 클래스 생성

  • 부모 클래스는 Actor로 생성
  • 플레이어가 날아가는 총알에 대한 **제어권**이 필요하지 않기 때문에 폰 기반이 아닌 액터를 사용합니다.

 

 

2. 필요한 컴포넌트 추가하기

물체가 다른 물체와 충돌하면 단순하게 이벤트만 발생하는 것이 아니라 튕겨나가게 될 것입니다. 그 때 물체의 회전 및 에너지 감소가 발생하여 힘이 약해지고 물체의 물리적 재질 형태에 따라서 탄성의 표현도 필요할 것입니다.

이를 위해 언리얼 엔진에서 제공하는 물리를 이용하여 간단히 해당 내용을 표현할 수 있습니다. 발사체 형태의 물리 기능을 제공하는 컴포넌트인 UProjecttileMovementComponent를 사용해보겠습니다.

 

 

Bullet.h 충돌체 및 외관 컴포넌트 멤버 변수 추가.

public:
	// 발사체의 이동을 담당할 컴포넌트
	UPROPERTY(VisibleAnywhere, Category=Movement)
	class UProjectileMovementComponent* movementComp;

	// 충돌 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = Collision)
	class USphereComponent* collisionComp;

	// 외관 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = BodyMesh)
	class UStaticMeshComponent* bodyMeshComp;

 

 

Bullet.cpp 충돌체 컴포넌트 추가

// 1. 충돌체 등록하기
collisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("CollisionComp"));
// 2. 충돌 프로파일 설정
collisionComp->SetCollisionProfileName(TEXT("BlockAll"));
// 3. 충돌체 크기 설정
collisionComp->SetSphereRadius(13);
// 4. 루트로 등록
RootComponent = collisionComp;

외관 컴포넌트인 bodyMeshComp가 아닌 충돌 컴포넌트인 collisionComp가 RootComponent인 이유는 총알이 날아갈 때 충돌체가 날아가야 정확한 충돌처리가 가능하기 때문입니다.

 

 

RootComponent로 collisionComponent를 사용하는 이유

 

1. RootComponent로 CollisionComponent, ChildComponent로 MeshComponent를 사용하는 경우

  • 장점:
    • 정확한 충돌 감지: 충돌 컴포넌트가 루트이므로, 총알의 위치와 상관없이 항상 정확한 충돌 박스가 유지됩니다. 이는 물리 시뮬레이션에서 매우 중요하며, 예측 가능한 충돌 결과를 얻을 수 있도록 합니다.
    • 성능 향상: 메시 컴포넌트는 렌더링에 많은 비용이 드는 요소입니다. 충돌 컴포넌트를 루트로 설정하면 메시 컴포넌트의 변환 행렬 계산 횟수를 줄여 성능을 향상시킬 수 있습니다.
    • 개발 편의성: 충돌 설정을 한 곳에서 관리할 수 있어 개발 과정이 간편해집니다.
  • 단점:
    • 시각적인 표현: 메시 컴포넌트가 자식이므로, 부모 컴포넌트인 충돌 컴포넌트의 위치에 따라 시각적인 표현이 달라질 수 있습니다.

 

 

2. RootComponent로 MeshComponent, ChildComponent로 CollisionComponent를 사용하는 경우

  • 장점:
    • 시각적인 표현: 메시 컴포넌트가 루트이므로, 시각적인 표현이 직관적입니다.
    • 간단한 구현: 구현이 간단하며, 일반적인 오브젝트를 생성할 때 많이 사용하는 방식입니다.
  • 단점:
    • 충돌 감지 오류: 충돌 컴포넌트의 위치가 메시 컴포넌트의 변형에 따라 변하기 때문에, 예상치 못한 충돌이 발생할 수 있습니다. 특히 빠르게 움직이는 오브젝트의 경우 충돌 감지가 정확하지 않을 수 있습니다.
    • 성능 저하: 메시 컴포넌트가 루트이므로, 매 프레임마다 변환 행렬을 계산해야 하므로 성능이 약간 저하될 수 있습니다.

 

1번을 주로 사용하는 이유

  • 정확한 충돌 감지: 총알과 같은 프로젝타일은 정확한 충돌 감지가 매우 중요합니다. 충돌 컴포넌트를 루트로 설정하면 이를 보장할 수 있습니다.
  • 물리 시뮬레이션: 물리 시뮬레이션에서 충돌 정보는 필수적입니다. 정확한 충돌 정보를 바탕으로 물리 시뮬레이션을 진행해야 자연스러운 움직임을 구현할 수 있습니다.
  • 성능: 많은 수의 총알이 생성되고 소멸되는 게임 환경에서는 성능이 중요합니다. 충돌 컴포넌트를 루트로 설정하면 불필요한 계산을 줄여 성능을 향상시킬 수 있습니다.

 

 

Bullet.cpp 스태틱 메시 컴포넌트 추가

// 5. 외관 컴포넌트 등록하기
bodyMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BodyMeshComp"));
// 6. 부모 컴포넌트 지정
bodyMeshComp->SetupAttachment(collisionComp);
// 7. 충돌 비활성화
bodyMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
// 8. 외관 크기 설정
bodyMeshComp->SetRelativeScale3D(FVector(0.25f));

 

 

Bullet.cpp 발사체 컴포넌트 추가하기.

// 발사체 컴포넌트
movementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("MovementComp"));

// movement 컴포넌트가 갱신시킬 컴포넌트 지정
movementComp->SetUpdatedComponent(collisionComp);

 

 

Bullet.cpp 발사체 컴포넌트 초깃값 설정

// 초기 속도
movementComp->InitialSpeed = 5000;
// 최대 속도
movementComp->MaxSpeed = 5000;
// 반동 여부
movementComp->bShouldBounce = true;
// 반동 값
movementComp->Bounciness = 0.3f;

 

 

3. 블루프린트 Bullet만들고 테스트하기'

 

BP_Bullet 생성

 

 

Bullet에 Static Mesh 설정

'Unreal' 카테고리의 다른 글

UE - 저격 총 조준 모드 구현하기  (2) 2024.11.16
UE - 총알 발사하기  (0) 2024.11.09
UE - 플레이어 이동 처리  (1) 2024.10.26
UE - 3인칭 플레이어 생성  (0) 2024.10.19
UE - 3인칭 TPS 프로젝트 생성하기  (0) 2024.10.12