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

# flutter unity widget
https://pub.dev/packages/flutter_unity_widget

https://github.com/juicycleff/flutter-unity-view-widget


flutterにunityを組み込むやつ


これはメモ程度に残した記事です。まずは公式リポジトリの[readme](https://github.com/juicycleff/flutter-unity-view-widget)を読むのをおすすめします。




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

### モジュールの追加
まずモジュールを加えるから，下のようにチェックを入れインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/f6d54f48-a35a-4da3-afc8-42e7216ce83d.png)

https://developer.android.com/games/develop/build-in-unity?hl=ja

# flutter側
##### package の導入
flutter3.0.0以降は

```yaml
dependencies:
  flutter_unity_widget: ^2022.2.0
```

flutter3.0.0以前は

```yaml
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://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/2993d276-129d-826a-5f89-bee17a88fa76.png)
引用:https://github.com/juicycleff/flutter-unity-view-widget


### 拡張機能の導入

https://github.com/juicycleff/flutter-unity-view-widget/tree/master/unitypackages

##### 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/03efe681-b541-e0de-6966-7f0c781ba0cc.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を呼びだしているところ．
```dart
            child: UnityWidget(
              onUnityCreated: onUnityCreated,
            ),
```
`onUnityCreated`でUnityが作られたときに呼び出したい関数を指定する．
ほかにも
`onUnityMessage`
Unityからのメッセージを受け取ったときに呼び出す関数を指定
`onUnitySceneLoaded`
Sceneがロードされたされたときに呼び出す関数を指定
などがあるこれは公式ページを要確認．




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

##### FlutterからUnityへメッセージを送る
https://github.com/juicycleff/flutter-unity-view-widget/blob/master/example/lib/screens/simple_screen.dart


##### UnityからFlutterへメッセージを送る
https://github.com/juicycleff/flutter-unity-view-widget/blob/master/example/unity/DemoApp/Assets/FlutterUnityIntegration/Demo/SceneLoader.cs

##### FlutterからのメッセージをUnityで受け取る
https://github.com/juicycleff/flutter-unity-view-widget/blob/master/example/unity/DemoApp/Assets/FlutterUnityIntegration/Demo/Rotate.cs

##### UnityからのメッセージをFlutterで受け取る
https://github.com/juicycleff/flutter-unity-view-widget/blob/master/example/lib/screens/simple_screen.dart

上のように`onUnityMessage`をつかう





# 以上

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

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