FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
  • 内功心法

    • 《深入浅出设计模式Java版》笔记
前端
后端
  • 产品
  • 代理
  • 提效
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
  • 内功心法

    • 《深入浅出设计模式Java版》笔记
前端
后端
  • 产品
  • 代理
  • 提效
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • AndroidUI

  • Android第三方SDK

  • Android混淆

  • Android仓库

  • Android新闻

  • Android系统开发

  • Android源码

  • Android注解AOP

  • Android脚本

  • AndroidTv开发

  • AndroidNDK

  • Android音视频

  • Android热修复

  • Android性能优化

  • Android云游戏

  • Android插件化

  • iOSUI

  • iOS工具

  • iOS底层原理与应用

  • iOS组件化

  • iOS音视频

  • iOS疑难杂症

  • iOS之Swift

  • iOS之RxSwift

  • iOS开源项目

  • iOS逆向

  • Flutter开发

    • Dart - 抽象类的实例化
    • Flutter - 打印好用的Debug日志
    • Flutter - 混合开发
    • Flutter - 解决混合开发iOS脚本打包遇到的问题
    • Flutter - 低版本在iOS14上遇到的问题与解决方案
    • Flutter - 解决原生弹窗的触摸事件被Flutter响应的问题
    • Flutter - 实现列表上下拉切换header
    • Flutter - 获取ListView当前正在显示的Widget信息
    • Flutter - 列表滚动定位超强辅助库,墙裂推荐!🔥
    • Flutter - 快速实现聊天会话列表的效果,完美💯
    • Flutter - 聊天输入框更新文本时的必备优化点🔖
    • Flutter - 我给官方提PR,解决run命令卡住问题 😃
    • Flutter - 探索run命令到底做了什么 🤔
    • Flutter - 引擎调试(iOS篇)🛠
    • Flutter - 引擎调试bug到提交PR实战 🐞
    • Flutter - 船新升级😱支持观察第三方构建的滚动视图💪
    • Flutter - 瀑布流交替播放视频 🎞
    • Flutter - IM保持消息位置大升级(支持ChatGPT生成式消息) 🤖
    • Flutter - 滚动视图中的表单防遮挡 🗒
    • Flutter - 秒杀1/2曝光统计 📊
    • 一天内加入 Flutter 和 FlutterCandies 两大组织是什么体验 🧐
    • Flutter - 如何快速搓一个微信通讯录列表(azlist) 📓
    • Flutter - 混编项目集成Shorebird热更新🐦(安卓篇)
    • Flutter - 混编项目集成Shorebird热更新🐦(iOS篇)
    • Flutter - 解决返回原生页面时dispose方法未被触发的问题 🐞
    • Flutter - 升级3.19之后页面多次rebuild?🤨
    • Flutter - 热更新 Shorebird 1.0 正式版来了 🐦
    • Flutter - 使用Pigeon实现视频缓存插件 🐌
    • Flutter - 轻松搞定屏幕旋转功能 😎
    • Flutter - 解决Connection closed before full header was received
    • Flutter - 实现聊天键盘与功能面板的丝滑切换 🍻
    • Flutter - 支持观察NestedScrollView,兼容性更强 😈
    • Flutter - 聊天键盘与面板丝滑切换的强势升级 🍻
    • Flutter - 升级到3.24后页面还会多次rebuild吗?🧐
    • Flutter - 轻松实现PageView卡片偏移效果
    • Flutter - 轻松搞定炫酷视差(Parallax)效果
    • Flutter - 危!3.24版本苹果审核被拒!
    • Flutter - 子部件任意位置观察滚动数据
    • Flutter - iOS编译加速
    • Flutter - Xcode16 还原编译速度
    • Flutter - GetX Helper 助你规范应用 tag
    • Flutter - GetX Helper 如何应用于旧页面
    • Flutter - 聊天面板库动画生硬?这次让你丝滑个够
    • Flutter - 使用本地 DevTools 验证 SVG 加载优化
    • Flutter - 详情页 TabBar 与模块联动?秒了!
    • Flutter - 详情页初始锚点与优化
    • Flutter - Melos Pub workspaces 实践
    • Flutter webview 崩溃率上升怎么办?我的分析与解决方案
    • Flutter 多仓库本地 Monorepo 方案与体验优化
    • Flutter 拖拉对比组件,换装图片前后对比必备
    • Flutter 3.44 插件内置 Kotlin (KGP) 双向兼容适配指南
    • Flutter 无障碍开发实战:玩转 Semantics 解决视障用户使用痛点
    • 玩转 WebSocket:从原理到 Flutter 实战
    • 别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
    • Flutter 3.44 性能飞跃:深度解析 Android Platform View 的 HCPP 新特性
    • 给 Flutter 插件加上 Swift Package Manager 支持
    • 彻底搞懂 Dart Stream:从底层原理到 Flutter 实战与面试题集
    • 别被“Flutter 传感器延迟 150ms”带偏了:这可能只是你的实现方式错了
    • StatefulWidget 里的隐形炸弹:为什么不要在 State 类中使用 context.mounted
    • 深入理解 Flutter 架构:从 Widget 到 GPU 像素的全链路解析
    • 深度拆解 Dart 事件循环:从面试题看清 Microtask 与 Event Queue 的执行顺序
    • Flutter FocusNode 实战指南:玩转键盘焦点与用户输入体验
    • iOS 27 强制要求 UISceneDelegate:UIKit 和 Flutter 开发者该如何应对?
    • Flutter 实战:为你的 App 增加桌面快捷方式 (Quick Actions)
    • 玩转 Flutter 项目依赖:从 pubspec.yaml 到实战包管理
    • Flutter 居然能直接跑在 Apple Watch 上了?玩转 flutter-watchos
    • 玩转 Dart typedef:不仅是函数别名那么简单
    • Impeller 时代:Shader Jank 消失了,但渲染性能的战场也变了
    • 玩转 Flutter 中的 Stack 与 Positioned:解决 UI 重叠问题的实战指南
    • Flutter 3.47 与 Dart 3.13:你必须了解的迁移指南
    • Flutter 实战:图片上传前的压缩优化,解决带宽与存储的“大户”问题
    • Flutter + Unity 混合开发:用 unity_kit 实现高效的双向通信
      • 一、痛点:混合开发最怕通信难
      • 二、快速上手:集成与配置
        • 1、添加依赖
        • 2、环境准备
      • 三、核心实战:让双端“无缝对话”
        • 1、在 Flutter 中展示 Unity 视图
        • 2、从 Flutter 向 Unity 发送数据
        • 3、从 Unity 接收消息
      • 四、进阶技巧:解决时序问题与性能监控
        • 1、解决“沟通时机”问题
        • 2、性能监控
      • 五、最后
    • Flutter 实战:使用 local_auth 实现生物识别(指纹 & Face ID)
  • 移动端
  • Flutter开发
GitLqr
2026-08-24
目录

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

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

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

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

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

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

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

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

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

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

它对平台的支持非常全面,包括 Android、iOS、Windows、Linux、macOS 以及 Web。

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

Flutter UI -> UnityView -> Unity

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

# 1、添加依赖

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

dependencies:
  unity_kit: ^2.0.0

或者直接在终端运行:

flutter pub add unity_kit

# 2、环境准备

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

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

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

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

# 三、核心实战:让双端“无缝对话”

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

# 1、在 Flutter 中展示 Unity 视图

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

代码示例如下:

// 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 加载某个关卡,或者控制某个物体,可以这样写:

发送全局指令:

await bridge.send(
  UnityMessage.command(
    'LoadScene',
    {'name': 'Level1'},
  ),
);

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

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

await bridge.send(
  UnityMessage.to(
    'EnemyManager',
    'SpawnWave',
    {'count': 5},
  ),
);

# 3、从 Unity 接收消息

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

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

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

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

# 1、解决“沟通时机”问题

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

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

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

await bridge.sendWhenReady(
  UnityMessage.command(
    'Init',
    {'userId': '123'},
  ),
);

# 2、性能监控

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

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

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

# 五、最后

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

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

#Unity#unity_kit
上次更新: 2026/08/25, 12:17:50
Flutter 实战:图片上传前的压缩优化,解决带宽与存储的“大户”问题
Flutter 实战:使用 local_auth 实现生物识别(指纹 & Face ID)

← Flutter 实战:图片上传前的压缩优化,解决带宽与存储的“大户”问题 Flutter 实战:使用 local_auth 实现生物识别(指纹 & Face ID)→

最近更新
01
Flutter 实战:使用 local_auth 实现生物识别(指纹 & Face ID)
08-25
02
2026 Bun 全新姿态:从 Zig 到 Rust 的“暴力”重构与生态大爆发
08-22
03
Flutter 实战:图片上传前的压缩优化,解决带宽与存储的“大户”问题
08-20
更多文章>
Theme by Vdoing | Copyright © 2020-2026 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×