如何将 Unity 以库形式集成到原生 iOS 和 Android 应用 - V2EX
UNITY: Game Development Tool
License Comparisons
unn
V2EX    UNITY

如何将 Unity 以库形式集成到原生 iOS 和 Android 应用

  •  
  •   unn Jan 22, 2020 3199 views
    This topic created in 2307 days ago, the information mentioned may be changed or developed.

    本文转自 Unity Connect

    从 Unity 2019.3.a2 开始,我们通过把 Unity 运行时组件和内容集成到原生平台项目,在原生应用中将 Unity 作为库使用。

    本文将分享如何将 Unity 以库形式集成到原生 iOS 和 Android 应用。了解更多信息,请阅读:《在原生 iOS 或 Android 应用中将 Unity 作为库使用》。

    请访问云盘下载示例项目

    下载链接: https://pan.baidu.com/s/1JFWjbrh2x-qAsCzMwLywLA

    提取码: 9a71

    iOS 请 iOS 开发者使用 Unity 2019.3.a2 及更高版本,以及 Xcode 9.4 及更高版本。

    下载 Unity 2019.3.a2:https://unity3d.com/alpha/2019.3

    1、下载和解压项目

    我们会把该 Unity 项目加入到原生 iOS 应用,Assets/Plugins/iOS 文件夹中的文件用于使 Unity 播放器和原生应用进行通信。

    我们提供了一个简单的 Xcode 单视图应用,该项目拥有 UI,可以使用 UnityFrameworkLoad()加载播放器。

    为了方便起见,我们把二个项目解压到相同文件夹下。

    image

    2、生成 iOS 的 Xcode 项目

    我们按正常操作生成 Xcode 项目即可。

    首先在 Unity 编辑器打开 UnityProject 项目,选择 Menu -> Window -> Package Manager,因为 2.0.8 版本不兼容使用 Unity 作为库,所以要移除 Ads 资源包,或更新 Ads 资源包到 v 3.*版本。

    选择 Menu -> Edit -> Player Settings -> Player -> iOS 设置标签页 -> Identification Section,设置有效的 Bundle Identification 和 Signing Team ID,以避免后续步骤出现 Xcode 签名问题。

    打开 Menu -> File -> Builds Settings,在此选择并切换平台为 iOS。将 UnityProject 项目构建到 iosBuild 文件夹。

    image

    3、设置 Xcode 工作空间

    Xcode 工作空间允许同时处理多个项目,并结合它们的结果。 我们在 Xcode 打开 NativeiOSApp.xcodeproj。选择 File -> New -> Workspace,创建工作空间,把它保存在 UaaLExample/both.xcworkspace。

    image

    关闭 NativeiOSApp.xcodeproj 项目,此后的步骤会在刚创建的工作空间项目完成。

    选择 File -> Add Files to “both”,把 NativeiOSApp.xcodeproj 和第 2 步生成的 Unity-iPhone.xcodeproj 添加到相同等级的工作空间。

    image

    4、添加 UnityFramework.framework

    我们以框架的形式添加 Unity 播放器到 NativeiOSApp,它目前不会改变 NativeiOSApp 的行为。

    首先从 NativeiOSApp 项目选择 NativeiOSApp 目标。在 General -> Embedded Binaries 中按下+按钮。选择 Unity-iPhone/Products/UnityFramework.framework。

    我们从 Linked Frameworks and Libraries 移除 UnityFramework.framework,选中该条目并按下-按钮即可。

    image

    5、公开 NativeCallProxy.h

    原生应用会实现下面文件定义的 NativeCallsProtocol。

    首先找到并选择 Unity-iPhone / Libraries / Plugins / iOS / NativeCallProxy.h。

    然后在 Target Membership 中勾选 UnityFramework,通过 UnityFramework 右侧的下拉图标,把标头可见性设为 Public。

    image

    6、使 Data 文件夹成为 UnityFramework 的一部分

    默认情况下,Data 文件夹是 Unity-iPhone 目标的一部分,我们会通过修改它,使所有内容封装到单个框架文件中。

    我们把 Data 文件夹的 Target Membership 改为 UnityFramework。

    image

    在之前的改动后,为了使 Unity-iPhone 项目继续工作,Unity 播放器需要通过从 Unity-iPhone/MainApp/main.mm 进行调用,指向 Data 文件夹所处的新位置。

    [ufw setDataBundleId: "com.unity3d.framework"];

    在这种情况下不支持按需使用资源。为了使它们正常工作,我们不会使用前面的调用,因为默认情况下 Data 文件夹位于 mainBundle,所以我们要复制 Data 文件夹到原生应用,并跳过前面的调用。

    image

    运行 所有内容已经准备好针对二个项目进行构建,运行和调试,即:Unity-iPhone 项目和 NativeiOSApp 项目,选择 Scheme 为 NativeiOSApp 或 Unity-iPhone。

    image

    如果一切顺利,我们可以运行 NativeiOSApp。

    image

    完整项目说明 在集成步骤中遇到问题,你可以尝试已经准备好构建和部署的完整项目,只需要修复 Xcode 的签名即可。

    • NativeiOSApp 目标

    • Unity-iPhone 目标(可选)

    • UnityFramework 目标不需要签名

    请下载并解压完整项目文件,在 Xcode 打开 both.xcworkspace,运行 NativeiOSApp Scheme。

    关键要点

    Unity 播放器由 UnityFramework 对象控制。为了获取该对象,我们要调用 UnityFrameworkLoad,它会加载 UnityFramework.framework,然后返回单个实例到 UnityFramework 类,请观察 Unity-iPhone/UnityFramework/UnityFramework.h,了解它的 API。

    请在 NativeiOSApp/NativeiOSApp/MainViewController.mm 文件中或 Unity-iPhone/MainApp/main.mm 文件中观察 UnityFrameworkLoad。

     #include <UnityFramework/UnityFramework.h> UnityFramework* UnityFrameworkLoad() { NSString* bundlePath = nil; bundlePath = [[NSBundle mainBundle] bundlePath]; bundlePath = [bundlePath stringByAppendingString: @"/Frameworks/UnityFramework.framework"]; NSBundle* bundle = [NSBundle bundleWithPath: bundlePath]; if ([bundle isLoaded] == false) [bundle load]; UnityFramework* ufw = [bundle.principalClass getInstance]; if (![ufw appController]) { // 首次初始化 Unity [ufw setExecuteHeader: &_mh_execute_header]; // 同步 Data 文件夹的 Target Membership 设置 [ufw setDataBundleId: "com.unity3d.framework"] } return ufw; } 

    Android

    请 Android 开发者使用 Unity 2019.3.a2 及更高版本,以及 Android Studio 3.3.2 及更高版本。

    1、下载和解压项目

    请下载 Unity 项目,该项目是要加入原生 Android 应用的示例 Asses/Plugins/Android 文件夹中有扩展 UnityPlayerActivity 的 OverrideUnityActivity 文件。

    我们提供的原生 Android 项目是来自 Android Studio 模板的 Basic Activity 应用程序,我们会把前面的 Unity 项目加入到这里。该项目有 UI 和 MainUnityActivity 来扩展 OverrideUnityActivity,可以使用 Intent 启动 MainUnityActivity。

    为了方便起见,我们把二个项目解压到相同文件夹下。

    image

    2、生成 Android 平台的 Gradle 项目

    我们在 Unity 编辑器打开 UnityProject 项目,点击 Menu -> File -> Build Settings 打开 Build Settings。

    选择并切换为 Android Platform,勾选 Export Project 选项。

    image

    我们把 UnityProject 导出到 androidBuild 文件夹,该文件夹结构如下图所示。

    image

    3、把 Unity Library 模块添加到 NativeAndroidApp

    现在把 androidBuild/unityLibrary 模块添加给 Android Studio 中的 NativeAndroidApp Gradle 项目:

    我们在 Android Studio 打开 NativeAndroidApp,然后打开 settings.gradle 文件。在该文件末尾,添加指向 unityLibrary 的新项目。

     include ':unityLibrary' project(':unityLibrary').projectDir=new File('..\\UnityProject\\androidBuild\\unityLibrary') 

    image

    打开 build.gradle 文件,把下面代码添加到 dependencies 代码块。

    implementation project(':unityLibrary') 

    image

    打开 build.gradle 文件,把下面代码添加到 allprojects{repositories{代码块。

    flatDir { dirs "${project(':unityLibrary').projectDir}/libs" } 

    image

    Gradle 文件已经修改,单击 Sync Now。

    image

    如果一切顺利,我们会看到 unityLibrary 模块添加到 Android 视图中。

    image

    运行 现在已经准备好进行构建,运行和调试。

    image

    如果一切顺利,我们应该可以运行 NativeAndroidApp。

    image

    请注意:在应用程序安装到设备后,会出现二个启动应用程序的图标,请把<intent-filter>...</intent-filter>从 unityLibrary 的 AndroidManifest.xml 去掉,仅保留集成版本。

    完整项目说明

    如果在集成步骤中遇到问题,你可以尝试已经准备好构建和部署的完整项目。请下载并解压完整项目文件,在 Android Studio 打开 NativeAndroidApp。

    小结

    如何将 Unity 以库形式集成到原生 iOS 和 Android 应用为大家介绍到这里,请下载示例项目动手操作起来吧。

    原文链接:https://connect.unity.com/p/ru-he-jiang-unityyi-ku-xing-shi-ji-cheng-dao-yuan-sheng-ioshe-androidying-yong?app=true 更多 Unity 干货资源,请戳上方链接下载 Unity 官方 app。

    No Comments Yet
    About     Help     Advertise     Blog     API     FAQ     Solana     2935 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 69ms UTC 06:08 PVG 14:08 LAX 23:08 JFK 02:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86