[Project T] Unreal Targeting System / 언리얼 타겟팅 시스템 v1.2.0

2022. 8. 10. 15:03· Project/T
목차
  1. 신규 기능 추가
  2. Dynamic Lock On Target
  3. UpdateCamera
  4. UpdateCameraLock
  5. UpdateDynamicCameraLock
  6. IsInViewport

깃허브 주소

https://github.com/OneStone3647/ProjectT

 

GitHub - onestone3647/ProjectT: Lykan Studio

Lykan Studio. Contribute to onestone3647/ProjectT development by creating an account on GitHub.

github.com

 

유튜부 주소

https://youtu.be/r1XM1i4xTM4

 

신규 기능 추가

● Dynamic Lock On Target


Dynamic Lock On Target

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
  1. 신규 기능 추가
  2. Dynamic Lock On Target
  3. UpdateCamera
  4. UpdateCameraLock
  5. UpdateDynamicCameraLock
  6. IsInViewport
'Project/T' 카테고리의 다른 글
  • [Project T] Unreal Targeting System / 언리얼 타겟팅 시스템 v1.1.0
  • [Project T] Unreal Targeting System / 언리얼 타겟팅 시스템 v1.0.0
  • Unreal TargetLock System Prototype / 언리얼 타겟락 시스템 프로토타입
한돌이
한돌이
GameProgramer 취업준비 중 onestone3647@gmail.com
Lykan StudioGameProgramer 취업준비 중 onestone3647@gmail.com
한돌이
Lykan Studio
한돌이
전체
오늘
어제
  • 분류 전체보기 (102)
    • Daily Life (0)
    • Project (15)
      • Replica (10)
      • CE (1)
      • T (4)
    • Unreal Engine (74)
      • C++ (40)
      • Blueprint (5)
      • AI (5)
      • Effect (3)
      • UMG (2)
      • Error (2)
      • etc. (16)
    • Study (8)
      • C++ (2)
      • Algorithm (0)
      • API (4)
      • Git (2)
    • etc. (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • API
  • ETC
  • Unreal Engine 4 C++
  • 오류
  • Study
  • Unreal Engine4
  • .etc
  • 자소서
  • Unreal Engine4 Effect
  • Unreal Engine 5
  • daily life
  • project
  • GIT
  • Project Replica
  • Unreal Engine etc.
  • threadsafe
  • c++
  • etc.
  • Unreal Engine
  • Unreal Engine 4 Error
  • Project T
  • ProjectReplica
  • UnrealEngine4
  • Unreal Engine 4
  • error
  • ADB
  • ProjectT

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
한돌이
[Project T] Unreal Targeting System / 언리얼 타겟팅 시스템 v1.2.0
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.