Flutter集成Unity游戏引擎插件flutter_unity的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter集成Unity游戏引擎插件flutter_unity的使用

简介

flutter_unity 是一个Flutter插件,允许在Flutter项目中嵌入Unity项目。它支持Android和iOS平台。

使用方法

要使用此插件,请在 pubspec.yaml 文件中添加 flutter_unity 作为依赖项。

示例项目

参考提供的示例项目和包含的Unity项目,可以更好地理解如何使用 flutter_unity 插件。

测试

要测试此插件,请按照以下步骤操作:

  1. 运行 git clone https://github.com/Glartek/flutter-unity.git 创建 flutter-unity 的本地副本。
  2. Android Studio 中打开 flutter-unity
Android
  1. 连接你的Android设备并运行项目。
iOS
  1. 配置示例项目和包含的Unity项目。
  2. 连接你的iOS设备并运行项目。

配置Unity项目

Android
  1. 打开 File > Build Settings…,选择 Android 并点击 Switch Platform
  2. 点击 Add Open Scenes
  3. 勾选 Export Project
  4. 点击 Player Settings…,配置以下设置:
    • Resolution and Presentation > Start in fullscreen mode: No
    • Other Settings > Rendering > Graphics APIs: OpenGLES3
    • Other Settings > Configuration > Scripting Backend: IL2CPP
    • Other Settings > Configuration > Target Architectures: ARMv7, ARM64
  5. 关闭 Player Settings 窗口。
  6. 点击 Export 并保存为 unityExport
iOS
  1. 打开 File > Build Settings…,选择 iOS 并点击 Switch Platform
  2. 点击 Add Open Scenes
  3. 点击 Build 并保存为 UnityProject

配置Flutter项目

Android
  1. unityExport 文件夹复制到 <your_flutter_project>/android/unityExport
  2. 运行 flutter pub run flutter_unity:unity_export_transmogrify
  3. 打开 <your_flutter_project>/android/unityExport/build.gradle,检查是否包含 buildTypes { profile {} }。如果没有,请添加以下代码:
    buildTypes {
        profile {}
    }
    
  4. 打开 <your_flutter_project>/android/build.gradle,在 allprojects { repositories {} } 下添加以下代码:
    flatDir {
        dirs "${project(':unityExport').projectDir}/libs"
    }
    
  5. 打开 <your_flutter_project>/android/settings.gradle,添加以下代码:
    include ':unityExport'
    
  6. 打开 <your_flutter_project>/android/app/src/main/AndroidManifest.xml,添加以下权限:
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    

步骤1、2和3必须在每次构建新的Unity项目时重复执行。

iOS
  1. UnityProject 文件夹复制到 <your_flutter_project>/ios/UnityProject,并在 Xcode 中打开 <your_flutter_project>/ios/Runner.xcworkspace
  2. 打开 File > Add Files to “Runner”…,添加 <your_flutter_project>/ios/UnityProject/Unity-iPhone.xcodeproj
  3. 选择 Unity-iPhone/Data,在 Inspectors 窗格中将 Target Membership 设置为 UnityFramework
  4. 选择 Unity-iPhone,选择 PROJECT : Unity-iPhone,在 Build Settings 标签页中配置以下设置:
    • Build Options > Enable Bitcode: No
    • Linking > Other Linker Flags: -Wl,-U,_FlutterUnityPluginOnMessage
  5. 选择 Runner,选择 TARGETS : Runner,在 General 标签页中配置以下设置:
    • Frameworks, Libraries, and Embedded Content:
      Name Embed
      UnityFramework.framework Embed & Sign
  6. 选择 Runner/Runner/Info.plist,配置以下键值对:
    Key Type Value
    io.flutter.embedded_views_preview Boolean YES

步骤1、3和4必须在每次构建新的Unity项目时重复执行。

Flutter与Unity之间的消息传递

Flutter

要发送消息,在 UnityView 小部件中定义 onCreated 回调,并使用从接收的 controller 中的 send 方法。要接收消息,在 UnityView 小部件中定义 onMessage 回调。

Unity

要发送和接收消息,将 FlutterUnityPlugin.cs 包含在项目中,并使用 Messages.SendMessages.Receive 方法。Message 对象有以下成员:

  • id (int):非负数表示接收消息时的源视图,发送消息时的目标视图。发送消息时,也可以设置为负数,表示消息是发给任何现有视图的。
  • data (string):实际的消息内容。

完整示例Demo

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

void main() => runApp(App());

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  [@override](/user/override)
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.push(context,
                MaterialPageRoute(builder: (context) => UnityViewPage()));
          },
          child: Text('Test'),
        ),
      ),
    );
  }
}

class UnityViewPage extends StatefulWidget {
  [@override](/user/override)
  _UnityViewPageState createState() => _UnityViewPageState();
}

class _UnityViewPageState extends State<UnityViewPage> {
  UnityViewController? unityViewController;

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
      ),
      body: UnityView(
        onCreated: onUnityViewCreated,
        onReattached: onUnityViewReattached,
        onMessage: onUnityViewMessage,
      ),
    );
  }

  void onUnityViewCreated(UnityViewController? controller) {
    print('onUnityViewCreated');

    unityViewController = controller;

    // 发送消息给Unity中的Cube对象,调用SetRotationSpeed方法,参数为30
    controller?.send(
      'Cube',
      'SetRotationSpeed',
      '30',
    );
  }

  void onUnityViewReattached(UnityViewController controller) {
    print('onUnityViewReattached');
  }

  void onUnityViewMessage(UnityViewController controller, String? message) {
    print('onUnityViewMessage');

    // 打印从Unity接收到的消息
    print(message);
  }
}

更多关于Flutter集成Unity游戏引擎插件flutter_unity的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Unity游戏引擎插件flutter_unity的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成Unity游戏引擎通常通过flutter_unity插件来实现。以下是一个详细的步骤指南,包括相关代码案例,帮助你完成Flutter与Unity的集成。

步骤 1: 设置Flutter项目

首先,确保你已经安装了Flutter SDK,并创建了一个新的Flutter项目。

flutter create my_flutter_unity_app
cd my_flutter_unity_app

步骤 2: 添加flutter_unity依赖

在你的pubspec.yaml文件中添加flutter_unity依赖。

dependencies:
  flutter:
    sdk: flutter
  flutter_unity: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

步骤 3: 准备Unity项目

  1. 创建一个新的Unity项目,或者打开你现有的Unity项目。
  2. 在Unity中,确保你有一个Build Settings配置好的场景。
  3. 导出Unity项目为一个原生插件。通常,你会导出为Android和iOS平台。

步骤 4: 将Unity项目导出为Flutter插件

对于Android:

  1. 在Unity中,File -> Build Settings,选择Android平台,然后Switch Platform
  2. 设置好Player Settings,然后点击Build,选择导出位置,比如libs/unity.

对于iOS:

  1. 在Unity中,File -> Build Settings,选择iOS平台,然后Switch Platform
  2. 设置好Player Settings,然后点击Build,选择导出位置,比如libs/unity_ios.

步骤 5: 将Unity导出文件集成到Flutter项目中

将导出的Unity文件(通常是.aar文件用于Android和Xcode项目文件用于iOS)复制到Flutter项目的androidios目录下。

  • 对于Android,将.aar文件放到android/app/libs目录下,并在android/app/build.gradle中添加依赖。
dependencies {
    implementation fileTree(dir: "libs", include: ["*.aar"])
    // 其他依赖...
}
  • 对于iOS,将Unity导出的Xcode项目文件(通常是UnityFrameworkUnity-iPhone等)集成到你的Flutter iOS项目中。这通常涉及将文件添加到Xcode项目中,并配置好Build Phases。

步骤 6: 使用flutter_unity_widget

在Flutter中,你可以使用FlutterUnityWidget来嵌入Unity视图。下面是一个简单的示例代码:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Unity Integration'),
        ),
        body: Center(
          child: UnityViewWidget(
            onUnityViewCreated: (controller) {
              // 可以在这里加载Unity场景或发送消息给Unity
              controller.sendMessage('GameObjectName', 'MethodName', 'Message');
            },
          ),
        ),
      ),
    );
  }
}

步骤 7: 运行Flutter项目

确保你已经正确配置了Android和iOS平台,然后运行你的Flutter项目。

flutter run

注意事项

  • 确保你的Unity项目配置正确,包括正确的包名(对于Android)和Bundle Identifier(对于iOS)。
  • 在iOS上,你可能需要配置Info.plist以允许Unity所需的权限,比如相机访问等。
  • 在Android上,确保你已经正确配置了AndroidManifest.xml

通过上述步骤,你应该能够在Flutter应用中成功集成Unity游戏引擎。如果遇到问题,请参考flutter_unity插件的官方文档和社区支持。

回到顶部