{"id":26071898,"url":"https://github.com/snowballdigital/flutter-unity-view-widget","last_synced_at":"2025-03-09T00:04:57.908Z","repository":{"id":36993315,"uuid":"174713363","full_name":"juicycleff/flutter-unity-view-widget","owner":"juicycleff","description":"Embeddable unity game engine view for Flutter. Advance demo here https://github.com/juicycleff/flutter-unity-arkit-demo","archived":false,"fork":false,"pushed_at":"2024-09-06T13:03:09.000Z","size":309932,"stargazers_count":2148,"open_issues_count":264,"forks_count":525,"subscribers_count":55,"default_branch":"master","last_synced_at":"2024-10-29T14:50:47.238Z","etag":null,"topics":["android-library","flutter","flutter-package","flutter-plugin","game-engine","unity","unity3d","unityframework","widget"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juicycleff.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-09T15:46:01.000Z","updated_at":"2024-10-28T22:24:16.000Z","dependencies_parsed_at":"2023-01-17T12:32:34.820Z","dependency_job_id":"c0a57949-c680-4b6d-bc05-d207700e9a26","html_url":"https://github.com/juicycleff/flutter-unity-view-widget","commit_stats":{"total_commits":264,"total_committers":25,"mean_commits":10.56,"dds":0.4734848484848485,"last_synced_commit":"f51fedc77007f603c5df68820fcf51d04c32e1d9"},"previous_names":["snowballdigital/flutter-unity-view-widget"],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fflutter-unity-view-widget","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fflutter-unity-view-widget/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fflutter-unity-view-widget/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juicycleff%2Fflutter-unity-view-widget/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juicycleff","download_url":"https://codeload.github.com/juicycleff/flutter-unity-view-widget/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242623570,"owners_count":20159706,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-library","flutter","flutter-package","flutter-plugin","game-engine","unity","unity3d","unityframework","widget"],"created_at":"2025-03-09T00:01:38.419Z","updated_at":"2025-03-09T00:04:57.856Z","avatar_url":"https://github.com/juicycleff.png","language":"Dart","funding_links":["https://opencollective.com/ultimate-backend/contribute","https://opencollective.com/ultimate-backend"],"categories":["Open Source Repositories"],"sub_categories":["Embedding"],"readme":"# flutter_unity_widget\n[![All Contributors](https://img.shields.io/badge/all_contributors-4-orange.svg?style=flat-square)](#contributors-)\n\n[![version][version-badge]][package]\n[![MIT License][license-badge]][license]\n[![PRs Welcome][prs-badge]](https://makeapullrequest.com)\n\n[![Watch on GitHub][github-watch-badge]][github-watch]\n[![Star on GitHub][github-star-badge]][github-star]\n\n[![Gitter](https://badges.gitter.im/flutter-unity/community.svg)](https://gitter.im/flutter-unity/community?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge)\n[![Discord](https://img.shields.io/badge/Discord-blue?style=for-the-badge)](https://discord.gg/KmMqD7Sv3K)\n\nFlutter unity 3D widget for embedding unity in flutter. Now you can make awesome gamified features of your app in Unity and get it rendered in a Flutter app both in fullscreen and embeddable mode. Works great on `Android, iPad OS, iOS, Web`.\n\nWindows support is a work in progress.\n\u003cbr /\u003e\n### Notes\n- Use Windows or Mac to export and build your project.  \n  Users on Ubuntu have reported a lot of errors in the Unity export.\n- Emulator support is limited and requires special setup. Please use a physical device for Android and iOS.\n- Supports Unity 2019.4.3 or later, we recommend the latest LTS.\n- Use only OpenGLES3 as Graphics API on Android for AR compatibility.\n\n\n## Notice\nNeed me to respond, tag me [Rex Isaac Raphael](https://github.com/juicycleff). \n\nThis plugin expects you to atleast know how to use Unity Engine. If you have issues with how unity widget is presented, you can please modify your unity project build settings as you seem fit.\n\nMoving forward, versioning of the package will change to match unity releases after proper test. Mind you this does not mean the package\nis not compatible with other versions, it just mean it's been tested to work with a unity version.\n\nWindows coming soon.\n\n## Installation\n\nFirst depend on the library by adding this to your packages `pubspec.yaml`:\n -  Flutter 3.0.0\n```yaml\ndependencies:\n  flutter_unity_widget: ^2022.2.0\n```\n\n\n -  Pre Flutter 3.0.0 (This version will gradually be deprecated)\n```yaml\ndependencies:\n  flutter_unity_widget: ^2022.1.0+7\n```\n\nNow inside your Dart code you can import it.\n\n```dart\nimport 'package:flutter_unity_widget/flutter_unity_widget.dart';\n```\n\nYou will need to open and export a Unity project, even for running the example. Your build will fail if you only include the widget in Flutter!\n\n\n## Preview\n\n30 fps gifs, showcasing communication between Flutter and Unity:\n\n![gif](https://github.com/juicycleff/flutter-unity-view-widget/blob/master/files/preview_android.gif?raw=true)\n![gif](https://github.com/juicycleff/flutter-unity-view-widget/blob/master/files/preview_ios.gif?raw=true)\n\n\u003cbr /\u003e\n\n## Setup \n\nIn the tutorial below, there are steps specific to each platform, denoted by a :information_source: icon followed by\nthe platform name (Android or iOS). You can click on its icon to expand it.\n\n### Prerequisites\n\n- An existing Flutter project (if there is none, you can [create a new one](https://flutter.dev/docs/get-started/test-drive#create-app))\n\n- An existing Unity project (if there is none, you can [create a new one](https://learn.unity.com/tutorial/create-your-first-unity-project)).\n\n- A `fuw-XXXX.unitypackage` file, found in the [*unitypackages*](https://github.com/juicycleff/flutter-unity-view-widget/tree/master/unitypackages) folder.\nTry to use the most recent unitypackage available.\n\n\n### Unity project setup\nThese instructions assume you are using a new Unity project. If you open the example project from this repository, you can move on to the next section **Unity Exporting**.\n\n1. Create a folder named *unity* in your Flutter project folder and move the Unity project into there.  \n  The Unity export will modify some files in  the `/android` and `/ios` folders of your flutter project. If your Unity project is in a different location the export might (partially) fail.\n\n  \u003e The expected path is *\u003cflutter-project\u003e/unity/__project-name__/...*\n\n\n2. Make sure you have downloaded a *fuw-XXXX.unitypackage* file mentioned in \u003cb\u003eprerequisites\u003c/b\u003e.\n\n3. Using Unity (hub), open the Unity project.\n  Go to **Assets \u003e Import Package \u003e Custom Package** and select the downloaded *fuw-XXXX.unitypackage* file. Click on **Import**.\n\n4. Go to **File \u003e Build Settings \u003e Player Settings**\n    and change the following under the **Other settings \u003e Configuration** section:\n\n  - In **Scripting Backend**, change to IL2CPP\n\n  - (Android) **Target Architectures**, select ARMv7 and ARM64\n\n  - (Android) For the best compatibility set **Active Input Handling** to `Input Manager (Old)` or `Both`.  \n    (The new input system has some issues with touch input on Android)\n\n  - (iOS) Select **Target SDK** depending on where you will run your app (simulator or physical device).  \n    We recommend starting with a physical device and the `Device SDK` setting, due to limited simulator support.\n\n  - (Web) Set \u003cb\u003ePublishing settings \u003e Compression format\u003c/b\u003e to Brotli or Disabled.  \n  Some users report that Unity gets stuck on the loading screen with the Gzip setting, due to MIME type errors.\n\n  \u003cimg src=\"https://raw.githubusercontent.com/juicycleff/flutter-unity-view-widget/master/files/Screenshot%202019-03-27%2007.31.55.png\" width=\"400\" /\u003e\n\n5. In **File \u003e Build Settings**, make sure to have at least 1 scene added to your build.\n\n\nSome options in the **Build settings** window get overridden by the plugin's export script.\nAttempting to change settings like `Development Build`, `Script Debugging` and `Export project` in this window will not make a difference.\nIf you end up having to change a build setting that doesn't seem to respond, take a lookat the export script `FlutterUnityIntegration\\Editor\\Build.cs`.\n\n### Unity exporting\n\n1. After importing the unitypackage, you should now see a **Flutter** option at the top of the Unity editor.\n\n2. Click on **Flutter** and select the appropriate export option:\n\n  - For android use **Export Android Debug** or **Export Android Release**.  \n   This will export to *android/unityLibrary*.\n  - For iOS use **Export iOS Debug** or **Export iOS Release**.  \n   This will export to *ios/UnityLibrary*.\n  - Do not use **Flutter \u003e Export _Platform_ plugin** as it was specially added to work with [`flutter_unity_cli`](https://github.com/juicycleff/flutter_unity_cli) for larger projects.\n \n  \u003cimg src=\"https://github.com/juicycleff/flutter-unity-view-widget/blob/master/files/Unity_Build_Options.png?raw=true\" width=\"400\" /\u003e\n \n   If you use git, you will probably want to add these unityLibrary folders to your gitignore file.\n   These folders can get huge and are not guaranteed to work on another computer.\n\n\n\n\n\n  Proceed to the next section to handle iOS and Android specific setup after the export.\n\n### Platform specific setup (after Unity export)\nAfter exporting Unity, you will need to make some small changes in your iOS or Android project.  \nYou will likely need to do this **only once**. These changes remain on future Unity exports.\n\n\u003cdetails\u003e\n\u003csummary\u003e:information_source: \u003cb\u003eAndroid\u003c/b\u003e\u003c/summary\u003e\n  \n1. Setting the Android NDK\n\n  - If you have Unity and Flutter installed on the same machine, the easiest approach is to use the path of the NDK Unity uses. You can find the path to the NDK in Unity under `Edit -\u003e Preferences -\u003e External Tool`:\n\n  ![NDK Path](files/ndkPath.png)\n\n  - Copy the path and paste it into your flutter project at `android/local.properties` as `ndk.dir=`.  \n  (For windows you will need to replace `\\` with `\\\\`.)  \n  Don't simply copy and paste this, make sure it the path matches your Unity version!  \n```properties\n    // mac\n    ndk.dir=/Applications/Unity/Hub/Editor/2020.3.19f1/PlaybackEngines/AndroidPlayer/NDK\n    // windows\n    ndk.dir=C:\\\\Program Files\\\\Unity\\\\Hub\\\\Editor\\\\2021.3.13f1\\\\Editor\\\\Data\\\\PlaybackEngines\\\\AndroidPlayer\\\\NDK\n```\n\n\n  - With the above setup, you shouldn't have to define any NDK version or setting in gradle files.  \n   If you don't have Unity on the device making your Flutter buids, you can instead define it in `android/app/build.gradle`.\n```gradle\n\nandroid {\n\n  ndkVersion \"21.3.6528147\"\n}\n```\n  - To find the exact version that Unity uses, check `source.properties` at the NDK path described above.  \n\n\n2. Depending on your gradle version, you might need to make sure the `minSdkVersion` set in `android\\app\\build.gradle` matches the version that is set in Unity.  \nCheck the **Minimum API Level** setting in the Unity player settings, and match that version.\n\n3. (optional) Fixing Unity plugins.  \nThe Unity widget will function without this step, but some Unity plugins like ArFoundation will throw `mUnityPlayer` errors on newer Unity versions.  \n\n    This is needed for Unity 2020.3.46+, 2021.3.19 - 2021.3.20 and 2022.2.4 - 2022.3.18.  \nThis requires a flutter_unity_widget version that is newer than 2022.2.1.  \n\n\n- 3.1. Open the `android/app/build.gradle` file and add the following:\n\n```diff\n     dependencies {\n         // build.gradle\n+        implementation project(':flutter_unity_widget')\n         // build.gradle.kts (Flutter 3.29+)\n+        implementation(project(\":flutter_unity_widget\"))\n     }\n```\n- 3.2. Edit your android MainActivity file.  \nThe default location for Flutter is `android/app/src/main/kotlin/\u003capp identifier\u003e/MainActivity.kt`.\n\n  If you use the default flutter activity, change it to inherit `FlutterUnityActivity`:\n```diff\n// MainActivity.kt\n\n+ import com.xraph.plugin.flutter_unity_widget.FlutterUnityActivity;\n\n+ class MainActivity: FlutterUnityActivity() {\n- class MainActivity: FlutterActivity() {\n```\n\n- 3.2. (alternative) If you use a custom or modified Activity, implement the `IFlutterUnityActivity` interface instead.\n\n```kotlin\n// MainActivity.kt\n\n// only do this if your activity does not inherit FlutterActivity\n\nimport com.xraph.plugin.flutter_unity_widget.IFlutterUnityActivity;\n\nclass MainActivity: CustomActivity(), IFlutterUnityActivity {\n    // unity will try to read this mUnityPlayer property\n    @JvmField \n    var mUnityPlayer: java.lang.Object? = null;\n\n    // implement this function so the plugin can set mUnityPlayer\n    override fun setUnityPlayer(unityPlayer: java.lang.Object?) {\n        mUnityPlayer = unityPlayer;\n    }\n}\n```\n\n\n4. The Unity export script automatically sets the rest up for you. You are done with the Android setup.  \nBut if you want to manually set up the changes made by the export, continue.\n  \n\u003cdetails\u003e \n\u003csummary\u003e Optional manual Android setup \u003c/summary\u003e \n\n5. Open the *android/settings.gradle* file and change the following:\n\n```diff\n// build.gradle\n+    include \":unityLibrary\"\n+    project(\":unityLibrary\").projectDir = file(\"./unityLibrary\")\n\n// build.gradle.kts (Flutter 3.29+)\n+    include(\":unityLibrary\")\n+    project(\":unityLibrary\").projectDir = file(\"./unityLibrary\")\n```\n\n6. Open the *android/app/build.gradle* file and change the following:\n\n```diff\n     dependencies {\n          // app/build.gradle\n+        implementation project(':unityLibrary')\n         // app/build.gradle.kts (Flutter 3.29+)\n+        implementation(project(\":unityLibrary\"))\n     }\n```\n\n7. open the *android/build.gradle* file and change the following:\n\n```diff\nallprojects {\n    repositories {\n+       flatDir {\n            // build.gradle\n+           dirs \"${project(':unityLibrary').projectDir}/libs\"\n            // build.gradle.kts (Flutter 3.29+)\n+           dirs(file(\"${project(\":unityLibrary\").projectDir}/libs\"))\n+       }\n        google()\n        mavenCentral()\n    }\n}\n```\n\n8. If you need to build a release package, open the *android/app/build.gradle* file and change the following:\n\n```diff\n     buildTypes {\n         release {\n             signingConfig signingConfigs.debug\n         }\n+        debug {\n+            signingConfig signingConfigs.debug\n+        }\n+        profile {\n+            signingConfig signingConfigs.debug\n+        }\n+        innerTest {\n+            matchingFallbacks = ['debug', 'release']\n+        }\n+   }\n```\n\n\u003e The code above use the `debug` signConfig for all buildTypes, which can be changed as you well if you need specify signConfig.\n\n9. If you use `minifyEnabled true` in your *android/app/build.gradle* file, open the *android/unityLibrary/proguard-unity.txt* and change the following:\n\n```diff\n+    -keep class com.xraph.plugin.** {*;}\n```\n\n10. If you want Unity in it's own activity as an alternative, open the *android/app/src/main/AndroidManifest.xml* and change the following:\n\n```diff\n+    \u003cactivity\n+        android:name=\"com.xraph.plugin.flutter_unity_widget.OverrideUnityActivity\"\n+        android:theme=\"@style/UnityThemeSelector\"\n+        android:screenOrientation=\"fullSensor\"\n+        android:launchMode=\"singleTask\"\n+        android:configChanges=\"mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density\"\n+        android:hardwareAccelerated=\"false\"\n+        android:process=\":Unity\"\u003e\n+    \u003cmeta-data android:name=\"com.xraph.plugin.flutter_unity_widget.OverrideUnityActivity\" android:value=\"true\" /\u003e\n+    \u003c/activity\u003e\n```\n-----\n\u003c/details\u003e\n\n-----\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n \u003csummary\u003e:information_source: \u003cb\u003eiOS\u003c/b\u003e\u003c/summary\u003e\n  \n  1. Open the *ios/Runner.xcworkspace* (workspace, not the project) file in Xcode, right-click on the Navigator (not on an item), go to **Add Files to \"Runner\"** and add\n  the *ios/UnityLibrary/Unity-Iphone.xcodeproj* file.\n  \n  \u003cimg src=\"https://github.com/juicycleff/flutter-unity-view-widget/blob/master/files/workspace.png\" width=\"400\" /\u003e\n  \n  2. (Optional) Select the *Unity-iPhone/Data* folder and change the Target Membership for Data folder to UnityFramework.\n  \n  \u003cimg src=\"https://github.com/juicycleff/flutter-unity-view-widget/blob/master/files/change_target_membership_data_folder.png\" width=\"400\" /\u003e\n  \n  3.1. If you're using Swift, open the *ios/Runner/AppDelegate.swift* file and change the following:\n\n```diff\n     import UIKit\n     import Flutter\n+    import flutter_unity_widget\n\n     @UIApplicationMain\n     @objc class AppDelegate: FlutterAppDelegate {\n         override func application(\n             _ application: UIApplication,\n             didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n         ) -\u003e Bool {\n+            InitUnityIntegrationWithOptions(argc: CommandLine.argc, argv: CommandLine.unsafeArgv, launchOptions)\n\n             GeneratedPluginRegistrant.register(with: self)\n             return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n         }\n     }\n```\n\n   3.2. If you're using Objective-C, open the *ios/Runner/main.m* file and change the following:\n```diff\n+    #import \"flutter_unity_widget.swift.h\"\n\n     int main(int argc, char * argv[]) {\n          @autoreleasepool {\n+             InitUnityIntegration(argc, argv);\n              return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n          }\n     }\n```\n\n  4. Add the *UnityFramework.framework* file as a library to the Runner project.\n  \n  \u003cimg src=\"https://github.com/juicycleff/flutter-unity-view-widget/blob/master/files/libraries.png\" width=\"400\" /\u003e\n  \n  5. Unity plugins that make use of native code (Vuforia, openCV, etc.) might need to be added to Runner like UnityFramework.  \n  Check the contents of the `/ios/UnityLibrary/Frameworks/` directory. Any `\u003cname\u003e.framework` located in (subdirectories of) this directory is a framework that you can add to Runner.\n\n  6. Make sure pods are installed after your Unity export, either using `flutter run` or by running `pod install` in the ios folder.\n\n  7. If you use Xcode 14 or newer, and Unity older than 2021.3.17f1 or 2022.2.2f1, your app might crash when running from Xcode.  \n    Disable the `Thread Performance Checker` feature in Xcode to fix this.  \n    - In Xcode go to `Product \u003e Scheme \u003e Edit Scheme...`  \n    - Now With `Run` selected on the left, got to the `Diagnostics` tab and uncheck the checkbox for `Thread Performance Checker`. \n-----\n\u003c/details\u003e\n\n### Setup AR\n\n![gif](https://github.com/juicycleff/flutter-unity-view-widget/blob/master/files/ar-demo.gif?raw=true)\n\n The following setup for AR is done after making an export from Unity.\n\n\u003cb\u003eWarning: Flutter 3.22 has introduced a crash when using AR on Android \u003c 13 [#957](https://github.com/juicycleff/flutter-unity-view-widget/issues/957)\u003c/b\u003e\n\n\n\u003cdetails\u003e\n \u003csummary\u003e:information_source: \u003cb\u003eAR Foundation Android\u003c/b\u003e\u003c/summary\u003e\n\n  1. Check the version of the `XR Plugin Management` in the Unity package manager. Versions `4.3.1 - 4.3.3` contain a bug that breaks Android exports.  \n  Make sure to use a version \u003c=`4.2.2` or \u003e=`4.4`.  \n  You might have to manually change the version in `\u003cunity project\u003e/Packages/manifest.json` for `\"com.unity.xr.management\"`.\n\n\n  2. You can check the `android/unityLibrary/libs` folder to see if AR was properly exported. It should contain files similar to `UnityARCore.aar`, `ARPresto.aar`, `arcore_client.aar` and `unityandroidpermissions.aar`.  \n\n     If your setup and export was done correctly, your project should automatically load these files.  \n     If it doesn't, check if your `android/build.gradle` file contains the `flatDir` section added in the android setup step 7.\n \n  3. If your `XR Plugin Management` plugin is version 4.4 or higher, Unity also exports the xrmanifest.androidlib folder.\n     Make sure to include it by adding the following line to `android/settings.gradle`\n     ```\n     // settings.gradle\n     include \":unityLibrary:xrmanifest.androidlib\"\n\n     // settings.gradle.kts (Flutter 3.29+)\n     include(\":unityLibrary:xrmanifest.androidlib\")\n     ```\n  4. With some Unity versions AR might crash at runtine with an error like:  \n   `java.lang.NoSuchFieldError: no \"Ljava/lang/Object;\" field \"mUnityPlayer\" in class`.  \n   See the Android setup step 3 on how to edit your MainActivity to fix this.  \n\n-----\n\u003c/details\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e:information_source: \u003cb\u003eAR Foundation iOS\u003c/b\u003e\u003c/summary\u003e\n\n1. Open the *ios/Runner/Info.plist* and add a camera usage description.  \nFor example: \n```diff\n     \u003cdict\u003e\n+        \u003ckey\u003eNSCameraUsageDescription\u003c/key\u003e\n+        \u003cstring\u003e$(PRODUCT_NAME) uses Cameras\u003c/string\u003e\n     \u003c/dict\u003e\n```\n-----\n\u003c/details\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e:information_source: \u003cb\u003eVuforia Android\u003c/b\u003e\u003c/summary\u003e\n\n1. Your export should contain a Vuforia library in the `android/unityLibrary/libs/` folder. Currently named `VuforiaEngine.aar`.\n\n     If your setup and export was done correctly, your project should automatically load this file.  \n     If it doesn't, check if your `android/build.gradle` file contains the `flatDir` section added in the android setup step 7.\n\nIn case this gets outdated or broken, check the [Vuforia documentation](https://developer.vuforia.com/library/unity-extension/using-vuforia-engine-unity-library-uaal#android-specific-steps)\n\n-----\n\u003c/details\u003e\n\n\u003cdetails\u003e\n \u003csummary\u003e:information_source: \u003cb\u003eVuforia iOS\u003c/b\u003e\u003c/summary\u003e\n\nThese steps are based on these [Vuforia docs](https://developer.vuforia.com/library/unity-extension/using-vuforia-engine-unity-library-uaal#ios-specific-steps) and [this comment](https://github.com/juicycleff/flutter-unity-view-widget/issues/314#issuecomment-785302253)\n\n1. Open the *ios/Runner/Info.plist* and add a camera usage description.  \nFor example: \n```diff\n     \u003cdict\u003e\n+        \u003ckey\u003eNSCameraUsageDescription\u003c/key\u003e\n+        \u003cstring\u003e$(PRODUCT_NAME) uses Cameras\u003c/string\u003e\n     \u003c/dict\u003e\n```\n2. In Xcode, \nSelect `Runner` \u003e `General` tab.  \nIn `Frameworks, Libraries, and Embedded content` add the Vuforia frameworks. This is where you added *UnityFramework.framework* in step 4 of the iOS setup.\n\n    You should be able to find them in\n`/ios/UnityLibrary/Frameworks/com.ptc.vuforia.engine/Vuforia/Plugins/iOS/`.  \nCurrently these are \n    - `Vuforia.framework`  \n    - `UnityDriver.framework`\n\n3. To support Vuforia target databases, move the `Unity-iPhone/Vuforia` folder from Unity-iPhone to Runner. Then set `Target Membership` of this folder to Runner.\n\n4. Make sure pods are installed after your Unity export, either using `flutter run` or by running `pod install` in the ios folder.\n\n-----\n\u003c/details\u003e\n\n## Emulators\nWe recommend using a physical iOS or Android device, as emulator support is limited.  \nBelow are the limited options to use an emulator.\n\n\u003cdetails\u003e\n\u003csummary\u003e \u003cb\u003eiOS Simulators\u003c/b\u003e \u003c/summary\u003e\n\nThe `Target SDK` option in the Unity player settings is important here.  \n- `Device SDK` exports an ARM build. (Which does **NOT** work on ARM simulators)  \n- `Simulator SDK` exports and x86 build for simulators.  \n\n\nIf you use ARKit or ARFoundation you are out of luck, iOS simulators do NOT support ARKit.\n\nThe rest depends on the type of processor in your mac:  \n  \n### (Apple Silicon) Run it on mac directly  \n\n1. Export from Unity using `Device SDK` as target.  \n2. In Xcode, go to the General tab of Runner.  \n3. In Supported destinations add `Mac (Designed for iPhone)` or `Mac (Designed for iPad)`.  \n4. Now select this as the target device to run on.  \n5. You can now run the app directly on your mac instead of a simulator.  \n\n### (Intel \u0026 Apple Silicon) Use an x86 simulator  \n1. Set `Simulator SDK` in the Unity player settings.  \n2. Make sure there are no AR or XR packages included in the Unity package manager.   \n  (You will get the error `symbol not found in flat namespace '_UnityARKitXRPlugin_PluginLoad` otherwise)  \n  \n3. (Apple Silicon) Get Xcode to use a Rosetta emulator.  \n  The next step assumes Xcode 14.3 or newer, if you use an older version look up how to start Xcode using Rosetta instead.\n  - In Xcode go to `Product -\u003e Destination -\u003e Destination Architectures` and make sure Rosetta destinations are visible.  \n4. Now you need to check the architecture settings in Xcode.\n5. Select `Unity-iPhone` and go to `Build settings` -\u003e `Architectures`.  \n  If you exported Unity with the Simulator SDK, it should show only `x86_64` for architectures.  \n6. Now select `Runner` and change the architecture to exactly match Unity-iPhone.  \n  Make sure `x86_64` is the only entry, not one of multiple.\n7. Now select `Pods` and click `flutter_unity_widget` in targets.  \n  Go to Architectures in build settings again and set `Build Active Architecture Only` to `YES`.  \n  (We want this to only use the active x86_64, not fall back to arm.)   \n8. Run `Product -\u003e Clean Build Folder` to make sure the new architecture settings are used.  \n9. Now you should be able to launch Runner on a Simulator using Rosetta.  \n  On Xcode 14.3 or higher the simulator should have `(Rosetta)` in the name.\n10. Depending on your Flutter plugins, you might have to change the architecture for other installed Pods as well.  \n\n-----\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e \u003cb\u003eAndroid emulators\u003c/b\u003e\u003c/summary\u003e\n  \nUnity only supports ARM build targets for Android. However most Android emulators are x86 which means they simply won't work.  \n\n\n- **Computer with ARM processor**  \nIf your computer has an ARM processor (e.g. Apple Silicon, Qualcomm) you should be able to emulate Android without issue.  \nCreate a virtual device using Android studio and make sure that the system image has an ABI that includes 'arm'.\n\n  On macs with Apple Silicon (M1, M2), ARM emulators should be the default install option.  \n\n  This was tested on Mac, but not on Linux or Windows.\n\n- **Computer with x86/x64 processor**  \nIf you computer does not have an ARM processor, like most computers running on Intel or AMD, your options are limited. \n  \n  You have 2 options:  \n  - Download an ARM emulator from Android Studio anyway.  \n    While adding a virtual device in android studio, on the 'System image' screen, select 'other images' and make sure to use and ABI that includes 'arm'.  \n  The emulator will likely crash immediately or run extremely slow.  \n  **This is not recommended.**  \n  - Use the Chrome OS architecture  \n  This is not officialy supported by Unity and there is no guarantee that it will work, but the Chrome OS target does seem to work on x86 Android emulators.  \n  **Expect (visual) glitches and bugs**  \n    - Enable`x86 (Chrome OS)` and `x86-64 (Chrome OS)` in the Unity player settings before making an export.  \n    You might now be able to run on an regular Android emulator.  \n    - Disable these settings again if you want to publish your app.  \n\n-----\n\u003c/details\u003e\n\n  \n## Communicating \n\n### Flutter-Unity\n\n1. On a `UnityWidget` widget, get the `UnityWidgetController` received by the `onUnityCreated` callback.\n\n2. Use the method `postMessage` to send a string, using the GameObject name and the name of a behaviour method that should be called.\n\n### Unity-Flutter\n\n1. Select the GameObject that should execute the communication and go to **Inspector \u003e Add Component \u003e Unity Message Manager**.\n\n\u003cimg src=\"https://i.stack.imgur.com/1gSOy.png\" width=\"400\" /\u003e\n\n2. Create a new `MonoBehaviour` subclass and add to the same GameObject as a script.\n\n3. On this new behaviour, call `GetComponent\u003cUnityMessageManager\u003e()` to get a `UnityMessageManager`.\n\n4. Use the method `SendMessageToFlutter` to send a string. Receive this message using the `onUnityMessage` callback of a `UnityWidget`.\n\n\n\n\n## Examples\n### Simple Example\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:flutter_unity_widget/flutter_unity_widget.dart';\n\nvoid main() {\n  runApp(\n    const MaterialApp(\n      home: UnityDemoScreen(),\n    ),\n  );\n}\n\nclass UnityDemoScreen extends StatefulWidget {\n  const UnityDemoScreen({Key? key}) : super(key: key);\n\n  @override\n  State\u003cUnityDemoScreen\u003e createState() =\u003e _UnityDemoScreenState();\n}\n\nclass _UnityDemoScreenState extends State\u003cUnityDemoScreen\u003e {\n  static final GlobalKey\u003cScaffoldState\u003e _scaffoldKey =\n      GlobalKey\u003cScaffoldState\u003e();\n  UnityWidgetController? _unityWidgetController;\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      key: _scaffoldKey,\n      body: SafeArea(\n        bottom: false,\n        child: WillPopScope(\n          onWillPop: () async {\n            // Pop the category page if Android back button is pressed.\n            return true;\n          },\n          child: Container(\n            color: Colors.yellow,\n            child: UnityWidget(\n              onUnityCreated: onUnityCreated,\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n\n  // Callback that connects the created controller to the unity controller\n  void onUnityCreated(controller) {\n    _unityWidgetController = controller;\n  }\n}\n\n```\n\u003cbr /\u003e\n\n### Communicating with and from Unity\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:flutter_unity_widget/flutter_unity_widget.dart';\n\nvoid main() =\u003e runApp(const MyApp());\n\nclass MyApp extends StatefulWidget {\n  const MyApp({Key? key}) : super(key: key);\n\n  @override\n  State\u003cMyApp\u003e createState() =\u003e _MyAppState();\n}\n\nclass _MyAppState extends State\u003cMyApp\u003e {\n  static final GlobalKey\u003cScaffoldState\u003e _scaffoldKey =\n      GlobalKey\u003cScaffoldState\u003e();\n  UnityWidgetController? _unityWidgetController;\n  double _sliderValue = 0.0;\n\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: Scaffold(\n        key: _scaffoldKey,\n        appBar: AppBar(\n          title: const Text('Unity Flutter Demo'),\n        ),\n        body: Card(\n          margin: const EdgeInsets.all(8),\n          clipBehavior: Clip.antiAlias,\n          shape: RoundedRectangleBorder(\n            borderRadius: BorderRadius.circular(20.0),\n          ),\n          child: Stack(\n            children: \u003cWidget\u003e[\n              UnityWidget(\n                onUnityCreated: onUnityCreated,\n                onUnityMessage: onUnityMessage,\n                onUnitySceneLoaded: onUnitySceneLoaded,\n                fullscreen: false,\n              ),\n              Positioned(\n                bottom: 20,\n                left: 20,\n                right: 20,\n                // \u003cYou need a PointerInterceptor here on web\u003e\n                child: Card(\n                  elevation: 10,\n                  child: Column(\n                    children: \u003cWidget\u003e[\n                      const Padding(\n                        padding: EdgeInsets.only(top: 20),\n                        child: Text(\"Rotation speed:\"),\n                      ),\n                      Slider(\n                        onChanged: (value) {\n                          setState(() {\n                            _sliderValue = value;\n                          });\n                          setRotationSpeed(value.toString());\n                        },\n                        value: _sliderValue,\n                        min: 0,\n                        max: 20,\n                      ),\n                    ],\n                  ),\n                ),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  // Communcation from Flutter to Unity\n  void setRotationSpeed(String speed) {\n    _unityWidgetController?.postMessage(\n      'Cube',\n      'SetRotationSpeed',\n      speed,\n    );\n  }\n\n  // Communication from Unity to Flutter\n  void onUnityMessage(message) {\n    print('Received message from unity: ${message.toString()}');\n  }\n\n  // Callback that connects the created controller to the unity controller\n  void onUnityCreated(controller) {\n    _unityWidgetController = controller;\n  }\n\n  // Communication from Unity when new scene is loaded to Flutter\n  void onUnitySceneLoaded(SceneLoaded? sceneInfo) {\n    if (sceneInfo != null) {\n      print('Received scene loaded from unity: ${sceneInfo.name}');\n      print(\n          'Received scene loaded from unity buildIndex: ${sceneInfo.buildIndex}');\n    }\n  }\n}\n\n```\n\n## Props\n - `fullscreen` (Enable or disable fullscreen mode on Android)\n\n## API\n - `pause()` (Use this to pause unity player)\n - `resume()` (Use this to resume unity player)\n - `unload()` (Use this to unload unity player) *Requires Unity 2019.4.3 or later\n - `quit()` (Use this to quit unity player)\n - `postMessage(String gameObject, methodName, message)` (Allows you invoke commands in Unity from flutter)\n - `onUnityMessage(data)` (Unity to flutter binding and listener)\n - `onUnityUnloaded()` (Unity to flutter listener when unity is unloaded)\n - `onUnitySceneLoaded(String name, int buildIndex, bool isLoaded, bool isValid,)` (Unity to flutter binding and listener when new scene is loaded)\n\n ## Troubleshooting\n\n**Location:** Unity\n\n**Error:**\n\n```\nMultiple precompiled assemblies with the same name Newtonsoft.Json.dll included on the current platform. Only one assembly with the same name is allowed per platform. (Assets/FlutterUnityIntegration/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll)\n\nPrecompiledAssemblyException: Multiple precompiled assemblies with the same name Newtonsoft.Json.dll included on the current platform. Only one assembly with the same name is allowed per platform.\n```\n\n**Solution:**\nLocate the listed dll file, in this case:\n`Assets/FlutterUnityIntegration/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll`\n\n- Option 1:\nDelete the dll file or rename the file extension (e.g. `.dll.txt`) to stop it from being imported.\n- Option 2:\nUninstall the package that conflicts in the Unity package manager (usually Version control, or Collab).\nThe exact package can be found by looking for newtonsoft in `package-lock.json`\n\n---\n\n\n**Location:** Unity\n\n**Error:**\n\n```\nThe type or namespace name 'Newtonsoft' could not be found (are you missing a using directive or an assembly reference?)\nThe type or namespace name 'JObject' could not be found (are you missing a using directive or an assembly reference?)\nThe type or namespace name 'JToken' could not be found (are you missing a using directive or an assembly reference?)\nThe type or namespace name 'JToken' could not be found (are you missing a using directive or an assembly reference?)\n```\n\n**Solution:**\n\nInclude the Newtonsoft JsonDotNet library.\nIt is likely already included in your project with a wrong file extension:\n`Assets/FlutterUnityIntegration/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll.txt`\nRename the `.dll.txt` extension to `.dll` in your file explorer and open Unity again.\n\nAlternatively you can manually add [the library](https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html) from the Unity package manager.\n\n---\n\n\n**Location:** Unity\n\n**Error:**\n\n```\nInvalidOperationException: The build target does not support build appending.\n```\n\n**Solution:**\n\n1. Open the *unity/__project-name__/Assets/FlutterUnityIntegration/Editor/Build.cs* file.\n\n1.1. On line 48, change the following:\n\n```diff\n-    var options = BuildOptions.AcceptExternalModificationsToPlayer;\n+    var options = BuildOptions.AllowDebugging;\n+    EditorUserBuildSettings.exportAsGoogleAndroidProject = true;\n```\n\n1.2. On line 115, change the following:\n\n```diff\n-    var options = BuildOptions.AcceptExternalModificationsToPlayer;\n+    var options = BuildOptions.AllowDebugging;\n```\n\n---\n\n**Location:** Android Studio\n\n**Error:**\n\n```\nminSdkVersion XX cannot be smaller than version 19 declared in library \n    \\ [:flutter_unity_widget] .../AndroidManifest.xml as the library might be using \n    \\ APIs not available in XX\n```\n\n**Solution:**\n\n1. Open the *android/app/build.gradle* file and change the following:\n\n```diff\n-    minSdkVersion XX\n+    minSdkVersion 19\n```\n\n---\n\n**Location**: Android Studio\n\n**Error:**\n\n```\ne: .../FlutterUnityWidgetBuilder.kt: (15, 42): Expecting a parameter declaration\ne: .../FlutterUnityWidgetBuilder.kt: (23, 25): Expecting an argument\ne: .../FlutterUnityWidgetController.kt: (22, 44): Expecting a parameter declaration\ne: .../FlutterUnityWidgetFactory.kt: (13, 58): Expecting a parameter declaration\n```\n\n**Solution:** \n\n1. Open the *android/build.gradle* file and change the following:\n\n```diff\n-    ext.kotlin_version = '1.3.50'\n+    ext.kotlin_version = '1.4.31'\n```\n\n---\n\n**Location:** Android Studio\n\n**Error:**\n\n```\nUnable to find a matching variant of project :unityLibrary:\n```\n\n**Solution:**\n\n1. Open the *android/app/build.gradle* file and change the following:\n\n```diff\n     lintOptions {\n         disable 'InvalidPackage'\n+        checkReleaseBuilds false\n     }\n```\n \n  \n \n## Flavors\n\n### Recommendation\n\nThe easiest way to apply flavors for your app would be: [flutter_flavorizr](https://pub.dev/packages/flutter_flavorizr).\n\nIf you use flavors in your app you will notice that especially iOS crashes while running or building your app! \nHere are the necessary steps for flavored apps:\n\n### Android\n\nNo changes needed. Flavors are applied without any additional setups.\n\n### iOS\n\nFor your Unity iOS-Build you have to add your flavors to your Unity iOS Configuration.\n\n1. Check your actual `Runner` (your app) configurations. If you have for example the flavors:\n\n- dev\n- prod\n\nYour `Runner` configurations are looking like this:\n\n![iOS Runner Config](https://raw.githubusercontent.com/juicycleff/flutter-unity-view-widget/master/files/iOSRunnerConfig.png)\n\nSo you have the flavors:\n\n- `Debug-dev`\n- `Profile-dev`\n- `Release-dev`\n- `Debug-prod`\n- `Profile-prod`\n- `Release-prod`\n\nThese flavors needs to be added to your `Unity-IPhone` project.\n\n2. Go into your `Unity-IPhone` project -\u003e PROJECT `Unity-IPhone` -\u003e Info:\n\n![Unity-IPhone](https://raw.githubusercontent.com/juicycleff/flutter-unity-view-widget/master/files/UnityIPhone.png)\n\nHere you can see in the Configurations section only:\n\n- `Release`\n- `ReleaseForProfiling`\n- `ReleaseForRunning`\n- `Debug`\n\n3. Copy `Debug` configuration twice and rename them to `Debug-dev` and the second to `Debug-prod`.\n\nYou can do that by selecting `+` and duplicate the configuration like this:\n\n![Duplicate configuration](https://raw.githubusercontent.com/juicycleff/flutter-unity-view-widget/master/files/DuplicateConfig.png)\n\n4. Repeat this with `Release` to `Release-dev` and `Release-prod`.\n\n5. Repeat this with `Release` to `Profile-dev` and `Profile-prod`.\n\n6. Your `Unity-IPhone` configurations should now look like this:\n\n![Unity Configurations](https://raw.githubusercontent.com/juicycleff/flutter-unity-view-widget/master/files/UnityConfigurations.png)\n\n### Web\n\nFlutter on default doesn't support `--flavor` for building web. But you can set your target `main.dart` entrypoint (with `-t main.dart`) while running and building. So if you setup your flavors properly there're also no changes needed for web to apply changes for your Flutter-Unity web App.\n\n## Known issues\n - Remember to disabled fullscreen in unity player settings to disable unity fullscreen.\n - Unity freezes and crashes on Android, please use OpenGL3 as Graphics API.\n - Project fails to build due to some native dependencies in your unity project, please integrate the native libraries for those dependencies on Android or iOS\n - App crashes on screen exit and re-entry do this\n   \u003e Build Setting - iOS - Other Settings - Configuration - Enable Custom Background Behaviors or iOS\n - Android builds takes forever to complete Unity 2022.1.*, remove these lines from unityLibrary/build.gradle file\n   \u003e commandLineArgs.add(\"--enable-debugger\")\n   \u003e commandLineArgs.add(\"--profiler-report\")\n   \u003e commandLineArgs.add(\"--profiler-output-file=\" + workingDir + \"/build/il2cpp_\"+ abi + \"_\" + configuration + \"/il2cpp_conv.traceevents\")\n\n### Web GL\n\nFlutter widgets stacked on top of the UnityWidget will not register clicks or taps. This is a [Flutter issue](https://github.com/flutter/flutter/issues/72273) and can be solved by using the  [PointerInterceptor](https://pub.dev/packages/pointer_interceptor) package.\n\nExample usage:\n\n```dart\nStack(\n  children: [\n    UnityWidget(\n      onUnityCreated: onUnityCreated,\n      onUnityMessage: onUnityMessage,\n      onUnitySceneLoaded: onUnitySceneLoaded,\n    ),\n    Positioned(\n      bottom: 20,\n      left: 20,\n      right: 20,\n      child: PointerInterceptor(\n        child: ElevatedButton(\n          onPressed: () {\n            // do something\n          },\n          child: const Text('Example button'),\n        ),\n      ),\n    ),\n```\n\n\nWe already integrated this into our [Examples](/example/lib/screens/) in the `/example` folder.\n\n\n#### Sponsors\n\nSupport this project with your organization. Your donations will be used to help children first and then those in need. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/ultimate-backend/contribute)]\n\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/0/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/1/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/2/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/3/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/4/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/5/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/6/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/7/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/8/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/ultimate-backend/sponsor/9/website\"\u003e\u003cimg src=\"https://opencollective.com/ultimate-backend/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\n[version-badge]: https://img.shields.io/pub/v/flutter_unity_widget.svg?style=flat-square\n[package]: https://pub.dartlang.org/packages/flutter_unity_widget/\n[license-badge]: https://img.shields.io/github/license/juicycleff/flutter-unity-view-widget.svg?style=flat-square\n[license]: https://github.com/juicycleff/flutter-unity-view-widget/blob/master/LICENSE\n[prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square\n[prs]: https://makeapullrequest.com\n[github-watch-badge]: https://img.shields.io/github/watchers/juicycleff/flutter-unity-view-widget.svg?style=social\n[github-watch]: https://github.com/juicycleff/flutter-unity-view-widget/watchers\n[github-star-badge]: https://img.shields.io/github/stars/juicycleff/flutter-unity-view-widget.svg?style=social\n[github-star]: https://github.com/juicycleff/flutter-unity-view-widget/stargazers\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.xraph.com\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/11243590?v=4\" width=\"100px;\" alt=\"Rex Raphael\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRex Raphael\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/commits?author=juicycleff\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/commits?author=juicycleff\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#question-juicycleff\" title=\"Answering Questions\"\u003e💬\u003c/a\u003e \u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/issues?q=author%3Ajuicycleff\" title=\"Bug reports\"\u003e🐛\u003c/a\u003e \u003ca href=\"#review-juicycleff\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"#tutorial-juicycleff\" title=\"Tutorials\"\u003e✅\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://stockxit.com\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/1475368?v=4\" width=\"100px;\" alt=\"Thomas Stockx\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThomas Stockx\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/commits?author=thomas-stockx\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/commits?author=thomas-stockx\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#question-thomas-stockx\" title=\"Answering Questions\"\u003e💬\u003c/a\u003e \u003ca href=\"#tutorial-thomas-stockx\" title=\"Tutorials\"\u003e✅\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://krispypen.github.io/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/156955?v=4\" width=\"100px;\" alt=\"Kris Pypen\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKris Pypen\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/commits?author=krispypen\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/commits?author=krispypen\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#question-krispypen\" title=\"Answering Questions\"\u003e💬\u003c/a\u003e \u003ca href=\"#tutorial-krispypen\" title=\"Tutorials\"\u003e✅\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/lorant-csonka-planorama\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/48209860?v=4\" width=\"100px;\" alt=\"Lorant Csonka\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLorant Csonka\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/juicycleff/flutter-unity-view-widget/commits?author=lorant-csonka-planorama\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#video-lorant-csonka-planorama\" title=\"Videos\"\u003e📹\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnowballdigital%2Fflutter-unity-view-widget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsnowballdigital%2Fflutter-unity-view-widget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsnowballdigital%2Fflutter-unity-view-widget/lists"}