集成Unity3D到iOS应用程序中

Posted 滴水微澜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集成Unity3D到iOS应用程序中相关的知识,希望对你有一定的参考价值。

如果想让原生平台(例如 Java/Android、Objective C/iOS 或 Windows Win32/UWP)包含 Unity 功能,可以通过Unity 生成UnityFramework静态库包含到项目中进行实现。
Unity 从2019.3 开始支持将 Unity 运行时组件集成到原生平台项目中,从而将Unity 静态库用于其他应用程序中。
这样就可以以嵌入的方式让APP使用 3D 或 2D 实时渲染的内容,例如 AR 体验、与 3D 模型交互、2D 迷你游戏等。
Unity 静态库提供了多种方法来管理如何在原生应用程序中加载、激活和卸载Unity3DPlayer。
以下平台目前支持Unity 用作库:Android,iOS,Windows 和通用 Windows 平台。

使用Unity构建iOS工程
先使用 Unity 构建 一个Xcode 项目,然后制作iOS静态库。
每个 Unity iOS Xcode 项目具有以下结构:
UnityFramework 部分,其中包含源、插件和相关框架。它还生成 UnityFramework.framework 文件。
Unity-iPhone 部分,其中包含应用程序需要的资源数据和运行库。Unity-iPhone Target对 UnityFramework 具有单一依赖关系,所以直接运行Unity-iPhone,构建出UnityFramework 。
要将 Unity 集成到另一个 Xcode 项目中,可以通过将 UnityFramework.framework 文件添加到原生 Xcode 项目的应用程序 (Application) 的依赖库中,并设置成嵌入 (Embedded Binaries) 。完成此操作后,可以使用 UnityFramework 类来控制 Unity 运行时。

可通过 UnityFramework Objective-C 类(该类是 UnityFramework.framework 的主体类)的实例来控制 Unity 运行时:
UnityFramework提供了一系列的方法,举例如下:
+ (UnityFramework*)getInstance; 单例类方法,可将实例返回到 UnityFramework。
- (UnityAppController*)appController; 返回 UIApplicationDelegate 的 UnityAppController 子类。这是原生端的根 Unity 类,可以访问应用程序的视图相关对象,例如 UIView、UIViewControllers、CADisplayLink 或 DisplayConnection。
- (void)setDataBundleId:(const char*)bundleId; 设置捆绑包,Unity 运行时应在其中查找 Data 文件夹。有关更多信息,请参阅 Data 文件夹的相关文档。应在调用 runUIApplicationMainWithArgc 或 runEmbeddedWithArgc 之前调用此方法。
- (void)runUIApplicationMainWithArgc:(int)argc argv:(char*[])argv; 从没有其他视图的主要方法中运行 Unity 的默认方式。
 
制作iOS静态库
1.先创建一个UnityCallNative类,可以在iOS项目中创建。
UnityCallNative.h中定义声明一个供unity调用原生的方法,注意这里的方法定义必须使用C语法。
UnityCallNative.m中实现.h中定义的接口,注意实现的地方是除@implementation-end只外的地方,也就是直接把@implementation-end以及中间的内容都删除,然后使用C语言来实现,C语言的调用部分可以使用OC实现。
比如:
UnityCallNative.h文件声明方法
extern "C" 
void outputAppendString("test1", "test2");
UnityCallNative.m文件实现方法
void outputAppendString(string str1, string str2) 
....
2.将完成后的UnityCallNative类添加到Unity项目中
在Unity的Project/Asserts/Plugins/ios/目录下添加这2个文件。
3.通过Unity项目File-Buile Settings-iOS-Build 重新构建出新的Unity-iPhone项目
4.把Data资源文件夹,UnityCallNative.h 的Target MemberShips 设置到UnityFromework下(打勾),同时把UnityCallNative.h作用域设置成public
5.构建UnityFramework工程,生成静态库
6.把UnityFramework静态库导入到iOS工程中,同时在General-Libaray,Frameworkd设置成Embed&Sign

Unity3D与iOS原生交互
Unity3D调iOS
1.在Unity的脚本文件中使用原生项目暴露的方法
Unit3D中新建一个脚本文件,引入交互服务。
using System.Runtime.InteropServices;
 
public class ChangeLabel : MonoBehaviour

[DllImport("__Internal")]
static extern void outputAppendString(string str1, string str2); // 声明ios原生定义的C方法
 
void Start() 
#if UNITY_IPHONE
outputAppendString("test1", "test2"); // 调用ios原生定义的C方法
#endif

iOS原生调用Unity3D
原生调Unity3D通过下面这一句函数就够了。
举个例子 : 
UnitySendMessage("UIChargeMoneyPage", "callback", "0");
在UnityInterface.h声明中声明了下面的函数
UnitySendMessage(const char * GameObjectName, const char *methodName, const char *msg);
GameObjectName: Unity场景中的游戏对象
methodName: 游戏对象下绑定的脚本中的函数名
msg:函数的参数

另外:

UnityInterface.h文件是Unity导出的iOS项目中包含的。
在发送消息到Unity前,要确保成功导入了UnityInterface.h文件。
 

参考文章:
https://docs.unity3d.com/cn/2021.1/Manual/UnityasaLibrary-iOS.html
https://juejin.cn/post/6844903933790388231
https://blog.51cto.com/myselfdream/2559580
https://blog.51cto.com/myselfdream/2559599
https://blog.csdn.net/weixin_42714258/article/details/122454019

将谷歌分析集成到 iOS 应用程序中

【中文标题】将谷歌分析集成到 iOS 应用程序中【英文标题】:Integrating google analytics into iOS app 【发布时间】:2016-03-28 20:34:08 【问题描述】:

我正在按照此处的说明将谷歌分析集成到我的应用中:https://developers.google.com/analytics/devguides/collection/ios/v3/?ver=swift#get-config

我需要为我的应用初始化分析。我在我的 AppDelegate.swift 文件中添加了这段代码:

import UIKit
import <Google/Analytics.h>

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate 

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions:[NSObject: AnyObject]?) -> Bool 
        **// Configure tracker from GoogleService-Info.plist.
        NSError *configureError;
        [[GGLContext sharedInstance] configureWithError:&configureError];
        NSAssert(!configureError, @"Error configuring Google services: %@", configureError);

        // Optional: configure GAI options.
        GAI *gai = [GAI sharedInstance];
        gai.trackUncaughtExceptions = YES;  // report uncaught exceptions
        gai.logger.logLevel = kGAILogLevelVerbose;  // remove before app release**

    

我收到以下错误消息。

    对于我的import &lt;Google/Analytics.h&gt; 行,我收到以下消息:'一行上的连续语句必须用';'分隔。

    对于其余的代码,我遇到了几个错误,尽管我只是将教程中的代码复制到我的文件中。看我的截图。

enter image description here

【问题讨论】:

你不能把objective-c代码放到你的swift文件中 【参考方案1】:

您在 Swift 项目中遇到此问题。您需要创建一个 Objective-C 桥接头,并在其中添加 import 语句。之后,一切都应该正常工作。查看此 SO 答案以了解更多详细信息:

https://***.com/a/24005242/1784384

【讨论】:

感谢您的回复。我创建了 Objective-C 文件作为 Header 并将 import 添加到 m 文件中。现在我在 Objective-CBridgingHeader.m 文件上收到一条错误消息,上面写着:'Expected identify or '('。此外,我仍然在我的 AppDelegate.swift 文件中看到与我粘贴的代码相同的错误在之前。 桥接头文件应该是.h文件;确保你把它放在那里。另外:您的代码在 AppDelegate 中失败,因为您在其中粘贴了 Objective-C 代码。在您在 Google 网站上的链接中,有一个框可让您将其更改为 Swift 示例代码。这样做,你应该是金子! 好的,所以我将这行代码“导入 ”移动到我的 .h 文件中。我还更新了 AppDelegate 文件中的代码。最初我在教程中选择了 Swift 单选按钮,但我猜它切换了,或者我在没有注意到的情况下重新打开了一个新页面。无论如何,情况正在好转。我没有看到错误消息。 我的意思是我将导入代码添加到我的 Bridging-Header.h 文件中。我是否必须按照您发送给我的 *** 响应 (***.com/a/24005242/1784384) 中的指示创建第二个 .h 文件? 我很难想象你在问什么。但是您应该能够删除您创建的 .m 和 .h 文件,并保留桥接头。添加 Obj-C 代码时会自动创建桥接头,但在使用 Cocoapods 时不会检测到它。这就是为什么你必须经历这个奇怪的过程。

以上是关于集成Unity3D到iOS应用程序中的主要内容,如果未能解决你的问题,请参考以下文章

iOS/Unity3D/Pushwoosh:配置文件没有 APS 条目

将 Unity3D 与 ZXing 集成

音频队列:AudioQueueStart 返回 -50

Unity3d 集成Firebase新中文教程

Android项目实战(三十九):Android集成Unity3D项目(图文详解)

Unity3D开发之——海康威视摄像机SDK集成