React Native集成Unity3D (一)

React Native与Unity3D的集成需要通过原生程序(iOS 、Android)

这里先介绍iOS中的集成:

  1. 首先需要将Unity3D项目导出为iOS项目

  2. Auto Graphic API: 去掉钩,保留OpenGLES2,删除其他

  3. Target Device: 根据需要选择,我这里是默认的iPhone+iPad

  4. Target SDK:一般默认是Device SDK,如果是这个,那么导出之后只能在真机上看效果,我现在是这个,如果你希望能在模拟器上看效果,可以选择Simulator SDK,不过这样你就不能发布了。

  5. Scripting Backend:选择IL2CPP

  6. 导出完成后,就有两个选择了,一个是修改React Native项目生成的iOS程序,一个是修改Unity3D导出的iOS程序。

<div style={"color : red"}>
这里推荐修改Unity3D导出的iOS程序(修改React Native中的iOS程序,需要修改很多的Build Setting项,编译容易出错,非常麻烦)
</div>

修改React Native中的iOS程序

1. 将Unity导出项目里面的Classes、Data、Libraries、MapFileParser、MapFileParser.sh拷贝到ios目录下面去

2. 打开React Native中ios里面的xcode工程,导入Classes和Libraries,导入时选择Create groups(.h不需要导入)

3. 导入Data时,需要选择Create folder reference

4. 设置Xcode的参数:(按照Unity3D导出项目的参数设置)

5. 修改文件

详细请看这里

修改Unity3D导出的iOS程序

  1. 引入 RCT 相关项目工程到 Libraries 目录下(可以使用cocoapods)

  2. Build Setting

// 1. 在 Header search path 下添加路径,类型为 recursive (0.40以下)
$(SRCROOT)/../node_modules/react-native/React   
// react native 0.40 后,命名空间有变化,可能需要引入下面的路径
$(BUILT_PRODUCTS_DIR)/include
// 2. bitcode
enable bitcode : NO
// 3. other linker flag
other linker flag  :   
$(OTHER_LDFLAGS) -weak_framework CoreMotion -weak-lSystem -ObjC -lc++
// 4. DEBUG宏支持,react native打包以此判断是否为离线包
Preprocessor Macros > Debug 里设置 "DEBUG=1"
  1. Build Phases
 // 1. 添加 Run Script
 // 名称为 
 Bundle React Native code and images 
 // 内容填写 
 export NODE_BINARY=node
 ../node_modules/react-native/packager/react-native-xcode.sh
 // 2. Link Binary With Libraries
 添加react native组件库文件,根据需要添加其他库文件
  1. Capabilities
// 根据需要打开功能
HealthKit
Push Notification
  1. 文件修改
// 修改unity3d的UnityAppController.h中(注释为未修改的)
inline UnityAppController* GetAppController(){
//return (UnityAppController*)[[UIApplication sharedApplication].delegate;
  return (UnityAppController*)[[UIApplication sharedApplication]           valueForKeyPath:@"delegate.unityAppController"];
}
// 同时需要修改 main.mm
// 引入文件
#import "AppDelegate.h"
// 修改
const char* AppControllerClassName = "AppDelegate";
// 修改AppDelegate文件,添加 unity3d 的初始化和相关处理
// AppDelegate.h
#import "UnityAppController.h"
@property (nonatomic, strong) UnityAppController *unityAppController;
// AppDelegate.m
  - (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions:  (NSDictionary *)launchOptions{
...
// 添加 unity3d 代码
  BOOL returnBool;
  if (_unityAppController == nil) {
      _unityAppController = [[UnityAppController alloc]init];
  }
  returnBool = [_unityAppController application:application didFinishLaunchingWithOptions:launchOptions];
...
}

#pragma mark - same maeeage to unity
-(void)applicationWillResignActive:(UIApplication *)application{
    [_unityAppController applicationWillResignActive:application];
}
-(void)applicationDidEnterBackground:(UIApplication *)application{
    [_unityAppController applicationDidEnterBackground:application];
}
-(void)applicationWillEnterForeground:(UIApplication *)application{
    [_unityAppController applicationWillEnterForeground:application];
}
-(void)applicationDidBecomeActive:(UIApplication *)application{
    [_unityAppController applicationDidBecomeActive:application];
}
-(void)applicationWillTerminate:(UIApplication *)application{
    [_unityAppController applicationWillTerminate:application];
}

  1. 其他修改
// debug log去除无用信息
  - Xcode menu -> Product -> Edit Scheme -> Arguments
  - Environment Variables -> Add -> Name:   
"OS_ACTIVITY_MODE", Value:"disable"
//
- 调用 C++ 函数的 .m 文件 (使用GetAppController()方法)要改为 .mm
  1. info.plist 添加 View controller-based status bar appearance 为 NO;

  2. react native JS 支持
    创建 UIView类用来显示 unity3d界面,创建react native ViewManager 管理类,使其可以在 JSX 中调用

// RCTUnityView.h
#import <UIKit/UIKit.h>
@interface RCTUnityView : UIView
@property (nonatomic,strong)UIView *uView;
@end
// RCTUnityView.m
#import "RCTUnityView.h"
#import "UnityAppController.h"
@interface RCTUnityView ()
@property (nonatomic,strong) UIView * hide;
@property (nonatomic,strong) NSTimer* timer;
@end
@implementation RCTUnityView
static RCTUnityView * _instance;
-(id)initWithFrame:(CGRect)frame{
  if (!_instance) {
      _instance = [super initWithFrame:frame];
      _instance.uView = (UIView*)GetAppController().unityView;
      _instance.uView.frame = frame;
      [_instance insertSubview:_instance.uView atIndex:0];
  }
  return _instance;
}
@end
// RCTUnityViewManager.h
#import "RCTViewManager.h"
@interface RCTUnityViewManager : RCTViewManager
@end
// RCTUnityViewManager.m
#import "RCTUnityViewManager.h"
#import "RCTUIManager.h"
#import "RCTUnityView.h"
#import "UnityAppController.h"
@implementation RCTUnityViewManager
RCT_EXPORT_MODULE();
@synthesize bridge = _bridge;
  - (UIView *)view{
    return [[RCTUnityView alloc] init] ;
  }
  - (dispatch_queue_t)methodQueue{
    return dispatch_get_main_queue();
  }
@end
// UnityViewNative.js
import React, { Component, PropTypes } from 'react';
import {requireNativeComponent,View,Dimensions} from 'react-native';
const RCTUnityView = 
 requireNativeComponent('RCTUnityView',UnityViewNative);
let  screenWidth = Dimensions.get('window').width;
let  screenHeight = Dimensions.get('window').height;
export default class UnityViewNative extends Component {
  render() {
    return <RCTUnityView 
              style={{width:screenWidth ,height:screenHeight}}    
              {...this.props}
            />
    }
}
  1. 因为 Unity 3D导出项目与原 React Native 项目名称不同,react-native run-ios 会失败,这里需要修改项目的名称,与 React Native 项目相同,Rename 项目之后,发现运行那里仍然没有改变,还是不行,点击 Unity-iphone, 选择 Manager Schemes,删除 Unity-iphone, 再添加一个 name 为项目名称的即可!

可以建立两个target , 方便debug 和 release 使用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容