[UE5] TIL - 18 <GetPlayerPawn, FTimerManager>

ChangJin·2024년 4월 8일
0

Unreal Engine5

목록 보기
45/114
post-thumbnail

2024-04-08

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/ToonTank

느낀점
타워와 탱크의 거리가 일정 거리 이하로 되면 타워가 탱크를 바라보게 만들었다. 그리고 탱크와 타워가 총을 발사할 수 있도록 발사 위치에 DrawDebugSphere를 그려보았다.

TIL

  • GetPlayerPawn
  • FTimerManager

GetPlayerPawn

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/Kismet/UGameplayStatics/GetPlayerPawn?application_version=5.3


  • 특정 player index에 있는 player controller를 위한 pawn을 반환한다.
  • 싱글 플레이에서는 player index는 항상 0이다.
  • UGameplayStatics::GetPlayerPawn(this, 0) 으로 반환된 타입은 APawn*라서 Tank 오브젝트에 추가하기 위해서는 타입 캐스팅이 필요하다.

void ATower::BeginPlay()
{
	Super::BeginPlay();
	Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
}



FTimerManager

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/FTimerManager?application_version=5.3


  • 타이머를 전역으로 관리하는 클래스이다.
  • 콜백함수를 사용해서 2초에 한번씩 함수가 실행되게끔 만들었다.

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;
}

  • ABasePawn에서 Fire() 함수를 정의해놓고 Tank와 Tower 둘다에서 사용했다. 왜냐하면 둘다 발사하기 때문!
  • Tank에서는 BindAction으로 특정 바인드일때 발사되게하였고, Tower에서는 일정 시간마다 발사가 되도록 만들었다.

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
		);
}

profile
게임 프로그래머

0개의 댓글