Unity_Kit 是一个 Flutter 插件,可实现 Unity 3D 游戏和应用程序与 Flutter 项目的无缝集成。它提供了一个类型化的桥梁和二进制协议,以实现 Flutter 和 Unity 之间的高效通信,确保高性能。支持 AR 功能,并在 Android、iOS、Web、Windows、Linux 和 macOS 上兼容。非常适合希望将 Flutter 的 UI 能力与 Unity 强大的 3D 渲染和游戏逻辑相结合的开发者。
适合场景
在Flutter应用中嵌入Unity 3D游戏
使用 Flutter 和 Unity 创建 AR 体验
跨平台3D内容分发
具有丰富图形的混合应用开发
将现有的 Unity 资产集成到 Flutter 工作流中
主要特点
用于安全数据交换的类型化桥接
用于低延迟通信的二进制协议
Unity 场景中的 AR 支持
多平台兼容性(Android、iOS、Web、桌面端)
高效性能,开销极小
适合对象
Flutter 开发人员构建 3D 或 AR 应用
使用 Unity 的游戏开发者,想要 Flutter 用户界面
创建跨平台交互体验的团队
需要高性能3D渲染的项目
将旧版 Unity 项目集成到现代 Flutter 应用的开发者
使用建议
需要 Unity 项目设置和配置
与其他成熟插件相比,文档有限
在Flutter和Unity之间管理状态可能存在复杂性
由于Unity运行时,应用大小可能增加
平台特定的构建步骤对于完整部署是必需的
原始 README
以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。
Unity Kit
A Flutter plugin for Unity 3D integration. Embed Unity content in Flutter apps with typed communication, lifecycle management, asset streaming, and support for Unity 2022.3 LTS through Unity 6.
📚 Documentation
Full hosted documentation — a complete zero-to-running walkthrough, native setup guides, API reference and troubleshooting — lives at codigee.com/open-source/unity-kit.
Flutter handles UI (screens, buttons, navigation). Unity handles 3D (rendering, game logic). They run in the same app but are separate worlds -- they talk by sending JSON messages through a native bridge.
Flutter (Dart) Unity (C#)
UI, screens, JSON messages 3D rendering,
business logic <=========================> game logic
native bridge (iOS/Android)
There are no direct method calls. Everything goes through serialized JSON over the platform bridge. Flutter never calls C# directly, and Unity never calls Dart directly.
Repository Structure
.├──unity_kit/# Flutter plugin package (published to pub.dev)│├──lib/# Dart source code│├──android/# Android native layer (Kotlin)│├──ios/# iOS native layer (Swift)│├──unity/# C# scripts for Unity side│├──example/# Example Flutter app│├──test/# Test suite (35 files, 640+ tests)│└──doc/# API reference & asset streaming guide├──doc/# Detailed guides│├──unity-export.md# Step-by-step Unity export guide│├──unity_integrations.md# Content loading methods (scenes, Addressables, etc.)│├──android-integration.md# Android native architecture & known issues│├──ios-integration.md# iOS native architecture & known issues│└──architecture.md# Overall architecture overview└──.github/workflows/# CI/CD (auto-tag + pub.dev publish)
Key Features
Feature
What it does
Typed Bridge
UnityMessage objects instead of raw strings. Structured, type-safe communication.
Copy unity_kit/unity/Assets/Scripts/UnityKit/ into your Unity project. A FlutterBridge GameObject auto-creates on scene load and handles all communication.
// Receive messages from Flutter
public class MyHandler : FlutterMonoBehaviour
{
protected override void OnFlutterMessage(string method, string data)
{
switch (method)
{
case "StartGame":
// do something
NativeAPI.SendToFlutter("{\"type\":\"game_started\"}");
break;
}
}
}
For downloading 3D content from a server at runtime:
1. Flutter downloads content_manifest.json from CDN
2. User selects a toy/asset in the UI
3. Flutter downloads the .bundle file to local cache (SHA-256 verified)
4. Flutter tells Unity: "cache is at /path" (SetCachePath)
5. Flutter tells Unity: "load asset with key 'alphie'" (LoadToyRemote)
6. UnityAddressables loads from local cache (not from network again)
7. Unity sends "toy_loaded" back to Flutter
Building Addressables
Setup (one-time):Flutter > Setup Addressables
Add asset: place prefab in Addressables group, set address key
See doc/faq.md for the full list. Here are the top issues:
Black screen after Unity loads (Android)
Unity needs an explicit "refocus" after attaching to the view: windowFocusChanged(true) + pause() + resume(). This is handled by unity_kit automatically. If you see a black screen, check that you're using the latest version.
Touch not working (Android)
Unity's New Input System requires InputDevice.SOURCE_TOUCHSCREEN on touch events. The UnityContainerLayout in unity_kit fixes this. If touch doesn't work, make sure you're not overriding the touch handling.
White/blank screen (iOS)
Usually a timing issue: Unity's Metal renderer needs a non-zero view frame before initialization. unity_kit polls with waitForNonZeroFrame(). If it persists, ensure the UnityView widget has a non-zero size in the layout.
Release build works differently than debug (Android)
ProGuard/R8 can strip classes used via reflection or JNI. unity_kit's Build.cs auto-adds ProGuard keep rules during export. If you see silent failures in release, verify proguard-unity.txt contains keep rules for com.unity_kit.** and com.unity3d.player.**.
Messages not reaching Unity / Flutter
Check FlutterBridge GameObject exists in the first scene
Check your handler's target name matches what Flutter sends
Check Unity Console for [UnityKit] No handler registered for target: xxx
On iOS: verify UnityKitNativeBridge.mm is in Assets/Plugins/iOS/
Environment preflight
Before mounting a view, ask what the build actually carries:
final env = awaitUnityKitPlatform.instance.environment();
if (!env.isReadyForUnity) {
// No Unity runtime in this build: a UnityView would come up blank.debugPrint(env.summary);
}
if (env.failsPageSizeRequirement) {
// Google Play rejects updates targeting Android 15+ whose native// libraries are aligned to less than 16 KB.debugPrint('Not 16 KB aligned: ''${env.unalignedLibraries.map((l) => l.name).join(', ')}');
}
env.summary prints a single line for logs, for example:
The Unity 6 class rename.env.runtime says which player class was
found, so a build that silently shipped without the Unity libraries is
obvious instead of showing up as an empty surface.
16 KB page sizes. Since 1 November 2025, Google Play requires every
native library in an app targeting Android 15 (API 35) or newer to be
aligned to 16 KB. Unity satisfies this from 2022.3.56 and from
Unity 6, but an app can still ship an older prebuilt .so. The check
reads the p_align of each PT_LOAD segment out of the shipped files, so
it reports the binary's truth rather than the Unity version's claim.
iOS reports the runtime and page size but no alignment verdict: the 16 KB
rule is an Android packaging requirement.
Unity 6 compatibility
unity_kit uses reflection to detect Unity 6's UnityPlayerForActivityOrService class automatically. No manual configuration needed. If you're using Unity 6 and see issues, check the Android Integration guide for constructor signature details.
Roadmap to 1.0
3D model loading utilities and prefab management helpers
Full step-by-step tutorial covering the complete integration flow
Additional example scenes and sample Unity project