Integrasi pustaka Swift ke dalam UE4

Baru-baru ini, muncul masalah dalam mengintegrasikan kode yang hanya ditulis di Swift ke dalam proyek di UE4. Pada saat yang sama, opsi "ayo cepat tulis ulang semua yang ada di Tujuan C" tidak dipertimbangkan. Saya tidak menemukan solusi yang siap pakai di mana pun, saya, seperti yang sering terjadi, harus menggali secara luas dan mendalam. Tugas itu berhasil diselesaikan dan untuk membantu orang lain, saya memutuskan untuk menulis tutorial.



Biasanya, jika Anda perlu mengintegrasikan kode apa pun yang spesifik ke platform iOS / macOS, rakitan perpustakaan digunakan sebagai Kerangka, yang harus statis. Kode itu sendiri ditulis di Objective C. Selanjutnya, dependensi ditulis dalam skrip build proyek MyProject.Build.cs, misalnya, seperti ini:



if (Target.Platform == UnrealTargetPlatform.IOS)
{
    string ExtraPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../ThirdParty"));
    PublicAdditionalFrameworks.Add(
        new Framework(
            "MyFramework",
            ExtraPath + "/" + "MyFramework.framework.zip"
        )
    );
}


Untuk Swift, Anda dapat mencoba dengan cara yang sama, tetapi akan ada masalah - ketergantungan pada beberapa pustaka bahasa. Peringatan tautan akan terlihat seperti ini:



ld: warning: Could not find auto-linked library 'swiftFoundation'
ld: warning: Could not find auto-linked library 'swiftDarwin'
ld: warning: Could not find auto-linked library 'swiftCoreFoundation'
ld: warning: Could not find auto-linked library 'swiftCore'
ld: warning: Could not find auto-linked library 'swiftCoreGraphics'
ld: warning: Could not find auto-linked library 'swiftObjectiveC'
ld: warning: Could not find auto-linked library 'swiftDispatch'
ld: warning: Could not find auto-linked library 'swiftSwiftOnoneSupport'


Kemudian akan ada kesalahan standar bahwa beberapa simbol tidak ditemukan di file objek. Anda dapat mencoba menemukan di mana setiap pustaka yang disebutkan di atas berada dan menentukan jalurnya melalui kunci L, tetapi saya memutuskan untuk beralih ke tipe dinamis Kerangka, yang dengan sendirinya akan memuat pustaka ini.



, iOS :



dyld: Library not loaded: @rpath/MyFramework.framework/MyFramework
  Referenced from: /private/var/mobile/Containers/Bundle/Application/.../MyApp.app/MyApp
  Reason: image not found


, UE4 Framework, . IOS Toolchain , IOSPlugin.



plist , , :



<iosPListUpdates>
    <addElements tag="dict" once="true">
        <key>NSCameraUsageDescription</key>
        <string>The camera is used for live preview.</string>
    </addElements>
</iosPListUpdates>


copyDir. , , :



<init>
    <log text="Copy MyFramwork..."/>
    <copyDir src="/.../MyFramework.framework" dst="$S(BuildDir)/Frameworks/MyFramework.framework" />
</init>


, init. .



MyProject.Build.cs :



using UnrealBuildTool;
using System.IO;

public class MyProject : ModuleRules
{
    public MyProject(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

        if (Target.Platform == UnrealTargetPlatform.IOS)
        {
            string ExtraPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../ThirdParty"));
            PublicAdditionalFrameworks.Add(
                new Framework(
                    "MyFramework",
                    ExtraPath + "/" + "MyFramework.framework.zip"
                )
            );

            string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath);
            AdditionalPropertiesForReceipt.Add("IOSPlugin", Path.Combine(PluginPath, "MyProject_IOS_UPL.xml"));
        }
    }
}


Dan filenya MyProject_IOS_UPL.xmlseperti ini:



<?xml version="1.0" encoding="utf-8"?>
<root>
    <init>
        <log text="Copy MyFramework..."/>
        <copyDir src="/.../MyFramework.framework" dst="$S(BuildDir)/Frameworks/MyFramework.framework" />
    </init>
</root>


Solusi ini adalah semacam solusi sampai ada dukungan Kerangka dinamis dinamis normal di UE4, tetapi saya benar-benar puas dengannya.




All Articles