【flutter笔记--组件篇】flutter_unity_widget


一、创建一个新的flutter项目

并在该项目文件下新建一个unity文件夹
创建flutter项目

二、在unity目录下新建一个unity项目

1.新建项目
新建unity项目

三、导入unitypackage

1.去github https://github.com/juicycleff/flutter-unity-view-widget 将unityPackages下载下来
下载unitypackages
2.在unity中导入unitypackage.
导入package
在这里插入图片描述
这里看自己情况导入v4或者v4.1.0(我也不知道有什么区别,当练手试试水)
导入packages
导入成功后Assets会多出一个FlutterUnityIntegration文件夹,unity菜单栏会有一个flutter选项


3.给3D模型绑定脚本(这里用的是demo里面的现成脚本),将rotate.cs拖到模型上

四、unity配置

在unity菜单栏 file>building settings,切换Platform为Android,打开Player Settings

五、导出unityLibrary


在导出过程中报错

根据错误提示,打开build.cs
在DoBuildAndroid方法中

//将var options = BuildOptions.AcceptExternalModificationsToPlayer替换

var options = BuildOptions.AllowDebugging;
EditorUserBuildSettings.exportAsGoogleAndroidProject = true;

在DoBuildIOS方法中

//将var options = BuildOptions.AcceptExternalModificationsToPlayer替换
 var options = BuildOptions.AllowDebugging;

然后保存一下,重新导出就可以了

六、导入unityLibrary

导出成功后会在flutter的Android文件下生成一个unityLibrary

然后用AS打开Android文件,在build的过程中会报错提示
build报错
在gradle.properties文件里加上

unityStreamingAssets=.unity3d, google-services-desktop.json, google-services.json, GoogleService-Info.plist 

然后重新build,build成功。再接着运行一下程序看是否有问题
在运行的时候又报错了!!!!

根据错误提示,minSdkVersion 16 改成19,接着运行!然后结合报错!!

提示NDK is not install
这个时候打开local.properties,设置ndk,需要注意的是其中的版本要换成你自己unity的版本,我的是2020.3.30f1c1

ndk.dir=/Applications/Unity/Hub/Editor/2020.3.30f1c1/PlaybackEngines/AndroidPlayer/NDK

再接着运行!终于运行成功!!

七、引入flutter_unity_widget插件

引入插件,pub get,https://pub.flutter-io.cn/packages/flutter_unity_widget查看最新的插件版本

flutter_unity_widget: ^2020.3.25

接着运行一下flutter项目
然后报错!!!!

按照提示,将ext.kotlin_version = ‘1.6.0’
再接着build,运行,然后又又又报错!!!T^T

根据提示包冲突了,那我就在所有引用unity-classes包的地方,将implementation改成compileOnly
再运行一下,终于好了!!T^T

八、flutter_unity_widget运用


import 'package:flutter/material.dart';
import 'package:flutter_unity_widget/flutter_unity_widget.dart';

class UnityTestPage extends StatefulWidget {
  const UnityTestPage({Key? key}) : super(key: key);

  @override
  _UnityTestPageState createState() => _UnityTestPageState();
}

class _UnityTestPageState extends State<UnityTestPage> {
  UnityWidgetController? _unityWidgetController;
  double _sliderValue = 0.0;

  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    _unityWidgetController!.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Test Unity')),
        body: Container(
          width: double.infinity,
          child: Stack(
            children: [
            ///这里需要多看看源码里面的参数
              UnityWidget(
                onUnityCreated: onUnityCreated,
                onUnityMessage: onUnityMessage,
                onUnitySceneLoaded: onUnitySceneLoaded,
                fullscreen: false,
              ),
              Positioned(
                  bottom: 10,
                  left: 20,
                  child: Container(
                    width: 500,
                    child: Column(
                      children: [
                        Slider(
                          onChanged: (value) {
                            setState(() {
                              _sliderValue = value;
                            });
                            setRotationSpeed(value.toString());
                          },
                          value: _sliderValue,
                          min: 0,
                          max: 20,
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            MaterialButton(
                              onPressed: () {
                                _unityWidgetController!.pause();
                              },
                              child: Text("Pause"),
                            ),
                            MaterialButton(
                              onPressed: () {
                                _unityWidgetController!.resume();
                              },
                              child: Text("Resume"),
                            ),
                          ],
                        ),
                      ],
                    ),
                  )),
            ],
          ),
        ),
      ),
    );
  }

  void setRotationSpeed(String speed) {
  //这里需要看看给3d模型绑定的脚本
    _unityWidgetController!.postMessage(
      'Cube',
      'SetRotationSpeed',
      speed,
    );
  }

  void onUnityMessage(message) {
    print('Received message from unity: ${message.toString()}');
  }

  void onUnitySceneLoaded(scene) {
    print('Received scene loaded from unity: ${scene.name}');
    print('Received scene loaded from unity buildIndex: ${scene.buildIndex}');
  }

  // Callback that connects the created controller to the unity controller
  void onUnityCreated(controller) {
    this._unityWidgetController = controller;
  }
}

九、效果

运行程序,看看效果

test

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Flutter中的TextField是一个常用的输入控件,它允许用户在应用程序中输入文本。 TextField通常用于表单中,可以接收用户输入的文本,比如用户名、密码、电子邮件地址等。 以下是一个基本的TextField示例: ```dart TextField( decoration: InputDecoration( hintText: '请输入文本', ), ); ``` 在上面的示例中,我们使用了decoration属性来设置TextField的外观,其中hintText属性用于设置提示文本。 TextField还有许多其他的属性可以设置,比如maxLength(允许输入的最大长度)、keyboardType(键盘类型)、obscureText(是否隐藏输入内容)等等。 下面是一个更完整的TextField示例: ```dart class MyTextField extends StatefulWidget { @override _MyTextFieldState createState() => _MyTextFieldState(); } class _MyTextFieldState extends State<MyTextField> { final TextEditingController _controller = TextEditingController(); @override Widget build(BuildContext context) { return TextField( controller: _controller, maxLength: 10, keyboardType: TextInputType.text, obscureText: true, decoration: InputDecoration( hintText: '请输入文本', labelText: '文本框', prefixIcon: Icon(Icons.text_fields), suffixIcon: IconButton( icon: Icon(Icons.clear), onPressed: () { setState(() { _controller.clear(); }); }, ), border: OutlineInputBorder(), ), onChanged: (value) { print('输入的文本为:$value'); }, ); } } ``` 在上面的示例中,我们使用了TextEditingController来控制TextField的文本内容,maxLength属性限制了用户输入的最大长度为10,keyboardType属性指定了键盘类型为文本类型,obscureText属性设置为true表示隐藏输入内容。 此外,我们还设置了decoration属性来自定义TextField的外观,包括了输入提示文本、标签文本、前缀图标、后缀图标和边框样式等。 最后,我们通过onChanged回调函数来监听用户输入的文本,并打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值