ar_tourism_flutter_unity/lib/unity_widget.dart
2025-05-14 18:24:12 +08:00

89 lines
2.1 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}