热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS原生项目通过workspace来集成unity导出的项目

最近公司打算将unity项目集成的iOS原生项目中,网上找了很多文章,大都集成复杂,关键是还不能成功集成。许久,找到了一篇靠谱的文章。和小伙伴摸索了好久终于集成成功。遂

最近公司打算将 unity 项目集成的 iOS 原生项目中,网上找了很多文章,大都集成复杂,关键是还不能成功集成。
许久,找到了一篇靠谱的文章。和小伙伴摸索了好久终于集成成功。遂写此文以供后人日后之用。

1.unity 项目导出iOS 项目

将你自己的 unity 项目或者参考文章中的unity 项目UnityProject按照下面的步骤来导出 iOS 项目。

注意:unity 项目导出 iOS 项目可以有多种方式,这里我们使用的是以 framework 库的方式导出的,不清楚的可以询问 unity 开发的小伙伴。切记!我们摸索的时候就出现过类似坑点!

1.1

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

1.2

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

1.3

打开Menu -> File -> Builds Settings,在此选择并切换平台为iOS。将Unity项目导出 iOS 项目到一个文件夹。导出成功后该文件目录如下:

iOS 原生项目通过 workspace 来集成 unity 导出的项目
unity 导出的 iOS 项目文件目录
2.创建 workspace并添加xcodeproj

workspace允许同时处理多个项目,并结合它们的结果。

2.1

我们打开 Xcode,选择File -> New -> Workspace,创建工作空间integration.xcworkspace,把它保存在integrationProject目录下。并按照下图设置integrationProject目录下的内容,其中NativeiOSAPP为新建的空白的iOS 原生项目,当然你也可以用已有的项目。UnityProject为 unity 导出的 iOS 项目,即 1.3 中导出的那个文件夹。

iOS 原生项目通过 workspace 来集成 unity 导出的项目
1.png
2.2

打开integration.xcworkspace,选择File -> Add Files to “integration”,把NativeiOSAPP.xcodeproj和Unity-iPhone.xcodeproj添加到workspace 中。

iOS 原生项目通过 workspace 来集成 unity 导出的项目
2.png
3.添加UnityFramework.framework

这一步看似简单,实则是一个坑点。通过图 3 图 4直接添加UnityFramework.framework。如果添加后如图 5一样,UnityFramework.framework不是浅白色的就说明添加成功了。

iOS 原生项目通过 workspace 来集成 unity 导出的项目
3.png

iOS 原生项目通过 workspace 来集成 unity 导出的项目
4.png

iOS 原生项目通过 workspace 来集成 unity 导出的项目
5.png

如果是浅白色的话可以尝试接下来的添加方法(我就是通过这种方法添加的)
先如下图找到UnityFramework.framework的位置

iOS 原生项目通过 workspace 来集成 unity 导出的项目
6.png

iOS 原生项目通过 workspace 来集成 unity 导出的项目
7.png

然后将UnityFramework.framework文件夹拖到NativeiOSAPP的目录下

iOS 原生项目通过 workspace 来集成 unity 导出的项目
8.png

成功后如下图

iOS 原生项目通过 workspace 来集成 unity 导出的项目
9.png
4.设置NativeCallProxy.h

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

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

iOS 原生项目通过 workspace 来集成 unity 导出的项目
10.png
5.设置Data文件夹

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

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

iOS 原生项目通过 workspace 来集成 unity 导出的项目
11.png

改动之后Unity-iPhone项目不能正常运行,为了使Unity-iPhone项目能够正常运行,我们需要在Unity-iPhone/MainApp/main.mm中通过下面代码指定Data文件夹所处的新位置。

[ufw setDataBundleId: "com.unity3d.framework"];//com.unity3d.framework是UnityFramework的 bundleID。
iOS 原生项目通过 workspace 来集成 unity 导出的项目
12.png

至此,配置完毕!UnityFramework 也已经集成到 iOS 原生项目中了。此时iOS 原生项目和 unity 导出的 iOS 项目应该都能正常运行了。

6.原生 iOS 项目中调用 unity

这里我们把 main.m改为 main.mm,然后在Main.storyboard中 ViewController 上添加一个按钮,点击跳转到 unity 工程。话不多说,直接上代码。

main.mm

#import 
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    char ** aa = argv;
    [[NSUserDefaults standardUserDefaults] setValue:@(argc) forKey:@"argc"];
    [[NSUserDefaults standardUserDefaults] setValue:[NSString stringWithFormat:@"%p",aa] forKey:@"argv"];
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

AppDelegate.h

#import 
#include 
#include 

@interface AppDelegate : UIResponder 

@property (nonatomic, strong) UIWindow * window;
@property (nonatomic, strong) UnityFramework *ufw;
@end

AppDelegate.h

#import "AppDelegate.h"

@interface AppDelegate ()

@end

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 is not initialized
        [ufw setExecuteHeader: &_mh_execute_header];
    }
    return ufw;
}

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [[NSUserDefaults standardUserDefaults] setValue:launchOptions forKey:@"launchOptions"];
    self.ufw = UnityFrameworkLoad();
    [self.ufw setDataBundleId:"com.unity3d.framework"];
    [self.ufw registerFrameworkListener:self];
    [NSClassFromString(@"FrameworkLibAPI") registerAPIforNativeCalls:self];

    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    [[[self ufw] appController] applicationWillResignActive: application];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
    [[[self ufw] appController] applicationDidEnterBackground: application];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
    [[[self ufw] appController] applicationWillEnterForeground: application];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[[self ufw] appController] applicationDidBecomeActive: application];
}
- (void)applicationWillTerminate:(UIApplication *)application {
    [[[self ufw] appController] applicationWillTerminate: application];
}
- (void)showHostMainWindow:(NSString *)color
{}
@end

ViewController.m

#import "ViewController.h"
#include 
#import "AppDelegate.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
- (IBAction)pushToUnity:(id)sender {
    NSString *argv = [[NSUserDefaults standardUserDefaults] valueForKey:@"argv"];
    char ** aa;
    sscanf([argv cStringUsingEncoding:NSUTF8StringEncoding], "%p",&aa);
    int bb = [[[NSUserDefaults standardUserDefaults] valueForKey:@"argc"] intValue];
    AppDelegate *dd = (AppDelegate *)([UIApplication sharedApplication].delegate);
    [dd.ufw runEmbeddedWithArgc:bb argv:aa appLaunchOpts:[[NSUserDefaults standardUserDefaults] valueForKey:@"launchOptions"]];
}
@end

这样集成就完成了!运行iOS 原生项目就可以跳转至 unity 了。至于iOS 和 unity 之间的通信还在摸索之中。期待我神功大成吧。


推荐阅读
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
  • 如何使用Xcode7软件添加NTL库并运行C++程序。一、首先安装NTL库1、进入“ATourofNTL:ObtainingandInstallingNTLfor ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • Unity3D引擎的体系结构和功能详解
    本文详细介绍了Unity3D引擎的体系结构和功能。Unity3D是一个屡获殊荣的工具,用于创建交互式3D应用程序。它由游戏引擎和编辑器组成,支持C#、Boo和JavaScript脚本编程。该引擎涵盖了声音、图形、物理和网络功能等主题。Unity编辑器具有多语言脚本编辑器和预制装配系统等特点。本文还介绍了Unity的许可证情况。Unity基本功能有限的免费,适用于PC、MAC和Web开发。其他平台或完整的功能集需要购买许可证。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Objective C接入Sonar代码扫描
    目录技术方案环境准备扫描器配置项目配置SonarQube配置jenkins接入一些坑技术方案Sonar本身有对OC的代码扫描插件——SonarCFamily,但是是收费的。出于成本 ... [详细]
author-avatar
mobiledu2502909447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有