총알은 입력을 받을 필요가 없으므로 Pawn이 아닌 Actor를 부모로 제작합니다. 이름은 Bullet으로 정합니다.
헤더에서 public:밑에 변수를 추가
컴포넌트를 생성 연결해줍니다.
ABullet::ABullet()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
boxComp = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxCollider"));
SetRootComponent(boxComp);
meshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent"));
meshComp->SetupAttachment(boxComp);
boxComp->SetBoxExtent(FVector(50.f, 50.f, 50.f));
boxComp->SetWorldScale3D(FVector(0.75f, 0.25f, 1.0f));
}
Bullet 클래스로 블루프린트를 만들고 이름을 BP_Bullet으로 합니다.
스태틱메시에 큐브를 지정해줍니다.
BoxCollision의 Scale과 BoxExtent가 C++에서 지정한대로 되어 있습니다.
헤더에 moveSpeed변수를 추가하고
bullet.c의 Tick()함수에 이동시켜줍니다. GetActorForwardVector()에서 얻은 앞방향으로 앞으로 이동 시켜줍니다.
이전에 언리얼의 앞방향은 x축이라고 했는데 총알은 위쪽으로 올라가야하는데 ㅠㅠ 언리얼의 글로벌 앞방향은 X이지만 액터의 앞방향은 회전시 바뀝니다. 총알을 위쪽으로 향하게 생성하면 위쪽이 앞방향이 되는거죠
// Called every frame
void ABullet::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FVector newLocation = GetActorLocation() + GetActorForwardVector() * moveSpeed * DeltaTime;
SetActorLocation(newLocation);
}
BP_Bullet을 레벨에 배치하고 플레이 해보면 앞으로 날라가는데 Orthgraphic모드라 잘 알수가 없지만
detail의 Transform을 보면 앞으로 나가고 있습니다.
플레이를 멈추고 총알을 위쪽으로 향하게 로테이션 시키고 플레이 시키면 위로 올라가는걸 알수 있습니다.
테스트가 끝나면 지워줍니다.
좌클릭을 하면 총알이 발사되게 InputAction을 만듭니다.
IMC_PlayerInput을 열고 IA_Fire에 좌클릭을 맵핑해줍니다.
총알생성기능 구현
총알이 위로 발사되고 발사되는 위치를 지정하기 위해 PlayerPawn에 ArrowComponent를 추가합니다.
우선 playerPawn.h헤더에 발사될 위치와 발사할 총알의변수를 선언하고
TSubclassOf는 레벨에 없는 클래스를 필터링해서 보여줍니다.
playerPawn.c로 생성자 APlayerPawn::APlayerPawn() 안에 Arrow 오브젝트를 만들어 연결해줍니다.
BP_Pawn을 열고 Fire_Position의 위치와 로테이션을 조정해 위를 바라보게 해줍니다.
다시 PlayerPawn.h로 이동해 아까 만든 IA_Fire 액션을 받을 변수와 이벤트시 동작할 함수를 만듭니다.
public:
private:
PlayerPawn.cpp의 SetupPlayerInputComponent에
ia_fire 액션과 OnFrie()함수를 바인딩 해줍니다. ETriggerEvent::Started로 지정해서 처음 키가 눌렸을때 발사되게 만듭니다. Triggered로 하면 누르는 동안 계속 총알이 나가게 됩니다.
Bullet클래스를 사용하기 위해 인클루드 해주고
OnFire()함수에서 Bullet을 Getworld()->SpawnActor()로 스폰해줍니다.
언리얼에디터로 돌아가 플레이하기전 BP_PlayerPawn을 열고 디테일에서 BulletFactory와 IA_Fire를 지정해줍니다. 컴파일해줍니다.
실행해 보면 총알이 위로 날라가야 합니다.
총알 발사 효과음 구현하기 인생언리얼 깃에서 다운 받은 파일을 Audio폴더를 만들고 끌어다 놓습니다
소리가 너무 커서 사운드를 줄여줍니다.
PlayerPawn.h public.h 밑에 fireSound를 UPROPERTY()로 블루프린트에 연결해주고
PlayerPawn.cpp에 오디오를 위한 헤드를 추가시키고
#include "Kismet/GameplayStatics.h"
OnFire()함수 안에서 PlaySound2D()로 플레이 시켜줍니다.
플레이하기전 BP_PlayerPawn에서 fireSound를 연결해줍니다.
'언리얼게임프로젝트 > 슈팅게임 C++' 카테고리의 다른 글
Ureal C++ Collision처리 (0) | 2025.03.12 |
---|---|
EnemyActor Factory 생성하기 Spawn (0) | 2025.03.12 |
Unreal Shooting Game C++ EnemyActor (0) | 2025.03.11 |
Unreal C++ 플레이어 제작하기 (0) | 2025.03.11 |
Unreal Shooting C++ 프로젝트, 게임모드, Orthographic (0) | 2025.03.11 |