始めに
Epic Gamesの「Unreal Engine」は、GitHubやPerforceからソースコードをダウンロードできることをご存じでしょうか。今回のトピックは、ソースコードをビルドすることそのものではなく、ソースコード版のエンジンを自分の好みに改造してみよう、という内容です。
エンジンチームに入った頃、Epic Games Launcherからダウンロードしたエンジンと社内で使うエンジンを区別する必要がありました。見た目だけでは区別できなかったため、ソースコードの中からカスタマイズできそうな部分を探しました。
その結果を共有するために、この記事を書くことにしました。
結果だけ先に見たい方のために、この下にその結果のスクリーンショットを載せておきます。
開発環境
- Unreal Engine 5.5.4をベースとしています
- 対応プラットフォーム:Windows, Mac
- IDE:JetBrains Rider
この作業では、コンパイルにかかる時間は環境によって大きく異なります。特に、Macでは4〜7時間かかることもあるくらい、かなり時間がかかります。
なお、本文で挙げるコンパイル時間は、Windows(Ryzen 9 7950X)とMac(M1 Pro)で計測したものです。
Splash Screenをカスタマイズ

たぶん、みなさまが毎日目にしている画面だと思います。この画像に表示されているテキストや背景画像は、好みに合わせて変更することができます。このスプラッシュ画面を担当するクラスは、FGenericPlatformSplash を継承している FWindowsPlatformSplash や FMacPlatformSplash といったプラットフォーム系クラスです。まずは背景から変えてみましょう。
背景を自分の好きな画像に
スプラッシュで使われる画像として何が使えるのか。その答えはFGenericPlatformSplashにあります。
/**
* Return the filename found (look for PNG, JPG and BMP in that order, try to avoid BMP, use more space...)
*/
FString GetSplashFilename(const FString& ContentDir, const FString& Filename)
{
int index = 0;
const FString ImageName = ContentDir / Filename;
FString Path;
while (SupportedSplashImageExt[index])
{
Path = ImageName + SupportedSplashImageExt[index++];
if (FPaths::FileExists(Path))
return Path;
}
// if no image was found, we assume it's a BMP (default)
return ImageName + TEXT(".bmp");
}
このコードでスプラッシュ画像のファイル名を探します。コメントに書かれているとおりに、PNG・JPG・BMP形式の画像ファイルが利用できます。BMP画像はできるだけ使わず、JPGやPNGを使ってくださいと書いてありますが、実はみなさんがいつも見ているあの画像はBMPファイルです。
スプラッシュ画像として使用できるファイル形式がわかったので、次は、そのファイルをどこで探しているのかを見てみます。
//全文ではなくて、必要な部分だけを引用しました。
bool FGenericPlatformSplash::GetSplashPath(const TCHAR* SplashFilename, FString& OutPath, bool& OutIsCustom)
{
// first look in game's splash directory
OutPath = FPaths::ConvertRelativePathToFull(GetSplashFilename(FPaths::ProjectContentDir(), Filename));
OutIsCustom = true;
// if this was found, then we're done
if (IFileManager::Get().FileSize(*OutPath) != -1)
{
return true;
}
// next look in Engine/Splash
OutPath = FPaths::ConvertRelativePathToFull(GetSplashFilename(FPaths::EngineContentDir(), Filename));
OutIsCustom = false;
// if this was found, then we're done
if (IFileManager::Get().FileSize(*OutPath) != -1)
{
return true;
}
}
優先的にゲームのContentフォルダ内のSplashフォルダを探し、その後でエンジン側を探します。一般的なプロジェクトでは、ゲーム側のコンテンツにSplashフォルダを意図的に作ることはあまりないと思います。そのため、ここではエンジン側に存在するフォルダを探してみましょう。
エンジンのスプラッシュフォルダは、エンジンがインストールされているパスのEngine/Content/Splashにあります。IconDefaultとSplashの画像がそれぞれ2種類ずつあります。「ED」と付いている画像はエディタで使われる画像で、この画像を別のものに差し替えると、エディタに出てくるスプラッシュ画像が変わります。「ED」が付いていない方はゲーム用で、エディタ以外の環境で実行したときに表示される画像です。Android や iOS で実行する場合にはスプラッシュ画面は表示されずそのまま進みますが、Windows やスタンドアロンで実行した場合にはスプラッシュ画面が表示されます。
では、実際に画像を好きなものに変えると。

僕の場合、こちらの画像に変更しました。元の画像のサイズは720x370でした。同じく、差し替える画像も720x370でリサイズしました。
IconDefaultがどこで使われているかは、今ははっきり覚えていません。もし後で思い出したら、その部分も追記しようと思います。画像を変えた結果がこれでした。

Splash Screenの文を変えてみましょう。
この作業はエンジンのコアモジュールを再コンパイルする必要があるため、Windows環境ではおおよそ5分ほどかかりました。
Macの場合にはモジュール単位ではなくエンジン全体をコンパイルするため、僕の環境では最短でも2時間、長いときには7時間ほどかかったことがありました。修正すべきクラスは[実行Platform]PlatformSplashです。この部分では、Mac環境とWindows環境での内容は同じです。そのため、例としてWindows環境を中心に説明します。
//Line 643 ~ 728
void FWindowsPlatformSplash::Show()
{
// こちらの三つの文字列を書き直しました。
// AppName : 一番上に表示される大きな文字列です。
// VersionInfo : AppNameの下に書いている文字列です。
// CopyrightInfo : スプラッシュ画像の右下(5時方向)に表示される文字列です。
// Set version info
{
const FText Version = FText::FromString( FEngineVersion::Current().ToString( FEngineBuildSettings::IsPerforceBuild() ? EVersionComponent::Branch : EVersionComponent::Patch ) );
FText AppName;
// 僕の場合は「Unreal Editor {0}」→「Based on UE {0}」と修正しました。
FText VersionInfo = FText::Format(NSLOCTEXT("UnrealEd", "UnrealEdTitleWithVersion_F", "Unreal Editor {0}"), Version);
// ゲームプロジェクトを開かずにエディタを起動した場合に表示されます。例として使っている画像を見たら理解できると思います。
if( GameName.IsEmpty() )
{
AppName = NSLOCTEXT( "UnrealEd", "UnrealEdTitleNoGameName_F", "Unreal Editor" );
}
// ゲームプロジェクトを実行すると現れます
// 僕は「Unreal Editor - 」と書かれている部分を韓国語で書き直して、一目で識別できるようにしました。
else
{
AppName = FText::Format( NSLOCTEXT( "UnrealEd", "UnrealEdTitle_F", "Unreal Editor - {0}" ), GameName );
}
StartSetSplashText(SplashTextType::GameName, *AppName.ToString());
StartSetSplashText(SplashTextType::VersionInfo1, *VersionInfo.ToString());
// Change the window text (which will be displayed in the taskbar)
GSplashScreenAppName = AppName;
}
// Display copyright information in editor splash screen
{
// こちらの部分は多分修正する必要がないと思います。
const FString CopyrightInfo = NSLOCTEXT( "UnrealEd", "SplashScreen_CopyrightInfo", "Copyright \x00a9 Epic Games, Inc. All rights reserved." ).ToString();
StartSetSplashText( SplashTextType::CopyrightInfo, *CopyrightInfo );
}
}
タスクバーに表示されるアイコンを変えてみましょう。
ここまでの内容は、会社でエンジンを触っていたときに調べて修正して使っていた部分です。次の内容は、エンジンチームに入った頃にはわからなかった部分で、最近になってようやく方法を見つけました。
ソースコードからビルドしたエンジンと、Epic Games Launcherでダウンロードしたエンジンの二つを同時に実行した環境では、Windowsのタスクバーに表示されているアイコンだけを見て両者を区別することがほぼ不可能でした。それについて、韓国のEpic Gamesの方に質問したことがありました。その時には、「私もその部分については知りませんが、多分、実現は可能だと思います。」と返事をいただきました。
答えはEngine\Build\Windows\Resourcesの中にありました。

このフォルダに入れているicoファイルを差し替えることで、アイコンを変更できました。このファイルを読み込んでいる部分は、こちらにありました。
static FString GetWindowsIconFilename(EWindowsImageScope::Type Scope)
{
if (Scope == EWindowsImageScope::Engine)
{
FString Filename = FPaths::EngineDir() / FString(TEXT("Build/Windows/Resources/Default.ico"));
return FPaths::ConvertRelativePathToFull(Filename);
}
}
アイコンの画像を変更すると、約1700個のファイルがコンパイルされます。その後、Unreal Editorのアイコンを見ると、差し替えた画像に変わっていることを確認できます。
Macの場合は、個人的な時間の都合でまだ十分に検証できていません。後日テストできたら、この部分も追記する予定です。
終わりに
作業自体は簡単なものですが、この内容を見つけるまでには決して短くない時間がかかりました。
コードベースでUnreal Engineを使っている方や、僕と同じような業務を担当されている方の参考になれば、本当にうれしいです。
ここまで読んでくださって、ありがとうございました。


