깃허브 주소
https://github.com/OneStone3647/ProjectT
유튜부 주소
신규 기능 추가
● Dynamic Lock On Target
Dynamic Lock On Target
Lock On Camera의 명칭을 변경 및 새로운 기능이 추가되었습니다.
● v1.1.0의 Lock On Camera의 명칭을 Dynamic Lock On Target으로 변경하였습니다.
○ Target에 카메라를 고정하지 않는 LockOn을 Dynamic Lock On Target이라 부릅니다.
● Dynamic Lock On Target이 실행될 때 Target이 화면의 일정 범위를 벗어났을 경우 Target이 화면의 일정 범위 안에 존재하도록 카메라를 조정합니다.
UpdateCamera
void UPTTargetingSystemComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
UpdateCamera(DeltaTime);
if(bDrawDebug)
{
UpdateDrawDebug();
}
}
void UPTTargetingSystemComponent::UpdateCamera(float DeltaTime)
{
// DynamicLockOn일 경우
if(bDynamicLockOnTarget)
{
UpdateDynamicCameraLock(DeltaTime);
}
// LockOn일 경우
else
{
UpdateCameraLock();
}
}
매 틱마다 카메라의 회전 값을 설정하는 함수입니다.
카메라를 Target에게 고정하는 UpdateCameraLock함수와 Target이 화면의 일정범위 밖으로 나갈 경우 Target이 화면의 일정범위 안에 보이도록 카메라를 조정하는 UpdateDynamicCameraLock함수를 DynamicCameraLock함수의 실행을 나타내는 bDynamicLockOnTarget 함수로 구분하여 호출합니다.
UpdateCameraLock
void UPTTargetingSystemComponent::UpdateCameraLock()
{
if(bIsLockOnTarget)
{
if(IsValid(Target) == true && PTPlayerOwner->GetDistanceTo(Target) <= MaxSearchTargetableDistance)
{
// Target이 살아있는 동안 카메라가 Target을 바라보도록 고정합니다.
APTDummyCharacter* TargetPTDummyCharacter = Cast<APTDummyCharacter>(Target);
if(IsValid(TargetPTDummyCharacter) == true && TargetPTDummyCharacter->IsDead() == false && PlayerController)
{
const FRotator InterpToTarget = CalculateInterpToTarget(TargetPTDummyCharacter);
PlayerController->SetControlRotation(InterpToTarget);
}
else
{
// Target이 사망했을 경우 다음 Target을 찾습니다.
CancelLockOnTarget();
ExecuteLockOnTarget();
}
}
else
{
CancelLockOnTarget();
}
}
}
LockOnTarget일 때 카메라를 조정하는 함수입니다.
카메라가 Target을 바라보도록 조정합니다.
UpdateDynamicCameraLock
void UPTTargetingSystemComponent::UpdateDynamicCameraLock(float DeltaTime)
{
if(bIsLockOnTarget)
{
if(IsValid(Target) == true && PTPlayerOwner->GetDistanceTo(Target) <= MaxSearchTargetableDistance)
{
// Target이 살아있는 동안 카메라가 Target을 바라보도록 고정합니다.
APTDummyCharacter* TargetPTDummyCharacter = Cast<APTDummyCharacter>(Target);
if(IsValid(TargetPTDummyCharacter) == true && TargetPTDummyCharacter->IsDead() == false && PlayerController)
{
if(PTPlayerOwner->IsMoveCamera() == false)
{
if(IsInViewport(GetScreenPositionOfActor(TargetPTDummyCharacter).Get<0>(), StopDynamicCameraLockScreenRatio) == false)
{
const FRotator CurrentRotator = PlayerController->GetControlRotation();
const FRotator TargetRotator = UKismetMathLibrary::FindLookAtRotation(PTPlayerOwner->GetActorLocation(), Target->GetActorLocation());
const FRotator InterpRotator = UKismetMathLibrary::RInterpTo(CurrentRotator, TargetRotator, DeltaTime, 1.0f);
PlayerController->SetControlRotation(InterpRotator);
}
}
}
else
{
// Target이 사망했을 경우 다음 Target을 찾습니다.
CancelLockOnTarget();
ExecuteLockOnTarget();
}
}
else
{
CancelLockOnTarget();
}
}
}
DynamicLockOnTarget일 때 카메라를 조정하는 함수입니다.
화면 중앙에서 일정범위 밖으로 Target이 나갈 경우 화면의 일정범위 안으로 Target이 들어오도록 카메라를 조정합니다.
IsInViewport
bool UPTTargetingSystemComponent::IsInViewport(FVector2D ActorScreenPosition, float ScreenRatio) const
{
FVector2D ViewportSize = GEngine->GameViewport->Viewport->GetSizeXY();
// 화면 전체를 사용할 경우
if(ScreenRatio == 0.0f || UKismetMathLibrary::Abs(ScreenRatio) > 1.0f || (ScreenRatio == (1.0f - ScreenRatio)))
{
return ActorScreenPosition.X >= 0.0f && ActorScreenPosition.Y >= 0.0f
&& ActorScreenPosition.X <= ViewportSize.X && ActorScreenPosition.Y <= ViewportSize.Y;
}
float LargeScreenRatio;
float SmallScreenRatio;
if(ScreenRatio < (1.0f - ScreenRatio))
{
LargeScreenRatio = 1.0f - ScreenRatio;
SmallScreenRatio = ScreenRatio;
}
else
{
LargeScreenRatio = ScreenRatio;
SmallScreenRatio = 1.0f - ScreenRatio;
}
return ActorScreenPosition.X >= ViewportSize.X * SmallScreenRatio && ActorScreenPosition.X <= ViewportSize.X * LargeScreenRatio
&& ActorScreenPosition.Y >= ViewportSize.Y * SmallScreenRatio && ActorScreenPosition.Y <= ViewportSize.Y * LargeScreenRatio;
}
화면 안에 Actor가 존재하는지 나타내는 함수입니다.
일정범위 안을 설정하는 ScreenRatio가 아닐 경우 화면 전체를 범위로 지정하여 사용합니다.
'Project > T' 카테고리의 다른 글
[Project T] Unreal Targeting System / 언리얼 타겟팅 시스템 v1.1.0 (0) | 2022.07.27 |
---|---|
[Project T] Unreal Targeting System / 언리얼 타겟팅 시스템 v1.0.0 (0) | 2022.04.25 |
Unreal TargetLock System Prototype / 언리얼 타겟락 시스템 프로토타입 (0) | 2020.09.19 |