해당 게시글은 M1 mac 기준으로 작성되었습니다.
사용 라이브러리 : react-native-unity-play
url : https://www.npmjs.com/package/react-native-unity-play/v/0.1.6
사용 라이브러리 : @azesmway/react-native-unity
url : https://github.com/azesmway/react-native-unity
RN version : 0.68.2
android는 에뮬레이터로 가능하지만 ios는 실제기기가 있어야만 동작합니다.
unity project export 설정
해당 unity 프로젝트 빌드 파일은 rn root 폴더에 unity라는 이름으로 경로를 만들어준 후 복사붙여넣기 하면 됨
react native project 설정
npm install react-native-unity-play --force
android/app/libs 디렉토리 만들기
라이브러리 설정 파일 옮기기
<project_name>/unity/builds/android/unityLibrary/libs/*
-> android/app/libs
android/app/build.gralde에 ndk 코드 넣기
defaultConfig {
...
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
4.android/settings/gradle에 코드 넣기
include ':unityLibrary'
project(':unityLibrary').projectDir=new File('../unity/unityLibrary')
두번째 줄은 본인의 경로에 맞춰서 집어넣으면 됩니다.
implementation project(':unityLibrary')
implementation files("${project(':unityLibrary').projectDir}/libs/unity-classes.jar")
<string name="game_view_content_description">Game view</string>
<string name="unity_root">unity_root</string>
<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"
>
<intent-filter>...</intent-filter>
unityStreamingAssets=.unity3d
10.build.gralde에 코드추가하기
allprojects {
repositories {
flatDir {
dirs "$rootDir/app/libs"
}
import { StyleSheet, View, Dimensions, Button, Platform, Text } from "react-native";
import UnityView, {
UnityModule,
UnityResponderView,
} from 'react-native-unity-play';
import { useState } from "react";
const {width, height} = Dimensions.get('window');
const App = () => {
return (
<>
<View>
<Text>RNPROJECT</Text>
<UnityView
fullScreen={true}
style={{width: width, height: height}}
/>
</View>
</>
);
};
export default App;
android/local.properties에 ndk 경로 지정
필자는 unityhub의 ndk 경로를 지정해주어서 해결함
unity/unityLibrary/build.gradle BuildIl2Cpp 함수 부분 코드
def BuildIl2Cpp(String workingDir, String targetDirectory, String architecture, String abi, String configuration) {
exec {
commandLine(workingDir + "/src/main/Il2CppOutputProject/IL2CPP/build/deploy/netcoreapp3.1/il2cpp",
"--compile-cpp",
"--avoid-dynamic-library-copy",
"--profiler-report",
"--libil2cpp-static",
"--platform=Android",
"--architecture=" + architecture,
"--configuration=" + configuration,
"--outputpath=" + workingDir + targetDirectory + abi + "/libil2cpp.so",
"--cachedirectory=" + workingDir + "/build/il2cpp_"+ abi + "_" + configuration + "/il2cpp_cache",
"--additional-include-directories=" + workingDir + "/src/main/Il2CppOutputProject/IL2CPP/external/bdwgc/include",
"--additional-include-directories=" + workingDir + "/src/main/Il2CppOutputProject/IL2CPP/libil2cpp/include",
"--tool-chain-path=" + android.ndkDirectory,
"--map-file-parser=" + workingDir + "/src/main/Il2CppOutputProject/IL2CPP/MapFileParser/MapFileParser.exe",
"--generatedcppdir=" + workingDir + "/src/main/Il2CppOutputProject/Source/il2cppOutput",
"--baselib-directory=" + workingDir + "/src/main/jniStaticLibs/" + abi,
"--dotnetprofile=unityaot")
environment "ANDROID_SDK_ROOT", getSdkDir()
}
delete workingDir + targetDirectory + abi + "/libil2cpp.sym.so"
ant.move(file: workingDir + targetDirectory + abi + "/libil2cpp.dbg.so", tofile: workingDir + "/symbols/" + abi + "/libil2cpp.so")
}
jcenter없어짐으로 인한 오류
node_modules/react-native-unity-play/android/build.gradle에서 변경
repositories {
mavenCentral()
//jcenter()
maven { url "https://maven.google.com" }
}
unity project export 설정
Player Settings -> Strip Engine Code -> 체크 해제
해당 unity 프로젝트 빌드 파일은 rn root 폴더에 unity/builds/ios 라는 이름으로 경로를 만들어준 후 복사붙여넣기 하면 됨
yarn add @azesmway/react-native-unity
cd ios
pod install
이후에 xcode로 project 열기
Libraries/Plugins/iOS의 NativeCallProxy.h Target Membership -> project에서 Public으로 변경
만약 해당 경로가 없다면 새로 추가하여 해당 파일을 넣어줘야함
프로젝트 루트클릭 후 General -> Framework, Libraries, and Embedded Content에 UnityFramework.framework 추가
Project -> scheme -> Edit scheme 에 UnityFramework 추가 후 Build Order Manual Order로 변경
UnityFramework가 먼저 빌드되어야 함
예제 코드
import { StyleSheet, View, Dimensions, Button, Platform, Text } from "react-native";
import UnityView from '@azesmway/react-native-unity';
const {width, height} = Dimensions.get('window');
const App = () => {
return (
<>
<View>
<Text>RNPROJECT</Text>
<UnityView
style={{width: width, height: height}}
/>
</View>
</>
);
};
export default App;
nativeCallProxy.h파일을 public으로 설정해야함
해당 부분에 추가되어있는지 체크
nativeCallProxy.h,nativeCallProxy.m 파일
참고 링크 : https://github.com/azesmway/react-native-unity
https://www.npmjs.com/package/react-native-unity-play/v/0.1.6
안녕하세요 혹시 유니티 프로젝트와 rn 프로젝트 명이 같아야할까요 ?
혹시 유니티 버전은 몇버전 사용하셨는지 알 수있을까요.. 감사합니다.