You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在React Native项目中集成多个Unity构建包?

在react-native-unity中集成多个Unity构建包的实现方案

react-native-unity默认只支持单个Unity包集成,要实现多小游戏模块,需要从项目结构调整、Native配置修改、RN层封装三个层面入手,具体步骤如下:

1. 整理Unity构建包目录

将每个小游戏的Unity导出包单独存放,避免文件冲突:

  • 在项目根目录创建unity-builds文件夹,内部按游戏名分目录,比如unity-builds/game1、unity-builds/game2
  • 每个目录下存放对应游戏完整的导出文件(Android的android子目录、iOS的Data/UnityFramework等文件)

2. Android端配置修改

2.1 添加多模块引用

修改android/settings.gradle,为每个Unity游戏添加独立模块:

include ':unity-game1'
project(':unity-game1').projectDir = new File(rootProject.projectDir, '../unity-builds/game1/android')

include ':unity-game2'
project(':unity-game2').projectDir = new File(rootProject.projectDir, '../unity-builds/game2/android')

2.2 依赖配置

修改android/app/build.gradle,在dependencies块中添加所有Unity模块的依赖:

implementation project(':unity-game1')
implementation project(':unity-game2')

2.3 避免Activity类冲突

每个Unity导出包的UnityPlayerActivity类名重复,需要重命名:

  • 进入unity-game1/android/src/main/java/com/yourpackage目录,将UnityPlayerActivity.java重命名为Game1UnityPlayerActivity.java,并修改类内部的类名
  • 对game2做同样操作,重命名为Game2UnityPlayerActivity.java
  • 在android/app/src/main/AndroidManifest.xml中注册这两个Activity,复制原UnityActivity的配置并修改对应属性:
<activity
    android:name=".Game1UnityPlayerActivity"
    android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
    android:hardwareAccelerated="false"
    android:launchMode="singleTask"
    android:theme="@style/UnityThemeSelector"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <meta-data
        android:name="unityplayer.UnityActivity"
        android:value="true" />
</activity>

<!-- 重复上述配置,替换为Game2UnityPlayerActivity -->

3. iOS端配置修改

3.1 导入多游戏资源

打开Xcode项目,将每个游戏的导出文件(Data文件夹、UnityFramework.xcodeproj)分别拖入项目,选择Create groups,并将它们放在不同的子目录(如UnityGame1、UnityGame2)下,避免文件重叠。

3.2 修改UnityFramework目标

每个游戏的UnityFramework需要独立配置,避免编译冲突:

  • 打开UnityFramework.xcodeproj,复制原有目标,命名为UnityFramework-Game1和UnityFramework-Game2
  • 分别修改两个目标的Build Settings,将Product Name设为对应名称,调整Header Search Paths和Library Search Paths指向各自游戏的导出目录
  • 在主项目的Build Phases中,添加两个UnityFramework目标的依赖和链接

3.3 动态切换游戏实例

修改AppDelegate.mm或自定义RN桥接文件,实现根据游戏ID加载对应框架:

#import "UnityFramework-Game1/UnityFramework.h"
#import "UnityFramework-Game2/UnityFramework.h"

UnityFramework *_currentUnityFramework;

- (void)loadUnityGame:(NSString *)gameId {
    // 先卸载当前游戏实例
    if (_currentUnityFramework) {
        [_currentUnityFramework unloadUnity];
        _currentUnityFramework = nil;
    }
    
    // 加载对应游戏的框架
    if ([gameId isEqualToString:@"game1"]) {
        _currentUnityFramework = [UnityFramework new];
        [_currentUnityFramework setDataBundleId:@"com.yourpackage.game1"];
        [_currentUnityFramework runEmbeddedWithArgc:0 argv:NULL appLaunchOpts:nil];
    } else if ([gameId isEqualToString:@"game2"]) {
        _currentUnityFramework = [UnityFramework new];
        [_currentUnityFramework setDataBundleId:@"com.yourpackage.game2"];
        [_currentUnityFramework runEmbeddedWithArgc:0 argv:NULL appLaunchOpts:nil];
    }
}

4. React Native层封装与切换

4.1 自定义RN组件

创建一个MultiUnityView组件,接收gameId属性,通过桥接调用Native层的加载方法:

import { NativeModules, View, useEffect } from 'react-native';

const MultiUnityManager = NativeModules.MultiUnityManager;

const MultiUnityView = ({ gameId }) => {
  useEffect(() => {
    MultiUnityManager.loadUnityGame(gameId);
    return () => {
      MultiUnityManager.unloadUnityGame();
    };
  }, [gameId]);
  
  return <View style={{ flex: 1 }} />;
};

export default MultiUnityView;

4.2 实现游戏切换逻辑

在RN页面中,通过状态切换gameId来加载不同游戏:

import { useState, Button, View } from 'react-native';
import MultiUnityView from './MultiUnityView';

const GameSwitcher = () => {
  const [currentGame, setCurrentGame] = useState(null);
  
  return (
    <View style={{ flex: 1 }}>
      <Button title="加载游戏1" onPress={() => setCurrentGame('game1')} />
      <Button title="加载游戏2" onPress={() => setCurrentGame('game2')} />
      <Button title="卸载游戏" onPress={() => setCurrentGame(null)} />
      {currentGame && <MultiUnityView gameId={currentGame} />}
    </View>
  );
};

关键注意事项

  • 内存管理:切换游戏时必须调用卸载方法(Android的UnityPlayer.quit()、iOS的unloadUnity()),否则会导致内存泄漏
  • 资源冲突:确保不同Unity游戏的资源文件(如图片、字符串)有唯一前缀,避免打包时被覆盖
  • 构建自动化:可以编写shell脚本,自动将Unity导出的包复制到对应目录,简化多包构建流程

内容的提问来源于stack exchange,提问作者JediKnight21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:40:29