Unreal Engine 4.18 が出てしばらく経ったが、今回 4.15 で作成したプロジェクト(C++コード含む)を 4.18 に移行する際にハマった点、解決のためにやったことを書いておく。
環境
- Win10 Pro
- UE 4.18
- VisualStudio Community
- UE 4.15 で作成したプロジェクト(C++コード含む)
UE4 の自動移行にお任せ
- 4.18 を起動して、 4.15 で作成したプロジェクトを開く
- 移行するか確認されるのでGO!
- ビルドエラーで開けない
sln を作りなおす
- .sln 削除
- .uproject 右クリックで "Generate Visual Studio 〜"
SCM 使ってる関係なのか、.sln はうまく開けないことがあり、その時にやる手順。
Rules 関連ファイルの修正
Target.cs
まず Source/ProjectName.Target.cs
のビルドエラーになるので修正する。
public class ProjectNameTarget : TargetRules
{
public ProjectNameTarget(TargetInfo Target)
// ↓このように後ろに追加
public ProjectNameTarget(TargetInfo Target) : base(Target)
TargetRules を継承するクラスのコンストラクタが変わったようだ。
Source/ProjectNameEditor.Target.cs
も同様の変更が必要。
Build.cs
Source/ProjectName/ProjectName.Build.cs
を修正する。
public class ProjectName : ModuleRules
{
public ProjectName(TargetInfo Target)
// ↓このように修正
public ProjectName(ReadOnlyTargetRules Target) : base(Target)
ModuleRules を継承するクラスのコンストラクタも変わっており、パラメータも新たなものになっている。
また、今回移行したプロジェクトで使用しているライブラリで、今までは
UEBuildConfiguration.bForceEnableExceptions = true;
の記述が必要だったが、この行があるとビルドエラーになるので削除した。
ProjectName.h
Source/ProjectName/ProjectName.h
の修正。
これも若干変更することになる。
#pragma once
#include "Engine.h"
// ↓ Engine.h の include は非推奨となり CoreMinimal.h に変更
#include "CoreMinimal.h"
用途別にどのヘッダを include するか選択できるようになったようだ。
必要に応じて、最低限のヘッダを選択することにより、余計なヘッダを見に行かなくなる。
ProjectName.cpp
Source/ProjectName/ProjectName.cpp
の修正。
#include "Modules/ModuleManager.h"
が必要になっていた。
自前で作成したクラス全般
今までは
#include "ProjectName.h"
が必要だったが不要になった模様。
IPlatformFile を使用している場合
ローカルのファイル検索で IPlatformFile::FDirectoryVisitor
を実装しているコードがあったが、
GenericPlatformFile.h
の include が必要になった。
また、処理中で FPaths
を使用していたが、こちらは Paths.h
の include が必要になった。
UTexture2D を使用している場合
Engine/Texture2D.h
の include が必要になった。
これは ProjectName.h
で Engine.h
を include しないよう変更したのが影響している。
IImageWrapper.h を include している場合
ヘッダそのものが無くなっていた...
#include "ImageWrapper.h"
// ImageWrapper.h は無くなり、以下の3つの追加が必要になっていた
#include "ModuleManager.h"
#include "IImageWrapper.h"
#include "IImageWrapperModule.h"
コードについても IImageWrapperPtr
から TSharedPtr
にするよう警告が出るので、
IImageWrapperPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
// ↓このように変更
TSharedPtr<IImageWrapper> ImageWrapper =
ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
と変更した。
Fpaths の変更
IPlatformFIle の所でヘッダについては触れたが、
FPaths::GameDir()
は FPaths::ProjectDir()
への置き換えが推奨されていた。
まとめ
概ね Visual Studio でのビルドエラーのメッセージを見ると、どのように変更すべきかが書かれているので、
メッセージに従い順番に解決していけば問題はない。
ヘッダごと移動してしまったものについては、公式リファレンス(日本語は古いことが多いので英語ページ)を参照するのが良い。