react-native-unity-play v0.1.6
react-native-unity-play
Thanks to two projects react-native-unity and react-native-unity-view
I collected and modified the code that allows you to embed a UNITY project into the react native as a full-fledged component
Getting started
$ npm install react-native-unity-play --save
Before build project in Unity
UNITY VERSION >= 2020.x
iOS
UNITY PLAYER SETTINGS
Multitasking->Requires Fullscreen-> no selection set !Status Bar->Status Bar Hidden-> no selection set !
Android
BUILD SETTINGS
1. Export project -> selection set !
UNITY PLAYER SETTINGS
1. Resolution and Presentation -> Start in fullscreen mode -> no selection set !
2. Resolution and Presentation -> Render outside safe area -> no selection set !
Installation
- Install package via
npm - Move your Unity project to
unityfolder at project root
iOS
- Run
pod install - Build Unity app to
[project_root]/unity/builds/ios - Add
Unity-iPhone.xcodeprojto your workspace:Menu->File->Add Files to [workspace_name]...->[project_root]/unity/builds/ios/Unity-iPhone.xcodeproj Add
UnityFramework.frameworktoFrameworks, Libraries, and Embedded Content:- select
your_apptarget in workspace - in
General/Frameworks, Libraries, and Embedded Contentpress+ - select
Unity-iPhone/Products/UnityFramework.framework - in
Build PhasesremoveUnityFramework.frameworkfromLinked Frameworks and Libraries( select it and press-) - in
Build PhasesmoveEmbedded FrameworksbeforeCompile Sources( drag and drop )
- select
Add following lines to your project main.m file (located at same folder with AppDelegate)
#import <UIKit/UIKit.h>
+++ #import <RNUnity/RNUnity.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
+++ [RNUnity setArgc:argc];
+++ [RNUnity setArgv:argv];
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}Add following lines to your project AppDelegate.m file
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
+++ #import <RNUnity/RNUnity.h>
+++ - (void)applicationWillResignActive:(UIApplication *)application { [[[RNUnity ufw] appController] applicationWillResignActive: application]; }
+++ - (void)applicationDidEnterBackground:(UIApplication *)application { [[[RNUnity ufw] appController] applicationDidEnterBackground: application]; }
+++ - (void)applicationWillEnterForeground:(UIApplication *)application { [[[RNUnity ufw] appController] applicationWillEnterForeground: application]; }
+++ - (void)applicationDidBecomeActive:(UIApplication *)application { [[[RNUnity ufw] appController] applicationDidBecomeActive: application]; }
+++ - (void)applicationWillTerminate:(UIApplication *)application { [[[RNUnity ufw] appController] applicationWillTerminate: application]; }
@endAndroid
Create directory into
android/app/libsCopy libs from
<project_name>/unity/builds/android/unityLibrary/libs/*toandroid/app/libs- Add ndk support into
android/app/build.gradledefaultConfig { ... ndk { abiFilters "armeabi-v7a", "arm64-v8a" } } - Append the following lines to
android/settings.gradle:include ':unityLibrary' project(':unityLibrary').projectDir=new File('..\\unity\\builds\\android\\unityLibrary') - Insert the following lines inside the dependencies block in
android/app/build.gradle:implementation project(':unityLibrary') implementation files("${project(':unityLibrary').projectDir}/libs/unity-classes.jar") Add strings to
res/values/strings.xml<string name="game_view_content_description">Game view</string> <string name="unity_root">unity_root</string>Update
.MainActivityintoAndroidManifest.xml<application ... android:extractNativeLibs="true" <activity android:name=".MainActivity" ... android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="true" >Setup
minSdkVersiongreater than or equal to21Remove
<intent-filter>...</intent-filter>from<project_name>/unity/builds/android/unityLibrary/src/main/AndroidManifest.xmlat unityLibrary to leave only integrated version.Add to
android/gradle.propertiesunityStreamingAssets=.unity3dAdd to
build.gradleallprojects { repositories { flatDir { dirs "$rootDir/app/libs" }<project_name>/unity/builds/android/unityLibrary/src/main/AndroidManifest.xmldeleteandroid:icon="@mipmap/app_icon"andandroid:theme="@style/UnityThemeSelector"if they are installed
Usage
import { StyleSheet, View, Dimensions, Button, } from 'react-native';
import UnityView, {
UnityModule,
UnityResponderView,
} from 'react-native-unity-play';
const {width, height} = Dimensions.get('window');
const App: () => Node = () => {
const [isVisible, setVisible] = useState(false);
let unityElement
if (Platform.OS === 'android') {
unityElement = (
<UnityView style={{flex: 1}} />
);
} else {
unityElement = (
<UnityResponderView
fullScreen={true}
style={{width: width, height: height}}
/>
);
}
return (
<View>
{!isVisible && (
<Button title={'Start'} onPress={() => setVisible(true)} />
)}
{isVisible && (
<>
{unityElement}
<View
style={{
position: 'absolute',
top: 45,
left: 20,
zIndex: 2,
}}>
<Button
title={'Close'}
onPress={() => {
if (Platform.OS === 'android') {
UnityModule.quit();
}
setVisible(false);
}}
style={{color: '#fff'}}
/>
</View>
</>
)}
</View>
);
};