2024-04-08
깃허브! |
---|
https://github.com/ChangJin-Lee/ARproject |
★ https://github.com/ChangJin-Lee/ToonTank |
느낀점
타워와 탱크의 거리가 일정 거리 이하로 되면 타워가 탱크를 바라보게 만들었다. 그리고 탱크와 타워가 총을 발사할 수 있도록 발사 위치에 DrawDebugSphere를 그려보았다.
void ATower::BeginPlay()
{
Super::BeginPlay();
Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
}
void ATower::BeginPlay()
{
Super::BeginPlay();
Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
// 타이머는 BeginPlay에 설정해서 게임 시작 시 타이머가 실행되도록 할 수 있음.
// FTimerManager 오브젝트를 반환함. 이 타입을 이용하기 때문에 FTimerManager의
// 헤더 파일을 포함해야함.
// SetTimer()는 몇 가지 다른 함수, 즉 오버로드를 지원함.
// 함수를 타이머와 바인딩하고 2초마다 호출되도록 설정
GetWorldTimerManager().SetTimer(
FireRateTimerHandle,
this,
&ATower::CheckFireCondition,
FireRate,
true
);
}
void ATower::CheckFireCondition()
{
if(InFireRange())
{
Fire();
}
}
bool ATower::InFireRange()
{
if(Tank)
{
// Find the distance to the Tank
float Distance = FVector::Dist(GetActorLocation(), Tank->GetActorLocation());
// Check to see if the Tank is in range
if (Distance <= FireRange)
{
return true;
}
}
return false;
}
void ATank::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
// 문자열 리터럴(축 이름), 함수를 바인드하는 대상 객체의 포인터(게임 안에 있는 폰 탱크), 함수의 주소
PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ATank::Move);
PlayerInputComponent->BindAxis(TEXT("Turn"), this, &ATank::Turn);
PlayerInputComponent->BindAction(TEXT("Fire"), IE_Pressed, this, &ATank::Fire);
}
void ABasePawn::Fire()
{
// ProjectileSpawnPoint로 발사 위치를 알고 있으니까 GetComponentLocation로 해당 위치를 가져온다.
FVector ProjectileSpawnPointLocation = ProjectileSpawnPoint->GetComponentLocation();
DrawDebugSphere(
GetWorld(),
ProjectileSpawnPointLocation,
24.f,
24,
FColor::Red,
false,
3.0f
);
}