어떤 작업을 했는지 스스로 잊지 않기 위해서 매일매일 어떤 작업을 했는지 간략하게 공유하는 글을 써보려고 합니다.
글을 쓰는데는 짦게는 5분, 길게는 1시간까지 쓰려고하고 1시간 넘게 투자하지는 않으려고 합니다. 지금 글을 쓰기 시작한 시간이 10시 5분이니, 이 글은 11시 5분까지 마무리 지어야겠네요.
그래도 오늘은 첫 포스트이니 만큼 어떤 걸 만들고 있는지, 어떤 작업환경인지에 대해서 간략하게 소개하려고합니다.
언리얼5로 각종 무료 에셋들을 활용해서 게임의 각종 기능들을 만들어보는 프로젝트입니다. 게임의 장르는 싱글플레이 3D 턴제 RPG입니다. 프로젝트의 목적은 게임의 완성에 있지 않고, 각 기능들을 잘 모듈화해서 만드는 것에 있습니다.
만들어보려는 기능의 예시들로는 아래와 같은 것들이 있습니다.
홈 화면, 로딩, 플레이화면으로 레벨 이동, 캐릭터 조작, NPC와의 대화 정도 기능이 현재 구현되어 있는 상태입니다.
모든 기능은 기본적으로 C++코드로 작성하고 있으며, 일부 상황에 대해서만 블루프린트 기능을 사용하고 있습니다.
1. UI의 경우 블루프린트의 Detail패널에서 해결 가능한 수준의 작업은 해당 패널을 이용하고 있습니다.
2. 각종 Actor들은 블루프린트로 만듭니다. 충돌체 세팅, 사이즈 조정 등의 작업을 여기서 진행하며, 각종 이벤트나 기능 등은 코드로 작성합니다.
3. 애니메이션과 관련된 부분은 일부 블루프린트를 사용 중입니다. 향후 제거를 고려하고 있습니다.
데이터의 관리는 언리얼의 Data Table을 이용하고 있으며, 수정사항 추적을 위해 매번 json으로 export하여 uasset과 같이 커밋해주고 있습니다.
로딩 창
로딩 화면에서 다양한 이미지를 표시하는 작업을 추가했습니다. 이미지와 텍스트는 레벨별로 세팅할 수 있게 만들었으며, 특별히 지정하지 않으면 기본 세팅안에서 랜덤 출력되도록 만들었습니다. 특정 레벨(=지역)으로 이동할 때 거기에 맞는 이미지와 툴팁을 띄워주는 목적으로 레벨단위로 출력할 수 있게 세팅했습니다.
USTRUCT(BlueprintType)
struct FLoadingScreenData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
FLoadingScreenData()
{
}
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dialog)
FName LevelName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dialog)
TArray<TSoftObjectPtr<UTexture2D>> Images;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Dialog)
TArray<FText> HintTexts;
};
일시 정지
ESC를 누르면 게임이 일시정지되고, 일시정지에 맞는 UI창의 띄우는 작업을 진행 중입니다.
그런데 요즘의 게임들을 생각해보면, UI가 상당히 복잡하고 UI창 위에서 새 UI를 띄우고 거기서 다시 새 UI를 띄울 수 있는 식으로 구성되는 경우가 꽤 흔합니다. 예를 들면, 인벤토리창을 열고, 거기서 아이템 옵션을 수정할 수 있는 설정 창으로 이동할 수 있고, 설정창에서 다시 인벤토리 창을 열 수 있는 식의 구성이 가능할 수 있습니다.
위의 상황을 고려하면 일시정지 기능이 단순히 키를 누르면 게임이 멈추고, 다시 시작되는 것으로 끝나는 방식은 그다지 좋은 관리 법이 아닐 것 같습니다. 그래서 게임을 일시정지 시킬 수 있는 UI들을 미리 정의하고, 그것들을 모아서 관리하는 방식이 필요하다고 판단했습니다.
열었던 위젯의 목록을 Stack 형식으로 관리하며, Stack에 아이템이 들어오면 일시정지로 바뀌며 Stack이 비었을 때 일시정지를 자연스럽게 풀어주는 관리 클래스를 현재 작성 중이며, 이 작업을 내일까지 진행할 예정입니다. 테스트 결과에 따라 구현을 완전히 바꿀 수도 있어 구현 방식은 내일의 일기에 추가로 공유하려고 합니다.
이런식으로 매일 간단하게 어떤 작업을 했는지만이라도 올리려고 하고, 특별한 부분이 있거나 글을 쓸 여유가 있는 날에는 작성한 코드나 그 날 배운 것을 공유해보려 합니다.