[UE5]툰 탱크-15

칼든개구리·2024년 12월 10일
0

[언리얼TO리얼]

목록 보기
23/42

이번 시간엔 Tower클래스를 만들어서 BasePawn 클래스에서 상속한 탱크의 기능을 상속해보는 시간을 가져보겠다. 탱크 폰의 위치를 변경해서 탱크 폰을 목표로 겨냥해 타워 포탑을 회전할 수 있게 만든다.

Vector Distance

탱크가 사정거리 내에 있는지 확인하려면 포탑과 탱크 간의 거리를 알아야 한다.
월드의 시작점을 나타내는 기즈모가 있다(0,0,0) 액터의 위치를 나타낼 때 이 원점에서 액터 위치까지의 벡터를 사용하는데, 이 위치 벡터는 GetActorLocation을 사용해 구할 수 있다.
벡터 수학을 이용할 수 있지만,FVector 클래스에는 Dist라는 함수가 존재한다. 이 함수는 두 개의 위치 벡터를 사용해 두 벡터 간 거리를 반환한다.

	Tank = Cast<ATank>(UGameplayStatics::GetPlayerPawn(this, 0));
    

Tank= UGameplayStatics::GetPlayerPawn(this,0)을 사용하니 this에 들어갈게 APawn 형식이어야 하는데 ATank 타입을 넣을려고 하니 에러가 나서 캐스트를 해주었다.

	UPROPERTY(EditDefaultsOnly, Category="Combat") //탱크에 동일한 사정거리를 적용하기 위해 EditDefaultsOnly-> 디폴트 블루프린트에서만 편집가능,
	float FireRange = 300.f;

포탑의 공격 범위를 설정해주고나서

void ATower::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	// 탱크까지의 거리 구한 후 
	if (Tank)//탱크가 유효하면 GetActorLocation으로 탱크 위치에 액세스 할 수 있다. 
	{
		float Distance = FVector::Dist(GetActorLocation(), Tank->GetActorLocation());

		//	탱크가 사정거리 내에 있는지 확인하고 
		if (Distance <= FireRange) 
		{ //프레임마다 거리가 사정거리보다 클수도 작을수도 있는데 그러면 사정거리와 완전히 
			// 사정거리에 있으면 포탑을 탱크를 향해 회전합니다
			RotateTurret(Tank->GetActorLocation());
		}
	}
}

이후 타워의 블루프린트를 찾아가서

부모를 변경해준 뒤 사정거리를 700으로 변경한 최종 모습이다!
업로드중..
나를 향해서 터렛들이 바라보는게 코딩이 잘 되었다!

TIL: 이제부터 약간 이해하는게 떨어지기 시작했다. 인자로 주는게 매개변수랑 타입이 같지 않은데 어떻게 주는건지 그 타입으로 변환해서 주는 건지 햇갈리기 시작했다. 벨로그에도 알게된 지식을 더 잘 적고싶은데 정리가 잘 안되고 뒤죽박죽인 느낌이다 하하
그래도 게임 개발자로서 성장하고 있음에는 틀림이 없다

profile
메타쏭이

0개의 댓글