欢迎关注微信公众号: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 中引入它:
YAML
dependencies:
unity_kit: ^2.0.0
或者直接在终端运行:
Bash
flutter pub add unity_kit
2、环境准备
配置完成后,还需要对 Unity 项目和原生的 Android/iOS 项目进行一些设置。
这里有几个关键点需要注意:
-
Unity 版本 :官方建议使用
Unity 2022.3 LTS或更高版本。 -
场景配置 :你需要在
Unity的初始场景中添加一个名为FlutterBridge的GameObject,它是实现通信的核心入口。
三、核心实战:让双端"无缝对话"
环境调教好之后,我们就可以开始写代码了。
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等文章, 可能有你想要了解的技能知识点哦~