본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 72. 모션 워핑 공격 완성하기


목차

  1. 워프 위치 고치기
  2. 모션 부드럽게 바꾸기

1. 워프 위치 고치기

 

현재 에너미가 모션 워핑으로 이동할때 플레이어가 너무 가까운 위치에 있으면 무기에 맞지 않을때가 있다. 그렇기 때문에 워프 위치를 플레이어의 위치보다 살짝 뒤쪽으로 하여 그러한 문제가 생기는 것을 막아보려고 한다.

 

C++에서 이 작업을 해보자.

 

UCLASS()
class PRACTICE_API ABaseCharacter : public ACharacter, public IHitInterface
{
	GENERATED_BODY()

protected:

UFUNCTION(BlueprintCallable)
FVector GetTranslationWarpTarget();

UFUNCTION(BlueprintCallable)
FVector GetRotationWarpTarget();

UPROPERTY(EditAnywhere, Category = "Combat")
double WarpTargetDistance = 75.f;

// 생략
}}

 

 

 

GetRotation이지만 백터를 반환하는 이유는 실제 타겟의 회전 정도를 알고 싶은게 아니라 타겟의 위치를 에너미가 바라보게 할 것이라 백터를 반환한다.

 

GetRotationWarpTarget() 함수에서는 타겟의 실제 위치가 아닌 WarpTargetDistance 만큼 떨어진 위치를 구할 것이다.

 

FVector ABaseCharacter::GetTranslationWarpTarget()
{
	if (!CombatTarget) return FVector();
	
	const FVector CombatTargetLocation = CombatTarget->GetActorLocation();
	const FVector Location = GetActorLocation();

	// CombatTargetLocation에서 Location으로 향하는 백터를 알고 싶으면 Location에서 CombatTargetLocation을 빼면 된다.
	FVector TargetToMe = (Location - CombatTargetLocation).GetSafeNormal();
	TargetToMe *= WarpTargetDistance;

	// TargetToMe는 방향과 거리 정보만 가지고 있기 때문에 실제 타겟의 위치에 더해주어야 한다.
	return CombatTargetLocation + TargetToMe;

}

FVector ABaseCharacter::GetRotationWarpTarget()
{
	if (CombatTarget)
	{
		return CombatTarget->GetActorLocation();
	}
	return FVector();
}

 

위와 같이 함수를 구현한다.

 

이제 컴파일을 하자.

 

그 다음 루트모션 공격 몽타주로 들어간뒤 모션워핑 스테이트를 클릭하고 디테일 패널을 살펴본다.

 

 

에너미의 로테이션은 따로 직접 변경할 것이기 때문에 체크를 해제한다.

 

 

이제 회전을 변경할 트랙을 만들어주자

 

 

트랜슬레이션을 해제하고 로테이션 메소드를 페이싱으로 고친다.

 

이제 실제로 노티파이를 적용하자. 그전에 에너미 블루프린트로 들어가 만들어두었던 커스텀 이벤트는 삭제한다. C++로 호출 가능한 함수를 만들었기 때문이다.

 

 

노드들을 연결한다.


2. 모션 부드럽게 바꾸기

 

현재 특정 시점에서 타겟의 위치를 받고 에너미의 위치를 이에 맞게 조정하는데 이 과정이 툭툭 일어나기 때문에 부드럽지가 않다.

 

이부분을 실시간으로 위치를 받아 부드럽게 움직이게 해보자.

 

에너미의 블루프린트 이벤트 그래프로 들어간다.

 

 

이제 애니메이션 블루프린트가 아닌 블루프린트 클래스에서 Tick 함수로 해당 함수들을 호출하고 애니메이션 블루프린트 이벤트 그래프에 있던 노티파이로 호출하던 함수들은 다 삭제해준다.

 

 

이제 쓸모 없어진 노티파이들을 삭제하자.

 

이렇게만 하면 위치가 업데이트 되어 계속 플레이어를 바라보게 한다.,

 

Tick 함수에서 이렇게 업데이트 하면 성능에 문제가 생길지 걱정되었는데 모션 워핑의 위치를 바꾸는 작업은 그렇게 비용이 많이 드는 작업은 아니라고 한다.

 

이렇게 해서 모션 워핑 공격을 마무리하였다.