Flutter + Unity 混合开发:用 unity_kit 实现高效的双向通信

欢迎关注微信公众号:FSA全栈行动 👋

一、痛点:混合开发最怕通信难

大家都知道 Flutter 开发移动端应用非常高效,但如果你想在应用里加入一些高性能的 3D 游戏、AR/VR 交互内容或者复杂的物理模拟,Flutter 本身就显得有些力不从心了。

这时候,引入 Unity 是最直接的方案。

但问题也随之而来:FlutterUnity 是两套完全不同的技术栈,想让它们乖乖地待在一起,并且实现流畅的双端数据传递,确实挺折腾的。

目前在 pub.dev 上,已经有一些现成的插件可以把 Unity 项目嵌入到 Flutter 中,比如 flutter_unity_widget 或者 flutter_embed_unity。不过,我在使用过程中发现,这些插件的配置过程非常繁琐,一旦在集成过程中遇到报错,排查起来极其耗时,真的很让人心累。

最近我发现了一个名为 unity_kit 的插件,它极大简化了 FlutterUnity 之间的通信流程。

二、快速上手:集成与配置

unity_kit 本质上是一个 Flutter 插件,它在 FlutterUnity 之间搭了一座桥梁,让双方都能实现信息的自由收发。

它对平台的支持非常全面,包括 AndroidiOSWindowsLinuxmacOS 以及 Web

它的核心逻辑其实很简单:

Flutter UI -> UnityView -> Unity

简单来说,由 Flutter 负责应用层的业务逻辑和 UI 界面,而把复杂的 3D 渲染交给 Unity 处理。

1、添加依赖

首先,在你的 pubspec.yaml 中引入它:

YAML 复制代码
dependencies:
  unity_kit: ^2.0.0

或者直接在终端运行:

Bash 复制代码
flutter pub add unity_kit

2、环境准备

配置完成后,还需要对 Unity 项目和原生的 Android/iOS 项目进行一些设置。

这里有几个关键点需要注意:

  • Unity 版本 :官方建议使用 Unity 2022.3 LTS 或更高版本。

  • 场景配置 :你需要在 Unity 的初始场景中添加一个名为 FlutterBridgeGameObject,它是实现通信的核心入口。

三、核心实战:让双端"无缝对话"

环境调教好之后,我们就可以开始写代码了。

1、在 Flutter 中展示 Unity 视图

核心组件是 UnityView。它就像是一个容器,决定了 Unity 内容在 Flutter 界面上的呈现位置。

代码示例如下:

Dart 复制代码
// 1. 初始化 Bridge
final bridge = UnityBridgeImpl(
  platform: UnityKitPlatform.instance,
);
await bridge.initialize();

// 2. 在 Widget 树中使用 UnityView
UnityView(
  bridge: bridge,
  config: const UnityConfig(
    sceneName: 'MainScene', // 指定 Unity 的启动场景
  ),
  onReady: (bridge) {
    // Unity 就绪后,可以立即发送一个指令,比如开始游戏
    bridge.send(
      UnityMessage.command('StartGame'),
    );
  },
);

2、从 Flutter 向 Unity 发送数据

如果你想让 Unity 加载某个关卡,或者控制某个物体,可以这样写:

发送全局指令:

Dart 复制代码
await bridge.send(
  UnityMessage.command(
    'LoadScene',
    {'name': 'Level1'},
  ),
);

向特定的 Unity 对象发送消息:

如果你只想让场景中的某个 GameObject(比如 EnemyManager)做出反应,可以指定目标:

Dart 复制代码
await bridge.send(
  UnityMessage.to(
    'EnemyManager',
    'SpawnWave',
    {'count': 5},
  ),
);

3、从 Unity 接收消息

通信是双向的。Flutter 只需要监听 bridge.messageStream 即可。当 Unity 端触发事件(比如分数更新、游戏结束、玩家死亡)时,Flutter 侧就能立刻感知到:

Dart 复制代码
bridge.messageStream.listen((message) {
  print('收到消息类型: ${message.type}');
  // 根据 message.type 来更新 Flutter 的 UI 状态
});

四、进阶技巧:解决时序问题与性能监控

在实际开发中,有两个细节非常重要。

1、解决"沟通时机"问题

混合开发最常遇到的问题就是"时序"不对。有时候 Flutter 还没等 Unity 完全启动,就急着发消息,结果就是消息丢了。

unity_kit 提供了一个非常实用的方法:sendWhenReady()

它会将消息放入队列,直到 Unity 准备就绪后才会自动发送。

Dart 复制代码
await bridge.sendWhenReady(
  UnityMessage.command(
    'Init',
    {'userId': '123'},
  ),
);

2、性能监控

如果你的应用中双端交互非常频繁,频繁的独立消息发送会带来一定的性能开销。unity_kit 内部处理了消息的批量处理(Batching)和节流(Throttling),这让通信更高效。

此外,它还暴露了一个性能监听流(performanceStream),我们可以直接在 Flutter 端实时监控 Unity 的运行状态:

指标 说明
fps 当前帧率
frameTimeMs 每帧耗时(毫秒)
usedMemoryMb 当前内存占用(MB)
Dart 复制代码
bridge.performanceStream.listen((stats) {
  print('FPS: ${stats.fps}');
  print('内存占用: ${stats.usedMemoryMb} MB');
});

五、最后

本文简单带大家过了一遍 unity_kit 的基本用法。如果你正在尝试在 Flutter 项目里加入 3D 元素,这个库非常值得一试,它能帮你省去大量在原生层"修修补补"的时间。如果需要更深度的定制,建议直接去查看他们的官方文档。

如果你觉得这篇文章有用,欢迎点赞支持。本篇到此结束。

如果文章对您有所帮助, 请不吝点击关注一下我的微信公众号:FSA全栈行动, 这将是对我最大的激励. 公众号不仅有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技能知识点哦~

相关推荐
西安小哥5 小时前
从 Vue 到万物:AI 加速下的前端开发者全栈进化论【第二课】
全栈
西安小哥5 小时前
从 Vue 到万物:AI 加速下的前端开发者全栈进化论【第一课】
全栈
西安小哥5 小时前
从 Vue 到万物:AI 加速下的前端开发者全栈进化论【第三课】
全栈
西安小哥5 小时前
从 Vue 到万物:AI 加速下的前端开发者全栈进化论【第五课】
全栈
程序员老刘5 小时前
Flutter版本选择指南:3.47压哨发布,9月大限只剩一周 | 2026年8月
flutter·ai编程·客户端
西安小哥5 小时前
从 Vue 到万物:AI 加速下的前端开发者全栈进化论【第四课】
全栈
SmalBox9 小时前
【Vertex着色器】Unity实现-程序性游鱼动画
unity3d·游戏开发·图形学
_zhourui_h_10 小时前
Unity EasyECS 五分钟快速上手:只加一个 [ECS]
unity3d
xcyxiner10 小时前
flutter 运行到模拟器上
android·前端·flutter