Unreal 5.1.1 支援 Swift Framework

公司最近專案升級上 StoreKitV2 ,Unreal 這裡官方早期的 Install 並不支援 Swift,所以就來研究了一番。

原先使用的方式是修改引擎,但寫個 Plugin 還要改引擎,這樣使用 Plugin 的也要改引擎實在不是很好的方向。

後來看到 Unreal 5.2 內新增了 Swift Module

private static string GetSwiftStandardLibraryLinkPath(string PlatformPath)
{
	string XcodeRoot = Utils.RunLocalProcessAndReturnStdOut("/usr/bin/xcode-select", "--print-path");
	return  $"{XcodeRoot}/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/{PlatformPath}";
}

Swift Module Build.cs function

他主要的邏輯在這裡,利用 Xcode 指令查出 Xcode Path 進而載入 Swift SDK,只要啟用 Module 應該就可以支援。

但我是製作 Plugin,所以我換了一個方式,在 Plugin Build.cs 內做類似的事情

// 添加 Swift SDK
if (Target.Platform == UnrealTargetPlatform.IOS || Target.Platform == UnrealTargetPlatform.Mac)
	{
		string SWIFT_SDKROOT = Utils.RunLocalProcessAndReturnStdOut("/usr/bin/xcrun", "--sdk iphoneos --show-sdk-path");
		PublicSystemLibraryPaths.Add(SWIFT_SDKROOT + "/usr/lib/swift");
		PublicSystemLibraryPaths.Add(SWIFT_SDKROOT + "../../../../../../Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos");
		PublicSystemLibraryPaths.Add(SWIFT_SDKROOT + "../../../../../../Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0/iphoneos");
		PublicSystemLibraryPaths.Add(SWIFT_SDKROOT + "../../../../../../Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.5/iphoneos");
}

Plugin Build.cs

然後我在 iOS UPL 內複製到 Build Dir

<!-- 執行 Swift SDK 複製到 Build Dir -->
<prebuildCopies>
	<log text="複製 Swift SDK"/>
	<copyDir src="$S(EngineDir)/Intermediate/UnzippedFrameworks/swift_framework_dynamic/swift_framework_dynamic.embeddedframework/swift_framework_dynamic.framework" dst="$S(BuildDir)/Frameworks/swift_framework_dynamic.framework" />
</prebuildCopies>