關聯文檔:【方案分享】Flutter +Unity 跨平臺三維渲染架構設計全解:插件封裝、通信機制與熱更新機制—— 支持 Android/iOS/Web 的 3D 內容嵌入與遠程資源管理,助力 XR 項目落地
—— 支持 Android/iOS/Web 的 3D 內容嵌入與遠程資源管理,助力 XR 項目企業級開發落地
適用場景:三維內容(模型/動畫/場景)需要跨平臺(Android/iOS/Web)展示,UI 用 Flutter 實現,Unity 作為底層 3D 渲染引擎,支持熱更新、場景管理與統一接口通信。
Flutter + Unity 插件結構與通信接口封裝
1. 插件封裝的目標
為了將 Unity 跨平臺三維渲染能力集成至 Flutter 應用中,我們需要封裝一套統一的插件結構,屏蔽 Android/iOS/Web 三端差異,同時提供一致的 Dart API 與通信機制。
目標如下:
- 實現統一的插件入口與注冊流程
- 管理 Unity 實例生命周期(初始化、銷毀、復用)
- 建立 Dart 與 Unity 的通信橋梁
- 提供跨端一致的功能調用接口與事件回調機制
2. 插件結構總覽
Flutter 插件包的典型結構如下:
flutter_unity_plugin/
├── lib/
│ └── flutter_unity_plugin.dart # Dart API 封裝
├── android/
│ └── src/... # Android 平臺代碼
├── ios/
│ └── Classes/... # iOS 平臺代碼
├── web/
│ └── unity_web_view.dart # Web 平臺 iframe 管理
├── example/
│ └── demo_app/ # 示例項目
├── pubspec.yaml
3. Dart 層封裝設計
3.1 UnityWidget
核心組件為 UnityWidget
,用于在頁面中嵌入 Unity 渲染視圖:
class UnityWidget extends StatefulWidget {final void Function(UnityController)? onUnityCreated;...
}
3.2 UnityController
用于操作 Unity 實例和通信:
class UnityController {Future<void> send(String method, Map<String, dynamic> params);Future<void> dispose();Stream<UnityEvent> get onUnityMessage;
}
4. 通信機制封裝
4.1 Dart ? Native 通信
使用標準的 MethodChannel
和 EventChannel
實現:
static const MethodChannel _channel = MethodChannel('flutter_unity_plugin');
static const EventChannel _eventChannel = EventChannel('flutter_unity_plugin/events');
調用示例:
await _channel.invokeMethod('sendMessage', {'object': 'GameManager','method': 'LoadScene','message': json.encode(params),
});
事件監聽:
_eventChannel.receiveBroadcastStream().listen((data) {final event = UnityEvent.fromJson(data);_eventController.add(event);
});
4.2 Native ? Unity 通信
Android:
UnityPlayer.UnitySendMessage("GameManager", "LoadScene", message);
iOS:
UnityFramework.getInstance()?.sendMessageToGO(withName: "GameManager", functionName: "LoadScene", message: message)
Web(postMessage):
unityInstance.SendMessage('GameManager', 'LoadScene', message);
5. 跨平臺通信協議設計
使用統一結構的 JSON 通信協議:
5.1 Flutter → Unity
{"cmd": "loadScene","params": {"sceneName": "lobby","userId": "abc123"}
}
5.2 Unity → Flutter
{"event": "sceneLoaded","scene": "lobby","timestamp": 1710000000
}
可封裝為 Dart 類以便類型安全:
class UnityEvent {final String event;final Map<String, dynamic> payload;
}
6. 生命周期與狀態管理
插件建議實現如下生命周期方法:
initUnity()
初始化 Unity 實例sendMessage()
通信pauseUnity()
暫停渲染(如切后臺)resumeUnity()
恢復渲染disposeUnity()
銷毀 Unity 實例,釋放資源
狀態管理建議結合 Provider 或 Bloc 實現,統一監聽 Unity 渲染狀態。
7. 示例代碼片段
final unityController = UnityController();await unityController.send('loadScene', {'sceneName': 'museum','theme': 'dark'
});unityController.onUnityMessage.listen((event) {print('Received event from Unity: ${event.event}');
});