๐ก C++๋ก ์ด์์ ๋ฐ์ฌํด๋ณด์!
์ด๋ฒ์๋ C++๋ก ํด๋ฆญํ๋ฉด ์ด์์ ๋ฐ์ฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
1. Bullet ํด๋์ค ์์ฑ
2. ์์ผ์ ์ด ์ฅ์ฐฉํ๊ธฐ
3. ๋ฐ์ฌ ์
๋ ฅ ๋ฐ๊ธฐ
4. Spawn Actor๋ก ์ด์ ์์ฑํ๊ธฐ
์ด์์ ๊ตฌ์ฑํ ์ปดํฌ๋ํธ 3๊ฐ๋ฅผ ์ ์ธํด์ฃผ๊ฒ ์ต๋๋ค.
ํ์ฑ์ ๊ฐ์ง๋ ์ด์์ ์ธ๋ฆฌ์ผ์์ ์ ๊ณตํ๋ ๋ฐ์ฌ์ฒด ํํ์ ๋ฌผ๋ฆฌ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
UProjectileMovementComponent ์ ํ์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
UPROPERTY(VisibleAnywhere, Category=Movement)
class UProjectileMovementComponent* movementComp;
๊ทธ๋ฆฌ๊ณ ์ด์์ ์ธ๊ด์ ๋ด๋นํ Static Mesh์
์ถฉ๋์ ๊ฐ์งํ ์ปดํฌ๋ํธ ๋ํ ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
UPROPERTY(VisibleAnywhere,Category=Collision)
class USphereComponent* collisionComp;
UPROPERTY(VisibleAnywhere,Category=BodyMesh)
class UStaticMeshComponent* bodyMeshComp;
์ถฉ๋์ฒด ์ธ์คํด์ค๋ฅผ ๋จผ์ ๋ฑ๋กํ๊ณ ๋ฃจํธ ์ปดํฌ๋ํธ๋ก ๋ฑ๋กํฉ๋๋ค.
collisionComp = CreateDefaultSubobject<USphereComponent>(TEXT("CollisionComp"));
collisionComp->SetCollisionProfileName(TEXT("BlockAll"));
collisionComp->SetSphereRadius(13);
RootComponent = collisionComp;
bodyMeshComp์๊ฒ Sphere์ Static Mesh๋ฅผ ํ ๋นํ๊ณ ์์น๋ฅผ ์กฐ์ ํด์ฃผ์์ต๋๋ค.
bodyMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BodyMeshComp"));
bodyMeshComp->SetupAttachment(collisionComp);
bodyMeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
bodyMeshComp->SetRelativeScale3D(FVector(0.25f));
bodyMeshComp->SetRelativeLocation(FVector(0, 0, -12.5f));
ConstructorHelpers::FObjectFinder<UStaticMesh>sphereMesh(TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere'"));
if (sphereMesh.Succeeded())
{
bodyMeshComp->SetStaticMesh(sphereMesh.Object);
}
ProjectileMovementComponent๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํค๋๋ฅผ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
#include <GameFramework/ProjectileMovementComponent.h>
์ด์์ ์๋์ ํ์ฑ์ ๋ํ ์ต์ ์ ์ค์ ํด์ฃผ์์ต๋๋ค.
movementComp = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("MovementComp"));
movementComp->SetUpdatedComponent(collisionComp);
movementComp->InitialSpeed = 5000;
movementComp->MaxSpeed = 5000;
movementComp->bShouldBounce = true;
movementComp->Bounciness = 0.3f;
โ์ ์ฅ ํ ์ปดํ์ผโํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Bulletํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ BP_Bullet๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ฐ์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์บ๋ฆญํฐ์ Skeletal์ ๋ค์ด๊ฐ์ ์ค๋ฅธ์์ RifleSocket์ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
์์น๋ ๋์ถฉ ์กฐ์ ํด์ฃผ์์ต๋๋ค.
์ ๊ฐ ๊ฐ์ง๊ณ ์๋ rifle์ด skeletal mesh๋ผ์ USkeletalMeshComponent๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
๋ง์ฝ, ๋ณธ์ธ์ ์ด ์์ ์ด StaticMesh๋ผ๋ฉด UStaticMeshComponent๋ก ํ๋ฉด ๋๊ฒ ์ฃ ?
UPROPERTY(VisibleAnywhere,Category=GunMesh)
class USkeletalMeshComponent* gunMeshComp;
ConstructorHelpers๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ง๊ณ ์๋ ์ด ์์ ์ ๋ถ๋ฌ ์ค๊ฒ ์ต๋๋ค.
ConstructorHelpers::FObjectFinder<USkeletalMesh>rifleMesh(TEXT("/Script/Engine.SkeletalMesh'/Game/MilitaryWeapSilver/Weapons/Assault_Rifle_A.Assault_Rifle_A'"));
์ฐ์ gunMeshComp๋ฅผ ์ธ์คํด์คํ ํด์ฃผ๊ณ
gunMeshComp = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("GunMeshComp"));
gunMeshComp->SetupAttachment(GetMesh());
rifleMesh๊ฐ ์ ์์ ์ผ๋ก ํธ์ถ๋์๋ค๋ฉด ๋ฉ์์ ํ ๋นํด์ฃผ์์ต๋๋ค.
if (rifleMesh.Succeeded())
{
gunMeshComp->SetSkeletalMesh(rifleMesh.Object);
}
์์ผ์ ์ฅ์ฐฉํ๋ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
SetupAttachment()์ 2๋ฒ์งธ ์ธ์๋ก ์์ผ์ ์ด๋ฆ์ ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
if (rifleMesh.Succeeded())
{
gunMeshComp->SetSkeletalMesh(rifleMesh.Object);
// ์ถ๊ฐ
gunMeshComp->SetupAttachment(GetMesh(), TEXT("RifleSocket"));
}
โ์ ์ฅ ํ ์ปดํ์ผโํด์ฃผ์ธ์.
๊ทธ๋ฐ ํ ํ๋ ์ด ํด๋ณด๋ฉด
ํ๋ ์ด์ด์ด ์บ๋ฆญํฐ ์ค๋ฅธ์์ ์ด์ด ๋ค๋ ค์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ํฌ์คํ ์๋ ์ขํด๋ฆญ์ Fire()์ ๋ฐ์ธ๋ฉํ์ฌ ์ด์์ ๋ฐ์ฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. Bullet ํด๋์ค ์์ฑ
2. ์์ผ์ ์ด ์ฅ์ฐฉํ๊ธฐ
3. ๋ฐ์ฌ ์
๋ ฅ ๋ฐ๊ธฐ
4. Spawn Actor๋ก ์ด์ ์์ฑํ๊ธฐ