@azesmway/react-native-unity

中文文档
1.1.1发布于 2026/08/07MITTypeScriptESM + CJS零依赖近 30 天下载 7229

反应原生团结

中文使用文档
文档目录10 节
  1. 机器人
  2. 设备支持 :
  3. 在您的反应内置工程中安装此软件包 :
  4. 配置您的团结项目 :
  5. 导出 iOS 团结工程 :
  6. 机器人
  7. 样本代码
  8. 道具
  9. 方法
  10. iOS 模拟器支持( 可选)

@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

配置您的团结项目 :

  1. 复制文件夹的内容 unity 到您的团结项目根。 此文件夹包含团结项目所需的脚本和设置 。 您可以在您的反应内置工程中找到这些文件 node_modules/@azesmway/react-native-unity/unity。这是确保iOS能够访问 NativeCallProxy 这个图书馆的课.

  2. (可选) 如果你跟随这个例子,你可以把以下代码添加到 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 统一项目 :

  1. 打开您的团结项目
  2. 在任何文件夹中为 ios 构建团结项目 - 只是不是主 RN 项目文件夹! !
  3. 在 XCode 中打开创建的工程
  4. 选择数据文件夹并在“目标成员”栏目中设置一个复选框到“团结框架” image info
  5. 您需要选择本地CallProxy.h Unity-iPhone/Libraries/Plugins/iOS unity-iPhone项目的文件夹,并将UnityFramework的目标成员从项目改为公共。 别忘了这个步骤! (如果你在Xcode项目中没有看到这些文件,你没有复制到 unity 文件夹,在前几个步骤中正确显示团结项目) image info
  6. 如果需要 - 在项目上签名 UnityFramework.framework 建立一个框架 image info
  7. 用已建框架打开文件夹( 右键单击) 并移动到插件文件夹( Q)<YOUR_RN_PROJECT>/unity/builds/ios(中文(简体) ) image info
  8. 删除您的 Pods 在 RN 主工程的根中含有此命令的缓存和锁定文件 rm -rf ios/Pods && rm -f ios/Podfile.lock && npx pod-install

机器人

  1. 打开您的团结项目
  2. 导出团结应用程序到 <YOUR_RN_PROJECT>/unity/builds/android
  3. 删除 <intent-filter>...</intent-filter> 从 <YOUR_RN_PROJECT>/unity/builds/android/unityLibrary/src/main/AndroidManifest.xml 统一图书馆只保留集成版本.

若用博览相取已. 内置的 expo 插件将处理其余部分 。 如果你不使用博览会,你需要遵循下面的步骤.

  1. 添加以下行为 android/settings.gradle数字 :

    include ':unityLibrary'
    project(':unityLibrary').projectDir=new File('..\\unity\\builds\\android\\unityLibrary')
    
  2. 添加到 android/build.gradle

    allprojects {
      repositories {
        // this
        flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
        }
        // ...
      }
    }
    
  3. 添加到 android/gradle.properties

    unityStreamingAssets=.unity3d
    
  4. 添加字符串到 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.message
  • onPlayerUnload?: (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框架和插件自动取出:

  1. 在Unity中,导出 iOS 项目两次:一次 目标SDK:设备SDK 一次 与 目标 SDK:模拟器 SDK (Player设置 → iOS → 目标 SDK).
  2. 构建 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
  1. 莱因斯通舱。 Xcode 只链接设备切片, 因此运出应用大小不变.

版本与发布记录

@azesmway/react-native-unity 共发布 37 个版本,首次发布于 2022/03/29;过去 12 个月发布了 2 个版本。

版本发布日期距今
1.1.1latest2026/08/073 个月前
1.1.02026/07/133 个月前
1.0.112024/12/131.9 年前
1.0.102024/06/132 年前
1.0.92024/05/082 年前
1.0.82024/05/082 年前

关于 @azesmway/react-native-unity 的常见问题

@azesmway/react-native-unity 是什么?

反应原生团结

如何安装 @azesmway/react-native-unity?

在项目目录运行 npm install @azesmway/react-native-unity,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(*)、react-native(*)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@azesmway/react-native-unity 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@azesmway/react-native-unity 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@azesmway/react-native-unity 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 18.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@azesmway/react-native-unity 可以商用吗?

@azesmway/react-native-unity 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@azesmway/react-native-unity 的下载量有多少?

根据 npm 官方下载统计,@azesmway/react-native-unity 在 2026/10/08 – 2026/11/06 这 30 天内被下载 7,229 次,日均约 241 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@azesmway/react-native-unity 还在维护吗?

最新版本 1.1.1 发布于 2026/08/07(3 个月前);至今共发布 37 个版本,其中过去 12 个月发布了 2 个;首次发布于 2022/03/29。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。