26
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlutterにUnityを組み込むflutter unity widgetの使い方

Last updated at Posted at 2022-09-07

flutter unity widget

flutterにunityを組み込むやつ

これはメモ程度に残した記事です。まずは公式リポジトリのreadmeを読むのをおすすめします。

unity側

version

unity2020以前のバージョンでも行けるらしいが,少なくとも僕がやった限りではうまくいかなかった.
unity2021以降を使ったほうが確実だろう.

モジュールの追加

まずモジュールを加えるから,下のようにチェックを入れインストール
image.png

flutter側

package の導入

flutter3.0.0以降は

dependencies:
  flutter_unity_widget: ^2022.2.0

flutter3.0.0以前は

dependencies:
  flutter_unity_widget: ^2022.1.0+7

をpubspec.yamlに追記する

android/loacal.propertiesの編集

unityの
Edit>Preferences>External toolsからNdkのディレクトリを確認しFlutter Projectのandroid/loacal.propertiesに追記

loacal.properties
ndk.dir={確認したNDKのディレクトリ}//追記

Unity Projectの配置

Flutter Projectのディレクトリにunityというディレクトリを作りそこに組み込みたいUnity Projectを配置
-Flutter_project
    -unity
        -unity_project

unity側

build設定

1. File>Build SettingからAndroidのマークを押しSwitchボタンを押しBuildターゲットを変更
2. File > Build Settings > Player SettingsからScripting BackendをIL2CPPにする
3. Target ArchitecturesのARMv7とARM64にチェックを入れる.

Screenshot 2019-03-27 07.31.55.png
引用:https://github.com/juicycleff/flutter-unity-view-widget

拡張機能の導入

1. 上からfuw-2022.1.7f1.unitypackage(最新)をダウンロード

使い方とか言っておきながらあれだけどうまくいかなかったら別のバージョンのパッケージを試す

2. プロジェクトのフォルダに配置する.
-android_project
    -unity
        -unity-project
            -fuw-2022.1.7f1.unitypackage

のように配置

3. インポートする

Unityの画面のProject上で右クリックしてImport Packageより先ほどのfuw-2022.1.7f1.unitypackageを選択

(参考)https://kan-kikuchi.hatenablog.com/entry/Unitypackage

flutterへの出力

うまくいっていればウィンドウ上部にFlutterという項目が追加されているだろう.
それをクリックして出力.
image.png

出力するとandroid_project/androidにunityLibraryというフォルダが作成されている.

flutter側

以下のコードは公式ページより引用した
https://pub.dev/packages/flutter_unity_widget

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

void main() {
  runApp(MaterialApp(
    home: UnityDemoScreen()
  ));
}

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

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

これをプロジェクトに追加してビルドすればいけるはず.(最初は出力されたUnityのファイルのビルドも必要になるため時間がかかる)

ちなみにこのコードの以下の部分がUnityを呼びだしているところ.

            child: UnityWidget(
              onUnityCreated: onUnityCreated,
            ),

onUnityCreatedでUnityが作られたときに呼び出したい関数を指定する.
ほかにも
onUnityMessage
Unityからのメッセージを受け取ったときに呼び出す関数を指定
onUnitySceneLoaded
Sceneがロードされたされたときに呼び出す関数を指定
などがあるこれは公式ページを要確認.

UnityとFlutter間での通信

さきほどonUnityMessageというのを紹介したようにFlutterとUnityで通信することができる
これは公式レポジトリのコードを参考にしてほしい.

FlutterからUnityへメッセージを送る

UnityからFlutterへメッセージを送る

FlutterからのメッセージをUnityで受け取る

UnityからのメッセージをFlutterで受け取る

上のようにonUnityMessageをつかう

以上

まあflutterにUnityを組み込むなんてイレギュラーではあると思うしバグもあるし資料全然ないからおすすめでない..けど組み込んでるワイ..

稚拙な文を読んでくれてありがとうございました

26
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?