本文一反常态,目标是把u3d工程以framewWork形式 内嵌原生IOS项目

1、xcode中新建Cocoa Touch FrameWork。取名u3dFrameWork

2、把u3d导出的xcode中,Class、Library 拷贝到u3dFrameWork 中 采用

 方式引入

从library中移除掉libil2cpp

3 以下头文件移动到public

4、Build Phases 下头文件引用中 移除RegisterMonoModules.h   compile sources 中移除main.mm 和RegisterMonoModules.cpp

5、配置修改

  1. Build Settings -> Header Search Paths: $(inherited) "$(SRCROOT)/Classes" "$(SRCROOT)" $(SRCROOT)/Classes/Native $(SRCROOT)/Libraries/bdwgc/include $(SRCROOT)/Libraries/libil2cpp/include
  2. Build Settings -> Library Search Paths: $(inherited) "$(SRCROOT)" "$(SRCROOT)/Libraries"
  3. Build Settings -> Prefix Header: Classes/Prefix.pch
  4. Build Settings -> Mismatched Return Type: Yes
  5. Build Settings -> Enable C++ Exceptions: Yes
  6. Build Settings -> Other Linker Flags: $(inherited) -weak_framework CoreMotion -weak-lSystem
  7. Build Settings -> Mach-O Type: Static Library
  8. Build Settings ->Other C Flags -> $(inherited) -DINIT_SCRIPTING_BACKEND=1 -fno-strict-overflow -DRUNTIME_IL2CPP=1
  9. Build Settings -> Build Avtive Achitecture Only: No

6 u3dFramework.h添加文件引用

  #import <u3dFramework/UnityAppController.h>

  #import <u3dFramework/UnityController.h>

  #import <u3dFramework/RenderPluginDelegate.h>

  #import <u3dFramework/UnityInterface.h>

  #import <u3dFramework/UnityRendering.h>

  #import <u3dFramework/RegisterFeatures.h>

  #import <u3dFramework/UnityForwardDecls.h>

  #import <u3dFramework/LifeCycleListener.h>

7、

新建UnityController.h****************************

#import <Foundation/Foundation.h>

#import "UnityAppController.h"

@interface UnityController:UnityAppController

@property (nonatomic, readonly, weak) UIView *playView;  /* 展示Unity的view */

+ (instancetype)instance;

- (void)initUnity;

- (void)pauseUnity;

- (void)startUnity;

- (BOOL)isPaused;

@end

新建UnityController.mm************************

#import "UnityController.h"

#import "UnityAppController.h"

#import "DisplayManager.h"

#import "UnityView.h"

#import "UnityAppController+ViewHandling.h"

#import "UnityAppController+Rendering.h"

@interface UnityController()

@property (nonatomic, assign) BOOL isInitUnity;

@end

@implementation UnityController

+ (instancetype)instance {

return (UnityController *)[[UIApplication sharedApplication] valueForKeyPath:@"delegate.unityController"];

}

- (instancetype)init

{

self = [super init];

if (self) {

self.isInitUnity = NO;

// 注册Unity的事件

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];

}

return self;

}

- (UIView *)playView {

return self.unityView;

}

static const int constsection = 0;

- (void)initUnity {

if (!self.isInitUnity) {

if ([UIDevice currentDevice].generatesDeviceOrientationNotifications == NO)

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath] UTF8String]);

[self selectRenderingAPI];

[UnityRenderingView InitializeForAPI: self.renderingAPI];

_window = nil;

_unityView      = [self createUnityView];

[DisplayManager Initialize];

_mainDisplay    = [DisplayManager Instance].mainDisplay;

[_mainDisplay createWithWindow: _window andView: _unityView];

[super applicationDidBecomeActive:[UIApplication sharedApplication]];

self.isInitUnity = YES;

}

}

- (void)pauseUnity {

//[self applicationWillResignActive:[UIApplication sharedApplication]];

UnityPause(1);

}

- (void)startUnity {

//[self applicationDidBecomeActive:[UIApplication sharedApplication]];

UnityPause(0);

}

- (BOOL)isPaused {

if (UnityIsPaused() == 1) {

return YES;

}

else {

return NO;

}

}

- (void)appWillEnterForeground:(NSNotification *)notification {

[self applicationWillEnterForeground:[UIApplication sharedApplication]];

}

- (void)appDidBecomeActive:(NSNotification *)notification {

if (nil == self.unityView) {

return;

}

[self applicationDidBecomeActive:[UIApplication sharedApplication]];

}

- (void)appWillResignActive:(NSNotification *)notification {

[self applicationWillResignActive:[UIApplication sharedApplication]];

}

- (void)appWillTerminate:(NSNotification *)notification {

[self applicationWillTerminate:[UIApplication sharedApplication]];

}

- (void)appDidReceiveMemoryWarning:(NSNotification *)notification {

[self applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];

}

@end

UnityAppController.h做如下修改******************************

inline UnityAppController* GetAppController()

{

return (UnityAppController *)[[UIApplication sharedApplication] valueForKeyPath:@"delegate.unityController"];

}

二 新建ios原生工程

新建sdk文件夹。将上歩FrameWork和Libraries放入sdk中。Libraries中保留libiPhone-lib.a  libil2cpp.a  libil2cpp   引入sdk文件夹

拷贝u3d工程中Data文件夹 引入工程

Build Settings -> Header Search Paths:$(PROJECT_DIR)/sdk/Libraries/libil2cpp/include

Build Settings -> Library Search Paths: $(inherited) $(PROJECT_DIR)/sdk/Libraries

Build Settings -> Other Linker Flags:-force_load "$(PROJECT_DIR)/sdk/u3dFramework.framework/u3dFramework"

AppDelegate.m做如下修改

#import "AppDelegate.h"

#import <u3dFramework/u3dFramework.h>

@interface AppDelegate ()

@property(strong,nonatomic) UnityController *unityController;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

if (_unityController == nil)

_unityController = [[UnityController alloc] init];

return YES;

}

ViewController.m做如下操作******************************

#import "ViewController.h"

#import <u3dFramework/u3dFramework.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

button.frame = CGRectMake(60, 60, 80, 40);

[button setTitle:@"开启Unity" forState:UIControlStateNormal];

[self.view addSubview:button];

[button addTarget:self action:@selector(clickHandler:) forControlEvents:UIControlEventTouchUpInside];

UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

button1.frame = CGRectMake(160, 60, 80, 40);

[button1 setTitle:@"暂停Unity" forState:UIControlStateNormal];

[self.view addSubview:button1];

[button1 addTarget:self action:@selector(clickHandler1:) forControlEvents:UIControlEventTouchUpInside];

// 供Unity显示的View

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 150, 300, 300)];

[view setBackgroundColor:[UIColor grayColor]];

[view setTag:22];

[self.view addSubview:view];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (void) clickHandler:(id)sender

{

[[UnityController instance] initUnity];

[UnityController instance].playView.frame = [self.view viewWithTag:22].bounds;

[[self.view viewWithTag:22] addSubview:[UnityController instance].playView];

}

- (void) clickHandler1:(id)sender

{

if ([[UnityController instance] isPaused]) {

[[UnityController instance] startUnity];

}

else {

[[UnityController instance] pauseUnity];

}

}

@end

 

ios原生项目内嵌u3d工程的更多相关文章

  1. iOS原生项目中集成React Native

    1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...

  2. iOS原生项目集成React Native模块

    今天周末,弄弄Native和React Native之间的交互.首先,先在iOS原生项目中集成React Native模块: 注意事项: 1.因为react native的版本问题,部分细节可能有所不 ...

  3. iOS 建立项目过滤机制 —— 给工程添加忽略文件.gitignore

        目前iOS 项目 主要忽略 临时文件.配置文件.或者生成文件等,在不同开发端这些文件会大有不同,如果 git add .把这些文件都push到远程, 就会造成不同开发端频繁改动和提交的问题. ...

  4. cocos2d导入iOS原生项目

    最近公司最新发下任务让融合一个cocos2dx写的游戏项目融合进现有项目,当看到要求时内心瞬间无数羊驼奔腾.------ 虽说内心是拒绝的,但是任务已经派发就必须要完成啊.所以在网上搜了大量的融入教程 ...

  5. ios下app内嵌h5页面是video适配问题

    ios下做新闻详情用h5页面实现然后打包到app中,其中新闻详情页会有视频,安卓下video的poster可以做到适应video大小,但是ios下会按照poster图片大小将video等比撑大,但是视 ...

  6. React Native项目集成iOS原生模块

    今天学习一下怎么在React Native项目中集成iOS原生模块,道理和在iOS原生项目中集成React Native模块类似.他们的界面跳转靠的都是iOS原生的UINavigationContro ...

  7. React Native与原生项目连接与发布

    前面的各种环境配置按照官方文档一步一步来,挺详细,宝宝在这里就不多说废话了. 其次,前面的配置,我参照的这个博主的文章React Native 集成到iOS原生项目 下面是宝宝掉过的坑(半径15M): ...

  8. iOS原生混合RN开发最佳实践

    iOS原生混合RN开发详解 做过原生iOS开发或者Android开发的同学们肯定也都了解Hybrid,有一些Hybrid的开发经验,目前我们企业开发中运用最广泛的Hybrid App技术就是原生与H5 ...

  9. 查看和指定SpringBoot内嵌Tomcat的版本

    查看当前使用的Tomcat版本号 Maven Repository中查看 比如我们需要查Spring Boot 2.1.4-RELEASE的内嵌Tomcat版本, 可以打开链接: https://mv ...

随机推荐

  1. ironic驱动-IMPITool

    概述 IMPITool驱动是通过ipmitool工具来管理部署节点的,目前主要有两个驱动: agent_ipmitool pxe_ipmitool 配置驱动 要修改ironic支持的驱动需要修改配置文 ...

  2. 最全,可直接用的一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等。

    一些正则校验,判断邮箱,手机号码,车牌号,身份证号,网址,账号,密码,ip,去掉html格式,工商税号等. // 判断邮箱 isValid = [text isValidEmail]; // 判断手机 ...

  3. Mybatis批量插入返回自增主键(转)

    我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:useGenerateKeys和keyProperty. 2.不支持生成自增主键的数据库:< ...

  4. linux之软连接,硬连接篇

    作业四: 1) 建立/etc/passwd的软连接文件,放在/tmp目录下 [root@localhost 桌面]# ln -s /etc/passwd/a.txt /tmp/aa.txt 2) 建立 ...

  5. uploadify Cookie 验证登入上传问题

    上传文件时必须验证是否已登入. 当用FormsAuthentication做登入,使用FormsAuthentication.FormsCookieName进行验证是否已登入即可. <scrip ...

  6. angularJs中怎么模拟jQuery中的this?

    最近自己正在学习angularJs,在学到ng-click时,由于想获取当前点击元素的自身,开始想到了用$index来获取当前元素的索引同样能实现我想要的效果,但是在有些特殊的情况下,使用$index ...

  7. .NET分布式缓存Memcached从入门到实战

    一.课程介绍 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是 ...

  8. .Net转Java.02.数据类型

    .NET中常见的数据类型分类分别是值类型和引用类型 值类型包括(基元类型.struct.枚举) 引用类型包括(类.类.数组.接口.指针) Java分为,基本类型和类   C#   Java   值类型 ...

  9. hive-命令操作记录

    Hive 的官方文档请参考:http://wiki.apache.org/hadoop/Hive/LanguageManual . Create Table CREATE [EXTERNAL] TAB ...

  10. Mac下的Chrome或Safari访问跨域设置,MBP上使用模拟器Simulator.app或iphone+Safari调试网页

    Mac下的Chrome或Safari访问跨域设置: mac下终端启动Chrome $ open -a Google\ Chrome --args --disable-web-security 或 /A ...