๐ก C++๋ก ์ด์์ ๋ฐ์ฌํด๋ณด์!
์ด๋ฒ์๋ C++๋ก ํด๋ฆญํ๋ฉด ์ด์์ ๋ฐ์ฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
1. Bullet ํด๋์ค ์์ฑ
2. ์์ผ์ ์ด ์ฅ์ฐฉํ๊ธฐ
3. ๋ฐ์ฌ ์
๋ ฅ ๋ฐ๊ธฐ
4. Spawn Actor๋ก ์ด์ ์์ฑํ๊ธฐ
5. Bullet ์๋ฉธ์ฃผ๊ธฐ
Fire()ํจ์๋ฅผ ์ ์ธํด์ฃผ์ธ์.
void Fire();
์ ๋ Action์ผ๋ก ๋งคํ์ ํด์ฃผ์์ต๋๋ค.
BindAction()์ ์ฌ์ฉํด์ Fire()์ ๋ฐ์ธ๋ฉํด์ฃผ์ธ์.
AMyPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// ์๋ต
PlayerInputComponent->BindAction(TEXT("Fire"), IE_Pressed, this, &AMyPlayer::Fire);
}
์์๋ก ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋๋ก ํด์ฃผ๊ฒ ์ต๋๋ค.
void AMyPlayer::Fire()
{
UE_LOG(LogTemp, Warning, TEXT("Fire ON"));
}
โ์ ์ฅ ํ ์ปดํ์ผโํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ์คํํด์ ์ขํด๋ฆญ์ ํด์ฃผ๋ฉด
๋ฐ์ธ๋ฉ์ด ์๋ฃ๋์์ต๋๋ค.
player.h๋ก ๊ฐ์ ์ bullet facotry๋ฅผ ์ ์ธํด์ฃผ์ธ์.
UPROPERTY(EditDefaultsOnly,Category=BulletFactory)
TSubclassOf<class ABullet> bulletFactory;
TSubclassOf ํ
ํ๋ฆฟ ํด๋์ค๋ ํฌํ๋ฆฟ์ ๋ฑ๋ก๋ ABullet์ ํ์ ํด๋์ค,
ํน์ ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค๋ฅผ ์ธ๋ฆฌ์ผ ์๋ํฐ๋ก๋ถํฐ ํ ๋น๋ฐ์ ์ ์์ต๋๋ค.
Bullet.h๋ฅผ ํค๋์ ์ถ๊ฐํด์ฃผ์ธ์.
#include "Bullet.h"
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ธ์.
void AMyPlayer::Fire()
{
FTransform fireposition = gunMeshComp->GetSocketTransform(TEXT("FirePosition"));
GetWorld()->SpawnActor<ABullet>(bulletFactory, fireposition);
}
๋ฐ์ฌ๋ ์์น์ ํฌ์ง์
์ ์ฐพ๊ณ ,
ํด๋น ์์น์์ ์ด์์ ์์ฑํฉ๋๋ค.
โ์ ์ฅ ํ ์ปดํ์ผโํด์ฃผ์ธ์.
๊ทธ๋ฐ ํ ํ๋ ์ด ํด๋ณด๋ฉด
ํ๋ ์ด์ด์ ์บ๋ฆญํฐ ์ค๋ฅธ์์ ์ด์ด ๋ค๋ ค์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ฐ์๊ฐ ์ฌ์ฉํ ๋ฌด๊ธฐ์ Skeletal Mesh๋ฅผ ์ผ์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ์์ผ์ ์ถ๊ฐํ ํ ์ด๊ตฌ์์ FirePosition์ ๋ฐฐ์นํด์ค๊ฒ์.
BP_Player๋ฅผ ์ด์ด์ BulletFactory์ BP_Bullet์ ํ ๋นํด์ฃผ์ธ์.
โ์ ์ฅ ํ ์ปดํ์ผโํ ํ๋ ์ด ํด๋ณด๋ฉด ์ด๊ตฌ ์์์ ์ด์์ด ์ ๋๊ฐ๋๋ค.
์ง๊ธ ๋ณด์๋ฉด ์ด์ ์ธ์คํด์ค๋ค์ด ์ฌ๋ผ์ง์ง ์๊ณ ๊ณ์ ์์ด๊ณ ์์ต๋๋ค.
๊ณ์ ์ด์์ด ์์ฑ๋๊ณ ์๋ฅํ๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ ์ฑ์ด ์ค๋จ๋๋ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฃผ๊ณ , ๊ทธ ์๊ฐ์ด ์ง๋๋ฉด ์๋ฉธํ๋๋ก ์์ฑํ๊ฒ ์ต๋๋ค.
Bullet.cpp์ ์์ฑ์๋ก ๊ฐ์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ InitialLifeSpan๋ฅผ 2.0f ์ ๋๋ก ์ค์ ํด์ฃผ๊ฒ ์ต๋๋ค.
ABullet::ABullet()
{
// ์๋ต
InitialLifeSpan = 2.0f;
}
Die()ํจ์๋ฅผ ์ ์ธํด์ฃผ์ธ์.
void Die();
Die๋ ๋จ์ํ๊ฒ ๊ฐ์ฒด๋ฅผ Destroy()ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
void ABullet::Die()
{
Destroy();
}
BeginPlayer์์ ์์ฑ๋ ํ ์ค์ ํ ์๋ช ์ฃผ๊ธฐ ์๊ฐ์ดํ Die()๋ฅผ ํธ์ถํด์ฃผ๊ฒ ์ต๋๋ค.
void ABullet::BeginPlay()
{
Super::BeginPlay();
FTimerHandle deathTimer;
GetWorld()->GetTimerManager().SetTimer(deathTimer, this, &ABullet::Die, 2.0f, false);
}
โ์ ์ฅ ํ ์ปดํ์ผโํ ํ๋ ์ด ํด๋ณด๋ฉด ์ด์์ด ์ฌ๋ผ์ง๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ ์ ๊ทธ๋ด์ธํ๊ฒ ๊ธฐ๋ฅ๋ค์ด ํ๋์ฉ ์ถ๊ฐ๋๊ณ ์์ต๋๋ค!
๋ค์์๋ ์ ํ์ํ๊ธฐ๊ณ(FSM)์ ๊ฐ์ง ์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
1. Bullet ํด๋์ค ์์ฑ
2. ์์ผ์ ์ด ์ฅ์ฐฉํ๊ธฐ
3. ๋ฐ์ฌ ์
๋ ฅ ๋ฐ๊ธฐ
4. Spawn Actor๋ก ์ด์ ์์ฑํ๊ธฐ
5. Bullet ์๋ฉธ์ฃผ๊ธฐ