๐ Project Galaga ์์ํฉ๋๋ค.
Unreal C++๊ณผ ๊ฒ์์ํ์ ์ ๋ชฉํด์ ํ๋ก์ ํธ๋ฅผ ์งํํ์ต๋๋ค.
2024.05.04 ~ 2024.05.21์ ๊ฐ๋ฐ ๊ธฐ๊ฐ์ผ๋ก, ์ด 17์ผ ๋์ ๊ฐ๋ฐ์ ์๋ฃํ์์ต๋๋ค.
๊ฑฐ์ฐฝํ๊ฒ ์์ํ ํ๋ก์ ํธ๋ณด๋จ ์ง๊ธ๊น์ง ๋ฐฐ์ด ๊ฒ๋ค์ ์ข ํฉ์ ์ผ๋ก ์ฌ์ฉํด์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด ๋ด๋ณด๊ฒ ๋ค๋ ๋ง์์ผ๋ก ์์ฑํ์์ต๋๋ค.
ํด๋น ์๋ฆฌ์ฆ์๋ ๊ฐ๋ฐ ์ผ์ง๋ฅผ ์ ๋ฆฌํ๋ฉฐ, ๊ฐ๋ฐ ๋ด์ฉ์ ๋ํ ์ค๋ช ๊ณผ ์ด์๋ฅผ ์ ๋ฆฌํ ์์ ์ ๋๋ค.
Project Galaga์์ ํ๋ ์ด์ด๋ 2๊ฐ์ง์ ํผ๊ฒฉ ์กฐ๊ฑด์ ๊ฐ์ง๋๋ค.
์ ์ด๋ฒคํธ๋ค์ Overlap Event๋ฅผ ์ฌ์ฉํ์ฌ ์ถฉ๋๋ ์กํฐ๊ฐ 'Player' ํ๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์์ ์์ Apply Damage()์ Take Damage()๋ฅผ ํธ์ถํ์ฌ ํผ๊ฒฉ ์์คํ ์ ๊ตฌํํ์์ต๋๋ค.
์ ๋ค๋ ๋์ผํ ๋ก์ง์ ์ฌ์ฉํ์์ต๋๋ค.
ํ๋ ์ด์ด๋ BlockAll ํ๋ฆฌ์
์ ๊ฐ์ง๋๋ค.
์ ๊ณผ ์ด์์ OverlapAll ํ๋ฆฌ์
์ ๊ฐ์ง๋๋ค.
ํ๋ ์ด์ด์ ์ด์์ OverlapAll์ธ ์ ์๊ฒ Overlap Event๋ฅผ ๋ฐ์์ํค๊ธฐ ์ํด BlockAll ํ๋ฆฌ์ ์ ๊ฐ์ง๋๋ค.
์ด์์ Overlap Event๋ฅผ ์ํด์ OnComponentBeginOverlap() ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
// ๋ฐ์ธ๋ฉ
BulletBodyCollision->OnComponentBeginOverlap.AddDynamic(this, &AEnemyBullet::OnComponentBeginOverlap);
์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ด ์ถฉ๋ํ ๊ฐ์ฒด๊ฐ 'Player' ํ๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ApplyDamage()๋ฅผ ํธ์ถํ์์ต๋๋ค.
// ๊ตฌํ๋ถ
void AEnemyBullet::OnComponentBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (OtherActor->ActorHasTag("Player") && IsActive())
{
Deactivate();
UGameplayStatics::ApplyDamage(OtherActor, 1, NULL, NULL, NULL);
}
}
ํผ๊ฒฉ ๋์์๊ฒ TakeDamage() ํจ์๋ฅผ ์ ์ํด์ฃผ์์ต๋๋ค.
์ฒด๋ ฅ์ ๊ฐ์ ์ํค๊ณ , Hp๊ฐ 0์ดํ๊ฐ ๋์๋ค๋ฉด ํ๊ดด์ ๊ด๋ จ๋ ๋ด์ฉ์ด ์คํ๋ฉ๋๋ค.
float AMyPlayer::TakeDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
float damage = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
if (!isHit)
{
isHit = true;
this->PlayerHp -= damage;
if (PlayerMove)
{
DestroyingPlayer();
}
if (PlayerHp <= 0)
{
PlayerMove->DestroyComponent();
PlayerBodyCollision->SetSimulatePhysics(true);
PlayerBodyCollision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
PlayerBodyCollision->SetMassOverrideInKg();
FVector ImpulseDirection = FVector(FMath::RandRange(-1.0f, 1.0f), FMath::RandRange(-1.0f, 1.0f), -1);
ImpulseDirection.Normalize();
PlayerBodyCollision->AddForce(ImpulseDirection * 100000.0f);
}
FTimerHandle isHitTime;
GetWorldTimerManager().SetTimer(isHitTime, this, &AMyPlayer::setCanHit,2.0f,false);
}
return 0.0f;
}
ํ๋ ์ด์ด์๊ฒ ํ์ ๋ ๊ตฌํ ์ฌํญ์ ๋๋ค.
ํผ๊ฒฉ ์ ๋ง์ฝ Hp๊ฐ 1 ์ด์์ด๋ผ๋ฉด 2์ด๊ฐ ๋ฌด์ ์ด ๋๋๋ก ๊ตฌํํ์์ต๋๋ค.
Timer์ isHit Boolean๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ 2์ด ๋ค Bool๊ฐ์ ๋ณ๊ฒฝํด์ฃผ์ด TakeDamage()๊ฐ ํธ์ถ๋๋๋ผ๋ ๋ก์ง์ด ์คํ๋์ง ์๋๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์์ต๋๋ค.
FTimerHandle isHitTime;
GetWorldTimerManager().SetTimer(isHitTime, this, &AMyPlayer::setCanHit,2.0f,false);
์ฌ๊ธฐ๊น์ง Overlap Event๋ฅผ ์ฌ์ฉํ์ฌ ApplyDamage()์ TakeDamage()๋ฅผ ์ฌ์ฉํ์ฌ ํผ๊ฒฉ ์์คํ ์ ๊ตฌํํ ๋ด์ฉ์ด์์ต๋๋ค.