지난 1주간 프로젝트 때문에 TIL을 쓰려고 하면 프로젝트 마감을 못할거 같아 TIL을 제쳐두고 프로젝트에 집중했다. 그래서 지금까지 슈팅 게임 프로젝트를 하며 겪은 문제와 해결과정, 배운점들을 기록할 것이다.
나는 개발을 할 때 Visual Studio를 쓰는데 굳이 Visual Studio가 아니어도 중단점은 다 찍을 수 있다.
그리고 왼쪽에서 중단점을 클릭으로 찍을 수도 있지만 해당 코드 줄이 있는 위치에서 F9번을 누르면
바로 중단점을 찍을 수 있다.
이렇게 하고 언리얼을 실행시킨 다음 UpdateHUD함수가 실행되는 상황을 만들고
그러면 중단점을 찍은 UpdateHUD함수가 호출될때 언리얼 에디터가 멈출텐데
그 때, 내부에서 if문을 통과하는지 안하는 지의 정보나 변수에 메모리 주소가 올바른 값인지 아닌지의 정보를 확인해서 디버깅을 할 수 있다.
여기 보이는 로컬 창을 열어서 코드 1줄을 실행했을 때 만약 변수에 값이 들어가는 코드가 있다면 해당 변수가 올바른 메모리 주소를 가지고 있는지 없는지의 정보를 로컬 창에서 확인할 수 있다.
F10번으로 1줄씩 내려갈 수 있으며, 언리얼 내부 코드까지 확인하고 싶다면 F11번으로 정말 세세히 한줄 한줄 볼 수 있는데 그냥 F10번으로 내가 작성한 코드에서 1줄씩 내려가는 걸 확인하는 게 훨씬 빠르고 편하다.
도중에 언리얼 엔진 내부 코드로 들어갔는데 빠져나오고 싶다면 SHIFT+F11번을 누르면 된다.
F5번을 다시 1번 누르면 중단점을 빠져나와 언리얼 에디터로 다시 돌아가고 게임이 실행된다.
헤더파일이나 소스파일에서 새로운 함수를 만들 때 둘 중에 한 곳에만 함수를 만들어 놓고
Ctrl + .
-> d
를 누르면 자동으로 헤더 파일이면 정의를 만들어주고 소스 파일이면 {}
가 포함된 구현부 틀을 만들어준다.
같은 변수명을 가진 변수를 한번에 바꾸고 싶을 때..
예를 들어, Power->Powers로 바꾸고 싶을 때, 해당 변수에 커서를 두고
Ctrl + R
을 2번 누르면..
이런 창이 뜨게 되는데 여기서 같은 이름의 단어를 한번에 변경 가능하다.
내가 만든 MyFunctionLibrary는 언리얼에서 이렇게 블루프린트 함수 라이브러리를 상속받아 만들었고 이름은 다른걸로 해도 상관없다.
이 클래스르 만든 목적은 static 함수를 따로 모아 놨다가 블루프린트나 c++ 어디서든
필요할 때 그 함수를 쉽게 불러오기 위해서 어디든 사용할 수 있는 함수들을 모아놓은 것이다.
AMyHUD* UMyFunctionLibrary::GetMyHUD(const UObject* WorldContextObject)
{
if (APlayerController* PlayerController = UGameplayStatics::GetPlayerController(WorldContextObject, 0))
{
if (AMyPlayerController* MyPlayerController = Cast<AMyPlayerController>(PlayerController))
{
return Cast<AMyHUD>(MyPlayerController->GetHUD());
}
}
return nullptr;
}
이렇게 언리얼에서는 무언가 클래스를 가져올때 대입하고 캐스팅해주어야 하는 코드들이 많은데
이걸 그대로 쓰면 코드가 복잡해보이니 그때 내가 만든 함수 라이브러리에 저 코드를 담고 있는 함수를 추가해서
void AMyGameMode::EndingCreditFadeOutHandler()
{
if (AMyHUD* HUD = UMyFunctionLibrary::GetMyHUD(this))
이런식으로 1줄로 줄여서 쓸 수 있게 되는 것이다!
지금은 이정도밖에 못만들었지만 앞으로 더 가독성이 뛰어나게 만들고 싶다.
인터렉티브한 애니메이션 효과도 줘서 진짜 게임 UI처럼 만들어 보고 싶다.
더 나은 UI 제작을 위해 지금의 UI 이미지를 개인기록 및 참고용으로 올렸다.
지금 보니까 글씨가 흰글씨라 가독성이 떨어지는데 다음부터는 가독성까지 생각하며 만들어야겠다.