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閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容