89 lines
2.1 KiB
Dart
89 lines
2.1 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:flutter/services.dart';
|
||
import 'unity_controller.dart';
|
||
|
||
/// Unity视图的Flutter封装
|
||
class UnityWidget extends StatefulWidget {
|
||
/// 默认场景名称
|
||
final String defaultScene;
|
||
|
||
/// Unity视图加载完成回调
|
||
final Function? onUnityViewCreated;
|
||
|
||
/// Unity消息回调
|
||
final Function(String)? onUnityMessage;
|
||
|
||
/// 构造函数
|
||
const UnityWidget({
|
||
Key? key,
|
||
required this.defaultScene,
|
||
this.onUnityViewCreated,
|
||
this.onUnityMessage,
|
||
}) : super(key: key);
|
||
|
||
@override
|
||
State<UnityWidget> createState() => _UnityWidgetState();
|
||
}
|
||
|
||
class _UnityWidgetState extends State<UnityWidget> {
|
||
// Unity控制器
|
||
final UnityController _unityController = UnityController();
|
||
|
||
// 是否正在加载
|
||
bool _isLoading = true;
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
// 加载默认场景
|
||
_loadDefaultScene();
|
||
}
|
||
|
||
// 加载默认场景
|
||
Future<void> _loadDefaultScene() async {
|
||
setState(() {
|
||
_isLoading = true;
|
||
});
|
||
|
||
try {
|
||
// 打开Unity默认场景
|
||
await _unityController.openUnityScene(widget.defaultScene);
|
||
|
||
// 通知视图创建完成
|
||
if (widget.onUnityViewCreated != null) {
|
||
widget.onUnityViewCreated!();
|
||
}
|
||
} catch (e) {
|
||
print('加载Unity场景失败: $e');
|
||
} finally {
|
||
setState(() {
|
||
_isLoading = false;
|
||
});
|
||
}
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
// 根据平台返回不同的视图
|
||
if (Theme.of(context).platform == TargetPlatform.iOS) {
|
||
return _isLoading
|
||
? const Center(child: CircularProgressIndicator())
|
||
: const UiKitView(
|
||
viewType: 'com.yourcompany.unity_flutter/unityview',
|
||
creationParamsCodec: StandardMessageCodec(),
|
||
);
|
||
} else {
|
||
// 如果不是iOS平台,显示提示信息
|
||
return const Center(
|
||
child: Text('此平台不支持Unity视图,请在iOS设备上运行。'),
|
||
);
|
||
}
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
// 关闭Unity视图
|
||
_unityController.closeUnity();
|
||
super.dispose();
|
||
}
|
||
} |