flutter_unity_widget 0.1.4 copy "flutter_unity_widget: ^0.1.4" to clipboard
flutter_unity_widget: ^0.1.4 copied to clipboard

outdated

Flutter unity 3D widget for embedding unity in flutter

flutter_unity_widget #

version MIT License PRs Welcome

Watch on GitHub Star on GitHub

Flutter unity 3D widget for embedding unity in flutter. Add a Flutter widget to show unity. Works on Android, iOS in works.

Installation #

First depend on the library by adding this to your packages pubspec.yaml:

dependencies:
  flutter_unity_widget: ^0.1.4

Now inside your Dart code you can import it.

import 'package:flutter_unity_widget/flutter_unity_widget.dart';

Preview #

gif


Setup Project #

For this, there is also a video tutorial, which you can find a here.

Add Unity Project #

  1. Create an unity project, Example: 'UnityDemoApp'.
  2. Create a folder named unity in flutter project folder.
  3. Move unity project folder to unity folder.

Now your project files should look like this.

.
├── android
├── ios
├── lib
├── test
├── unity
│   └── <Your Unity Project>    // Example: UnityDemoApp
├── pubspec.yml
├── README.md

Configure Player Settings #

  1. First Open Unity Project.

  2. Click Menu: File => Build Settings => Player Settings

  3. Change Product Name to Name of the Xcode project, You can find it follow ios/${XcodeProjectName}.xcodeproj.

    Android Platform:

    1. Make sure your Graphics APIs are set to OpenGLES3 with a fallback to OpenGLES2 (no Vulkan)

    2. Change Scripting Backend to IL2CPP.

    3. Mark the following Target Architectures :

      • ARMv7 ✅
      • ARM64 ✅
      • x86 ✅

    IOS Platform:

    1. Other Settings find the Rendering part, uncheck the Auto Graphics API and select only OpenGLES2.
    2. Depending on where you want to test or run your app, (simulator or physical device), you should select the appropriate SDK on Target SDK.

Add Unity Build Scripts and Export #

Copy Build.cs and XCodePostBuild.cs to unity/<Your Unity Project>/Assets/Scripts/Editor/

Open your unity project in Unity Editor. Now you can export unity project with Flutter/Export Android or Flutter/Export IOS menu.

Android will export unity project to android/UnityExport.

IOS will export unity project to ios/UnityExport.


Android Platform Only

  1. After exporting the unity game, open Android Studio and and add the Unity Classes Java .jar file as a module to the unity project. You just need to do this once if you are exporting from the same version of Unity everytime. The .jar file is located in the <Your Flutter Project>/android/UnityExport/lib folder
  2. Next open build.gradle of flutter_unity_widget module and replace the dependencies with
    dependencies {
        implementation project(':UnityExport') // The exported unity project
        implementation project(':unity-classes') // the unity classes module you added from step 1
    }
  1. Next open build.gradle of UnityExport module and replace the dependencies with
    dependencies {
        implementation project(':unity-classes') // the unity classes module you added from step 1
    }
  1. Next open build.gradle of UnityExport module and remove these
    bundle {
        language {
            enableSplit = false
        }
        density {
            enableSplit = false
        }
        abi {
            enableSplit = true
        }
    }

AR Foundation (ANDROID only at the moment) #

If you want to use Unity for integrating Augmented Reality in your Flutter app, a few more changes are required:

  1. Export the Unity Project as previously stated (using the Editor Build script).
  2. Check if the exported project includes all required Unity libraries (.so) files (lib/\<architecture\>/libUnityARCore.so and libarpresto_api.so). There seems to be a bug where a Unity export does not include all lib files. If they are missing, use Unity to build a standalone .apk of your AR project, unzip the resulting apk, and copy over the missing .lib files to the UnityExport module.
  3. Similar to how you've created the unity-classes module in Android Studio, create similar modules for all exported .aar and .jar files in the UnityExport/libs folder (arcore_client.aar, unityandroidpermissions.aar, UnityARCore.aar).
  4. Update the build.gradle script of the UnityExport module to depend on the new modules (again, similar to how it depends on unity-classes).
  5. Finally, update your Dart code build method where you include the UnityWidget and add isARScene: true,. Sadly, this does have the side effect of making your Flutter activity act in full screen, as Unity requires control of your Activity for running in AR, and it makes several modifications to your Activity as a result (including setting it to full screen).

Add UnityMessageManager Support #

Copy UnityMessageManager.cs to your unity project.

Copy this folder JsonDotNet to your unity project.

Copy link.xml to your unity project.


Examples #

Simple Example #

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

class UnityDemoScreen extends StatefulWidget {

  UnityDemoScreen({Key key}) : super(key: key);

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

class _UnityDemoScreenState extends State<UnityDemoScreen>{
  static final GlobalKey<ScaffoldState> _scaffoldKey =
      GlobalKey<ScaffoldState>();
  UnityWidgetController _unityWidgetController;

  Widget build(BuildContext context) {

    return Scaffold(
      key: _scaffoldKey,
      body: SafeArea(
        bottom: false,
        child: WillPopScope(
          onWillPop: () {
            // Pop the category page if Android back button is pressed.
          },
          child: Container(
            color: colorYellow,
            child: UnityWidget(
              onUnityViewCreated: onUnityCreated,
            ),
          ),
        ),
      ),
    );
  }

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

Communicating with and from Unity #

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

class UnityDemoScreen extends StatefulWidget {

  UnityDemoScreen({Key key}) : super(key: key);

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

class _UnityDemoScreenState extends State<UnityDemoScreen>{
  static final GlobalKey<ScaffoldState> _scaffoldKey =
      GlobalKey<ScaffoldState>();
  UnityWidgetController _unityWidgetController;
  bool paused = false;


  Widget build(BuildContext context) {

    return Scaffold(
      key: _scaffoldKey,
      body: Scaffold(
        key: _scaffoldKey,
        appBar: AppBar(
          title: const Text('Unity Flutter Demo'),
        ),
        body: Container(
            child: Stack(
          children: <Widget>[
            UnityWidget(
              onUnityViewCreated: onUnityCreated,
            ),
            Positioned(
              bottom: 40.0,
              left: 80.0,
              right: 80.0,
              child: MaterialButton(
                onPressed: () {

                  if(paused) {
                    _unityWidgetController.resume();
                    setState(() {
                      paused = false;
                    });
                  } else {
                    _unityWidgetController.pause();
                    setState(() {
                      paused = true;
                    });
                  }
                },
                color: Colors.blue[500],
                child: Text(paused ? 'Start Game' : 'Pause Game'),
              ),
            ),
          ],
        )),
      ),
    );
  }

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

API #

  • pause()

Known issues #

  • no iOS support yet
  • Android Export requires several manual changes
  • Using AR will make the activity run in full screen (hiding status and navigation bar).
798
likes
0
pub points
95%
popularity

Publisher

verified publisherxraph.com

Flutter unity 3D widget for embedding unity in flutter

Homepage
Repository (GitHub)
View/report issues

License

unknown (LICENSE)

Dependencies

flutter

More

Packages that depend on flutter_unity_widget