@azesmway/反应-本土-团结
允许您将 Unity 工程嵌入 React Natural 作为完整组件的插件 。 插件现在支持新架构.
机器人
请注意! 增加了对团结2023及以上的支持
[大 对于iOS来说,不再需要嵌入一个和Unity一起创建的项目. 只有建筑
UnityFramework已使用。 它应该放在路径的插件文件夹中 -<YOUR_RN_PROJECT>/unity/builds/ios
设备支持 :
| 平台 | 支助 |
|---|---|
| iOS 模拟器 | 备选(参见 iOS 模拟器支持(中文(简体) ) |
| iOS 设备 | ✅ |
| Android 模拟器 | ✅ |
| Android 设备 | ✅ |
IOS 模拟器只使用下面描述的可选 XCF框架导出; 默认设备
UnityFramework.framework不在模拟器上链接.
安装
在您的反应内置工程中安装此软件包 :
npm install @azesmway/react-native-unity
or
yarn add @azesmway/react-native-unity
配置您的团结项目 :
-
复制文件夹的内容
unity到您的团结项目根。 此文件夹包含团结项目所需的脚本和设置 。 您可以在您的反应内置工程中找到这些文件node_modules/@azesmway/react-native-unity/unity。这是确保iOS能够访问NativeCallProxy这个图书馆的课. -
(可选) 如果你跟随这个例子,你可以把以下代码添加到
ButtonBehavior.cs团结计划中的脚本 。 这使得Unity中的按钮按下可以与您的反应-内置应用程序进行通信.
按钮行为.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine.UI;
using UnityEngine;
public class NativeAPI {
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
public static extern void sendMessageToMobileApp(string message);
#endif
}
public class ButtonBehavior : MonoBehaviour
{
public void ButtonPressed()
{
if (Application.platform == RuntimePlatform.Android)
{
using (AndroidJavaClass jc = new AndroidJavaClass("com.azesmwayreactnativeunity.ReactNativeUnityViewManager"))
{
jc.CallStatic("sendMessageToMobileApp", "The button has been tapped!");
}
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
#if UNITY_IOS && !UNITY_EDITOR
NativeAPI.sendMessageToMobileApp("The button has been tapped!");
#endif
}
}
}
导出 iOS 团结工程 :
在你把文件搬走之后 unity 文件夹中,您可以通过这些步骤导出 iOS 统一项目 :
- 打开您的团结项目
- 在任何文件夹中为 ios 构建团结项目 - 只是不是主 RN 项目文件夹! !
- 在 XCode 中打开创建的工程
- 选择数据文件夹并在“目标成员”栏目中设置一个复选框到“团结框架”

- 您需要选择本地CallProxy.h
Unity-iPhone/Libraries/Plugins/iOSunity-iPhone项目的文件夹,并将UnityFramework的目标成员从项目改为公共。 别忘了这个步骤! (如果你在Xcode项目中没有看到这些文件,你没有复制到unity文件夹,在前几个步骤中正确显示团结项目)
- 如果需要 - 在项目上签名
UnityFramework.framework建立一个框架
- 用已建框架打开文件夹( 右键单击) 并移动到插件文件夹( Q)
<YOUR_RN_PROJECT>/unity/builds/ios(中文(简体) )
- 删除您的
Pods在 RN 主工程的根中含有此命令的缓存和锁定文件rm -rf ios/Pods && rm -f ios/Podfile.lock && npx pod-install
机器人
- 打开您的团结项目
- 导出团结应用程序到
<YOUR_RN_PROJECT>/unity/builds/android - 删除
<intent-filter>...</intent-filter>从<YOUR_RN_PROJECT>/unity/builds/android/unityLibrary/src/main/AndroidManifest.xml统一图书馆只保留集成版本.
若用博览相取已. 内置的 expo 插件将处理其余部分 。 如果你不使用博览会,你需要遵循下面的步骤.
-
添加以下行为
android/settings.gradle数字 :include ':unityLibrary' project(':unityLibrary').projectDir=new File('..\\unity\\builds\\android\\unityLibrary') -
添加到
android/build.gradleallprojects { repositories { // this flatDir { dirs "${project(':unityLibrary').projectDir}/libs" } // ... } } -
添加到
android/gradle.propertiesunityStreamingAssets=.unity3d -
添加字符串到
android/app/src/main/res/values/strings.xml<string name="game_view_content_description">Game view</string>
已知问题
- 不使用默认设备唯一框架的iOS模拟器。 见 iOS 模拟器支持( 可选) 用于XCF框架工作.
- 在iOS上,Unity视图正在等待一个尺寸大于0的母体(来自RN侧). 请照顾好这个,因为如果不是,你的应用会随着本地信息崩溃
MTLTextureDescriptor has width of zero。 。 。 .
使用量
样本代码
import React, { useRef, useEffect } from 'react';
import UnityView from '@azesmway/react-native-unity';
import { View } from 'react-native';
interface IMessage {
gameObject: string;
methodName: string;
message: string;
}
const Unity = () => {
const unityRef = useRef<UnityView>(null);
useEffect(() => {
if (unityRef?.current) {
const message: IMessage = {
gameObject: 'gameObject',
methodName: 'methodName',
message: 'message',
};
unityRef.current.postMessage(
message.gameObject,
message.methodName,
message.message
);
}
}, []);
return (
<View style={{ flex: 1 }}>
<UnityView
ref={unityRef}
style={{ flex: 1 }}
onUnityMessage={(result) => {
console.log('onUnityMessage', result.nativeEvent.message);
}}
/>
</View>
);
};
export default Unity;
道具
style: ViewStyle- 统一维尤的风格 (不会在没有维度的Android上出现. 建议给予flex: 1(例如例子)onUnityMessage?: (event: { nativeEvent: { message: string } }) => void- 收到Unity的留言 该有效载荷作为event.nativeEvent.messageonPlayerUnload?: (event) => void- 当Unity玩家被卸下时开火onPlayerQuit?: (event) => void- 统一玩家退出时被解雇androidKeepPlayerMounted?: boolean- 如果设置为真, 即使在包含此内容的视图失去焦点时, 仍保留玩家挂载 。 玩家会被暂停在模糊上并恢复焦点. 仅安地鲁fullScreen?: boolean- 默认为真实。 如果设置为虚假, 将不会请求全屏访问 . 仅安地鲁
方法
postMessage(gameObject, methodName, message)- 向统一军发出信息. 给监督厅: 使用本土的统一方法发送信息sendMessageToGOWithName:(const char*)goName functionName:(const char*)name message:(const char*)msg;中,可以在 文档unloadUnity()- 当反应-内在组件被卸载时,团结会自动卸载,但如果想要卸载团结,可以使用这种方法pauseUnity(pause: boolean)- 暂停(true或恢复(false团结玩家resumeUnity()- 暂停后恢复团结播放器windowFocusChanged(hasFocus: boolean = true)- 模拟焦点变化(打算在重载Unity视图后用于从黑屏幕中恢复(不渲染))resumeUnity无效) 仅安地鲁
捐款
见 贡献指南 学习如何为储存库和发展工作流程作出贡献.
许可证
麻省理工学院
iOS 模拟器支持( 可选)
经典的销售商设置一个设备 UnityFramework.framework,这就是为什么
支持表格将 iOS 模拟器列为不支持的: 模拟器构建失败连接
设备- arm64 dylib. 团结本身可以瞄准模拟器——将两片都打入一个
XCF框架和插件自动取出:
- 在Unity中,导出 iOS 项目两次:一次 目标SDK:设备SDK 一次 与 目标 SDK:模拟器 SDK (Player设置 → iOS → 目标 SDK).
- 构建
UnityFramework从每个导出并创建 XCF 框架 :
xcodebuild -project device-export/Unity-iPhone.xcodeproj -scheme UnityFramework \
-configuration Release -sdk iphoneos BUILD_DIR="$PWD/device-build" build
xcodebuild -project simulator-export/Unity-iPhone.xcodeproj -scheme UnityFramework \
-configuration Release -sdk iphonesimulator BUILD_DIR="$PWD/simulator-build" build
xcodebuild -create-xcframework \
-framework device-build/Release-iphoneos/UnityFramework.framework \
-framework simulator-build/Release-iphonesimulator/UnityFramework.framework \
-output <YOUR_RN_PROJECT>/unity/builds/ios/UnityFramework.xcframework
- 莱因斯通舱。 Xcode 只链接设备切片, 因此运出应用大小不变.