Unreal Engine 5.5以降でAndroid向けにビルドを実行した際、例えば、次のようなエラーが出ました。(一部抜粋)
Program arguments: /Users/UserF/Library/Android/sdk/ndk/25.1.8937393/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ "@/Users/UserF/Documents/Unreal Projects/MyProject/Plugins/MyPlugIn/Intermediate/Build/Android/a/UnrealGame/Development/MyPlugIn/FooSubsys.cpp.o.rsp"
[1900.01.01-00.00.00:000][741]UATHelper: Packaging (Android (ASTC)): 1. /Users/UserF/Documents/Unreal Projects/MyProject/Plugins/MyPlugIn/Source/MyPlugIn/Private/FooSubsys.cpp:13:53: current parser token ';'
[1900.01.01-00.00.00:000][741]UATHelper: Packaging (Android (ASTC)): 2. /Users/UserF/Documents/Unreal Projects/MyProject/Plugins/MyPlugIn/Source/MyPlugIn/Private/FooSubsys.cpp:9:79: parsing function body 'UFooSubsys::Initialize'
[1900.01.01-00.00.00:000][741]UATHelper: Packaging (Android (ASTC)): 3. /Users/UserF/Documents/Unreal Projects/MyProject/Plugins/MyPlugIn/Source/MyPlugIn/Private/FooSubsys.cpp:11:79: in compound statement ('{}')
ソースコードは、次のようなものです。
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/WorldSubsystem.h"
#include “BarData.h”
#include "MyWorldSettings.h"
#include "FooSubsys.generated.h"
/**
*
*/
UCLASS()
class FOOPIN_API UFooSubsys : public UWorldSubsystem
{
GENERATED_BODY()
public:
UFooSubsys();
~ UFooSubsys();
virtual void Initialize(FSubsystemCollectionBase& Collection);
virtual void Deinitialize();
UPROPERTY(EditAnywhere,BlueprintReadWrite)TObjectPtr<UBarData> BarData;
};
#include "FooSubsys.h"
UFooSubsys:: UFooSubsys(){
}
UFooSubsys::~ UFooSubsys(){
}
void UFooSubsys::Initialize(FSubsystemCollectionBase& Collection){
if(UWorld* WorldOuter = Cast<UWorld>(GetOuter())){
if (AMyWorldSettings* MyWorldSettings = Cast<AMyWorldSettings>(WorldOuter->GetWorldSettings()))
{
TSoftObjectPtr tmpRR = MyWorldSettings->BarData;
BarData = tmpRR.Get();
if(BarData == nullptr){
BarData = tmpRR.LoadSynchronous();
}
}
}
}
void UFooSubsys::Deinitialize(){
}
Unreal Engine 5.4までは、このようなエラーは出ませんでした。
また、開発PC向けのコンパイルやAndroid以外の他のプラットフォーム向けのビルドは正常に行われます。
エラーメッセージにはクラッシュレポートを送ってください(意訳)という文言が含まれており、この現象はおそらくClangのバグによるものと思われます。
このエラーは、関数内にTSoftObjectPtr型のローカル変数が宣言されると発生することがあるようです。
この現象は型をちゃんと指定することで回避できます。
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/WorldSubsystem.h"
#include “BarData.h”
#include "MyWorldSettings.h"
#include "FooSubsys.generated.h"
/**
*
*/
UCLASS()
class FOOPIN_API UFooSubsys : public UWorldSubsystem
{
GENERATED_BODY()
public:
UFooSubsys();
~ UFooSubsys();
virtual void Initialize(FSubsystemCollectionBase& Collection);
virtual void Deinitialize();
UPROPERTY(EditAnywhere,BlueprintReadWrite)TObjectPtr<UBarData> BarData;
};
#include "FooSubsys.h"
UFooSubsys:: UFooSubsys(){
}
UFooSubsys::~ UFooSubsys(){
}
void UFooSubsys::Initialize(FSubsystemCollectionBase& Collection){
if(UWorld* WorldOuter = Cast<UWorld>(GetOuter())){
if (AMyWorldSettings* MyWorldSettings = Cast<AMyWorldSettings>(WorldOuter->GetWorldSettings()))
{
TSoftObjectPtr<UBarData> tmpRR = MyWorldSettings->BarData;
BarData = tmpRR.Get();
if(BarData == nullptr){
BarData = tmpRR.LoadSynchronous();
}
}
}
}
void UFooSubsys::Deinitialize(){
}
参考
https://github.com/llvm/llvm-project/issues/53598
こちらのリンクの記事に、同じような現象を再現できるコードがあります。もしかすると、テンプレートを使用する際は注意する必要があるかもしれません。