UE5 Project 공포게임 제작 일지 - 7

리벤·2023년 12월 1일

HideAndSeek

목록 보기
8/9

1. 추가 수정


이전 포스트에서 제단의 위치를 알려줄 아이템으로 영혼 랜턴을 만들었다고 했다.

근데 위의 gif를 보면 제단을 가리키는 빛이 회전하는 게 다소 부자연스럽다.

원래의 코드는 (아래의 코드는 예시다)

// SoulLantern_cpp.cpp

void ASoulLantern_cpp::FindAltar()
{
	FVector AltarLocation = Altar->GetActorLocation();
    FVector CurrentLocation = GetActorLocation();

	FVector Direction = (AltarLocation - CurrentLocation).GetSafeNormal(); 
    // 현재 랜턴(플레이어)의 위치와 목적지 위치 사이의 노말 벡터
	FVector Forward = GetActorForwardVector(); // 현재 랜턴의 forward 벡터

	float Dot = FVector::DotProduct(Forward, Direction); 
    // 두 벡터 사이의 내적을 구함
	float Theta = FMath::Acos(Dot); 
    // 내적값을 arc cos을 통해서 theta(각도)를 구함

	Theta = FMath::RadiansToDegrees(Theta); 
    // 기존의 Theta의 값이 Radian 값이기 때문에 Rotator를 위해 Degree값으로 변경
	FVector Cross = FVector::CrossProduct(Forward, Direction); 
    // 회전축 구하기
	FRotator NewRotation(0.f);

	if (Cross.Z > 0)
	{
		NewRotation = FRotator(0.f, Theta, 0.f); // 양수면 오른쪽으로
	}
	else if(Cross.Z < 0)
	{
		NewRotation = FRotator(0.f, -Theta, 0.f); // 음수면 왼쪽으로
	}
    
	LightNiagara->SetRelativeRotation(NewRotation); // 제단을 가리키는 불빛 회전
}

위와 같이 작성해서 사용했다. 다만 여기서 실수했던 점이, 외적값이 0일 때 어떻게 할 것인지에 대한 것이 없다는 점과 LightNiagara의 회전을 RelativeRotation으로 적용했다는 것이다. 따라서 랜턴을 든 상태로 아래를 볼 때, 제단을 가리켜주는 노란 색 빛 또한 제단의 위치를 가리키는 것이 아닌 아래를 향하고 있다. 그래서 코드를 수정해서 조금 더 부드러운 회전이 되도록 하면서, 어디를 보든 노란 빛이 제단을 가리키도록 했다.

추가적으로 랜턴을 껐을 때, LightNiagara의 Life Span이 너무 길어 꽤 오래동안 남아있었는데, 이를 수정하여 즉각 사라지게 변경했다.

2. 최적화 관련


레벨을 테스트하는 과정에서 프레임 드랍 현상이 간혹 발생해서, 최적화하기 위해 노력했다.

우선 한 번 배치된 후 더이상의 상태가 변하지 않는 모든 오브젝트들은 Tick 활성화를 해제하여 World Tick을 호출하지 않도록 설정했다.
랜덤 맵을 생성할 때 프레임 드랍이 너무 심해서 한 번 했었던 작업이었지만, C++ 클래스에서

AActorSample::AActorSample()
{
	PrimaryActorTick.bCanEverTick = false;
}

로 설정했음에도 해당 C++ 클래스로부터 파생된 블루프린트 액터들 모두가 Tick 비활성화가 되어있지 않았다. 따라서 Game Thread의 병목 현상을 줄이기 위해 해당 액터들의 Tick을 비활성화하였다.

두 번째로, 라이트 관련하여 상태를 Movable에서 Stable로 변경하여 최적화하려고 시도해보았다.
라이트 컴포넌트가 Movable로 설정되어 있으면, 실시간으로 라이트를 계산하여 그림자를 연산하는데, 성능 면에서도 그림자 퀄리티 면에서도 별로 좋지 못하다. 그래서 미리 빛의 정보와 그림자들을 미리 빌드해 라이트 맵을 생성하여 라이트가 적용된 것처럼 보이게 해보았는데, 문제는 랜덤 맵 생성 자체가 스트리밍된 레벨이 이리 저리 회전하고 움직이고 해서 그런지, 테스트해볼 때 새까맣게, 빛이 없는 상태로 맵이 시작되었다...

결국 두 번째 방법은 끝내 실패로 끝나면서 최적화에 실패했다..

마지막으로, 렌더링 최소화 및 연산 최소화를 위해 플레이어가 크리쳐들로부터 일정 범위 이상으로 멀어지면, 컬링시키고, 크리쳐들이 문을 열거나 하는 행동을 하지 않고 통과시키게 해보았다.
컬링은 성공했지만, 이상하게 문을 통과하는 것은 왜인지 되지 않고 계속 문을 열고 지나가는 등의 행동을 해서 아쉬웠다;

3. 의문점


내가 개발하는데 사용하는 컴퓨터는 ASUS TUF GAMING FX505GM 노트북이고, CPU는 Intel i5 8세대, GPU는 GTX 1060이다. 그래서 그런지 전체화면으로 바꿀 때, 창모드일때보다 프레임이 확연히 떨어진다.
해상도를 낮추면 비슷해지긴 하는데(흠...)
왜 이런 현상이 일어나는지는 모르겠다.

4. 추가할 점


  • 이제 레벨 내내 스토리가 조화로워질 수 있도록 UI Widget을 추가하기
  • 그래픽, 게임 옵션 UI 추가하기(현재 그래픽 설정 UI를 추가했으나, 해상도 설정 시 자동으로 전체화면이 되는 문제 발생;; <= 왜 이러는지 모르겠다 ㅠㅠ)
  • 키 매핑할 수 있으면 하기(PC 버전만 할 거라 없어도 큰 문제는 없겠으나 추가하면 좋을 듯 하다)
  • 세이브 데이터 만들기(레벨 관련)
  • 지인 테스트 후 밸런스 조절하기
profile
traveler who wants to be game developer

0개의 댓글