bullet처럼 마법을 시전할 Projectile를 하나 만들 예정이다 관련 C++ 클래스를 하나 만든다
CPBullet.h
public:
// Component로 붙는 아이는 protected로
UPROPERTY(VisibleAnywhere, Category = Movement)
class UProjectileMovementComponent* PMovementComp;
UPROPERTY(VisibleAnywhere, Category = Movement)
class USphereComponent* SphereCollComp;
UPROPERTY(VisibleAnywhere, Category = Movement)
class UStaticMeshComponent* SMeshComp;
CPBullet.cpp
#include "Components\SphereComponent.h"
#include "GameFramework\ProjectileMovementComponent.h"
ACPBullet::ACPBullet()
{
// 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;
SphereCollComp = CreateDefaultSubobject<USphereComponent>(TEXT("MainCollider"));
SphereCollComp->SetCollisionProfileName(TEXT("BlockAll"));
SphereCollComp->SetSphereRadius(13);
RootComponent = SphereCollComp;
SMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
SMeshComp->SetupAttachment(RootComponent);
SMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
// 포물체 컴포넌트 생성
PMovementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("PMovementComp"));
// 발사체 컴포넌트를 Update 시킬 대상( 컴포넌트 ) 지정
PMovementComp->SetUpdatedComponent(SphereCollComp);
PMovementComp->InitialSpeed = 3000.0f; // 초기속도
PMovementComp->MaxSpeed = 5000.0f; // 최대속도
PMovementComp->bShouldBounce = true; // 반동
PMovementComp->Bounciness = 0.3f; // 반동 크기
}
CTPSPlayer.h
public:
UPROPERTY(EditAnywhere, Category = EquipItem)
class UStaticMeshComponent* WeaponMeshComp;
UPROPERTY(EditAnywhere, Category = Fire)
TSubclassOf<class ACPBullet> magazine;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Input)
UInputAction* FireIA;
void InputFire(const FInputActionValue& value);
ACTPSPlayer::ACTPSPlayer()
{
... 생략
WeaponMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WeaponMesh"));
WeaponMeshComp->SetupAttachment(GetMesh());
}
void ACTPSPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked< UEnhancedInputComponent>(PlayerInputComponent))
{
.. 생략 ..
EnhancedInputComponent->BindAction(FireIA, ETriggerEvent::Started, this, &ACTPSPlayer::InputFire);
}
}
void ACTPSPlayer::InputFire(const FInputActionValue& value)
{
FTransform _firePostion = WeaponMeshComp->GetSocketTransform(TEXT("FirePosition"));
GetWorld()->SpawnActor<ACPBullet>(magazine, _firePostion);
}
CPBullet.cpp
ACPBullet::ACPBullet()
{
...생략
InitialLifeSpan = 2.0f; // 생명 길이
// Actor에 나오는 기능
}
CPBullet.h
public:
void Die();
CPBullet.cpp
void ACPBullet::BeginPlay()
{
Super::BeginPlay();
// Timer -> 시간 개념 -> 쓰레드를 독립적으로 할당
FTimerHandle _deathTimer; // 쓰레드를 독립적 할당
GetWorld()->GetTimerManager().SetTimer(_deathTimer, FTimerDelegate::CreateLambda([this]()->void { Destroy();}), 2.0f, false);
}
void ACPBullet::Die()
{
Destroy();
}
익명 함수로, 함수를 직접 정의하지 않고도 코드 블록을 만들어 사용할 수 있는 방법
람다 테스트
람다 TEST