$ npm install @wowmaking/react-native-unity --save
- Install package via
npm - Move your Unity project to
unityfolder at project root
- Add following line at your
unity/Packages/manifest.json{..."com.wowmaking.react-native-unity": "file:../../node_modules/@wowmaking/react-native-unity/unity" } - Right-click at you
Hierarchymenu, then clickCreate Empty, rename new game object (example:UICommandsDelegate). IMPORTANT! Remember the name of new game object, that needed to initialize JavaScript lib. - Add script
RNCommadsDelegate.csto new game object (step 2) (location:Packages/react-native-unity/Runtime/Scripts) - To receive commands from JavaScript, you must create another game object, or use existing. Commands receiver object must implements
IRNCommandsReceiverinterfaceusingWowmaking.RNU; publicclassNewGameObject : MonoBehaviour, IRNCommandsReceiver{... }
- Set your object as commands receiver to
RNBridgeonAwakeusingWowmaking.RNU; publicclassNewGameObject : MonoBehaviour, IRNCommandsReceiver{privatevoidAwake(){RNBridge.SetCommandsReceiver(this)} }
- Implement
IRNCommandsReceiverinterface by addingHandleCommandmethodIMPORTANT! CallusingWowmaking.RNU; publicclassNewGameObject : MonoBehaviour, IRNCommandsReceiver{privatevoidAwake(){RNBridge.SetCommandsReceiver(this)} publicvoidHandleCommand(RNCommandcommand){switch (command.name){// command.Resolve(new{}) || command.Reject(new{}) } } }
ResolveorRejectmethod of receivedRNCommandinstance to remove it from JavaScript thread
If you want to test your app at xcode simulator, you need following next steps:
- Go to
Menu->Edit->Project setings...->Player->iOS->Other Settings - Remove check from
Auto Graphics API - Add
OpenGLES3toGraphics APIslist by clicking+ - Find
Target SDKsetting and selectSimulator SDK
You ready to debug your app at simulator!
- Run
pod install - Add
RNUProxy.xcodeprojto your workspace:Menu->File->Add Files to [workspace_name]...->[project_root]/node_modules/@wowmaking/react-native-unity/ios/RNUProxy/RNUProxy.xcodeproj - 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.frameworktoEmbedded Binaries: - Add following lines to your project
main.mfile (located at same folder withAppDelegate)
#import<UIKit/UIKit.h> +++ #import <RNUnity/RNUnity.h> #import"AppDelegate.h"intmain(int argc, char * argv[]){@autoreleasepool{+++ [RNUnity setArgc:argc]; +++ [RNUnity setArgv:argv]; returnUIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))} }- Add following lines to your project
AppDelegate.mfile
#import"AppDelegate.h" #import<React/RCTBridge.h> #import<React/RCTBundleURLProvider.h> #import<React/RCTRootView.h> +++ #import <RNUnity/RNUnity.h> @implementationAppDelegate - (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions{+++ [RNUnity launchWithOptions:launchOptions]; // IMPORTANT to add this before react view creation RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:selflaunchOptions:launchOptions]; ... } +++ - (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]} @end- In
AppDelegate.mfile make background color of React root view transparent
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0fgreen:1.0fblue:1.0falpha:0];- Add
RNUProxyandUnityFrameworkto your project scheme. Select your project scheme ->Edit scheme...->Build-> Click+-> SelectRNUProxy/UnityFrameworkfrom list -> moveUnityFrameworkbefore your app (drag and drop) andRNUProxybeforeUnityFramework
- 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=newFile('..\\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")
- Change parent activity in
MainActivity.javafromReactActivitytoUnityReactActivityimportcom.wowmaking.rnunity.UnityReactActivity; publicclassMainActivityextendsUnityReactActivity{... }
- Add strings to
res/values/strings.xml<stringname="game_view_content_description">Game view</string> <stringname="unity_root">unity_root</string>
- Update
.MainActivityintoAndroidManifest.xml<activityandroid:name=".MainActivity" ... android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"android:hardwareAccelerated="true"android:launchMode="singleTask" >
- Setup
minSdkVersiongreater than or equal to19 - Remove
<intent-filter>...</intent-filter>from AndroidManifest.xml at unityLibrary to leave only integrated version.
import{Unity,UnityResponderView}from'@wowmaking/react-native-unity';// Don't forget to initialize with name of GameObject, that you create at `Unity`->`Step 2`Unity.init('UICommandsDelegate');constApp=()=>{return(<View> <!-- UnityResponderView provide all touch events to Unity --> <UnityResponderView/><TouchableonPress={()=>Unity.execCommand('command_name',{/* any specific command data */})}>Press ME!</Touchable></View>);};init- initializereact-native-unitylib Params:delegateName(string) - name of Unity GameObject, that was created atUnity->Step 2
Usage:
Unity.init('UICommandsDelegate');
execCommand- send command to Unity Params:name(string) - Unity command namedata(Object, optional) - Unity command data
Return
PromiseUsage:Unity.execCommand('command_name',{a: 1,b: 'b',})
addEventListener- add listener of Unity events Params: -type(string) - type of Unity event -listener(function) - function, that's calling on Unity event receivingUsage:
Unity.addEventListener('event_type',(e)=>{console.warn(e);});
removeEventListener- remove Unity event listener Params: -type(string) - type of Unity event -listener(function) - specific listener to removeUsage:
Unity.addEventListener('event_type',listener});
void HandleCommand(RNCommand command)- method, that calls from JavaScript Params:command(RNCommand) - command object, received from JavaScript
name(string) - name of received commanddata('object') - data of received command
Resolve- invoke on successful command execution Params:data(object, optional) - object, that will receive JavaScript
Usage:
command.Resolve(new{text="test", });
Reject- invoke on unsuccessful command execution Params:data(object, optional) - object, that will receive JavaScript
Usage:
command.Reject(new{text="test", });
SetCommandsReceiver- set commands reveiver to bridge Params:cReceiver(IRNCommandsReceiver) - game object, that implements IRNCommandsReceiver interface
Usage:
privatevoidAwake(){RNBridge.SetCommandsReceiver(this)}
SendEvent- send event to JavaScript Params:name(string) - event name, that receive JavaScriptdata(object) - data object, that receive JavaScript listeners