본문 바로가기

인생언리얼TPS

3.1-5 총알 제작하기

총알을 언리얼엔진에서 제공하는 물리엔진을이용하여 제작하겠습니다.

총알은 발사후 제어가 필요없기 때문에 Actor를 상속받아 클래스를 제작합니다 .이름은 Bullet으로 정합니다.

Bullet.h Bullet.cpp가 생성됩니다.

 

필요컴포넌트 추가하기

발사체 형태의 물리 기능을 제공하는 컴포넌트인 UProjectileMovementComponent를 사용하보겠습니다.

그외 충돌과 메시컴포넌트도 추가해 줍니다.

 

// 발사체의 이동을 담당할 컴포넌트
class UProjectileMovementComponent* movementComp;

 

// 충돌 컴포넌트
class USphereComponent* collisionComp;

 

// 외관 컴포넌트
class UStaticMeshComponent* bodyMeshComp;

 

Bullet.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Bullet.generated.h"

UCLASS()
class TPSPROJECT_API ABullet : public AActor
{
	GENERATED_BODY()

public:
	// Sets default values for this actor's properties
	ABullet();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:
	// Called every frame
	virtual void Tick(float DeltaTime) override;

public:
	// 발사체의 이동을 담당할 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = Movement)
	class UProjectileMovementComponent* movementComp;
	// 충돌 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = Collision)
	class USphereComponent* collisionComp;
	// 외관 컴포넌트
	UPROPERTY(VisibleAnywhere, Category = BodyMesh)
	class UStaticMeshComponent* bodyMeshComp;

	// 총알 제거 함수
	void Die();

	// 총알속도
	UPROPERTY(EditAnywhere, Category = Settings)
	float speed = 5000;
	// 액터의 특정 속성을 수정하면 호출되는 이벤트 함수
	virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override;
};

 

Bullet.cpp

// Fill out your copyright notice in the Description page of Project Settings.

#include "Bullet.h"
#include <Components/SphereComponent.h>
#include <GameFramework/ProjectileMovementComponent.h>

//void LambdaTestFunc()
//{
//	int32 sum = 10;
//	// 함수객체 생성
//	auto lamdaFunc = [&sum](int number)->void {
//		sum += number;
//	};
//	// 함수객체 실행
//	lamdaFunc(20);
//	UE_LOG(LogTemp, Warning, TEXT("sum : %d"), sum);
//}

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

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

	// 발사체 컴포넌트
	movementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("MovementComp"));
	// movement 컴포넌트가 갱신시킬 컴포넌트 지정
	movementComp->SetUpdatedComponent(collisionComp);
	// 초기속도
	movementComp->InitialSpeed = 5000;
	// 최대속도
	movementComp->MaxSpeed = 5000;
	// 반동여부
	movementComp->bShouldBounce = true;
	// 반동 값
	movementComp->Bounciness = 0.3f;

	// 생명 시간 주기
	//InitialLifeSpan = 2.0f;
}

// Called when the game starts or when spawned
void ABullet::BeginPlay()
{
	Super::BeginPlay();

	FTimerHandle deathTimer;
	//GetWorld()->GetTimerManager().SetTimer(deathTimer, this, &ABullet::Die, 2.0f, false);

	GetWorld()->GetTimerManager().SetTimer(deathTimer, FTimerDelegate::CreateLambda([this]()->void
		{
			Destroy();
		}), 2.0f, false);
}


// Called every frame
void ABullet::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

void ABullet::Die()
{
	Destroy();
}

// 액터의 특정 속성을 수정하면 호출되는 이벤트 함수
void ABullet::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
	// speed 값이 수정되었는지 체크
	if (PropertyChangedEvent.GetPropertyName() == TEXT("speed"))
	{
		// 프로젝타일 무브먼트 컴포넌트에 speed 값 적용
		movementComp->InitialSpeed = speed;
		movementComp->MaxSpeed = speed;
	}
}

 

Bullet을 상속받은 블루프린트를 만들고 이름을 BP_Bullet으로 합니다. 현재는 충돌체만 보입니다.

Mesh Comp의 Static Mesh의 풀다운메뉴에서 Shape_Sphere를 선택해줍니다.

Z위치를 -12.5로 변경해 충돌체 안에 넣어줍니다.

이제 BP_Bullet을 컴파일 저장해주고 끌어다 레벨 공중에 배치해주고 플레이 해줍니다. 잘 날라갑니다.

 

'인생언리얼TPS' 카테고리의 다른 글

스나이퍼 모드 구현하기  (0) 2023.12.13
3.1-6 총알발사하기  (0) 2023.12.13
3.1-4 플레이어 이동 처리하기  (1) 2023.12.12
3.1-2 3인칭카메라 붙이기  (0) 2023.12.12
3.1-3 플레이어 메시 적용  (1) 2023.12.12