flutter unity widget
flutterにunityを組み込むやつ
これはメモ程度に残した記事です。まずは公式リポジトリのreadmeを読むのをおすすめします。
unity側
version
unity2020以前のバージョンでも行けるらしいが,少なくとも僕がやった限りではうまくいかなかった.
unity2021以降を使ったほうが確実だろう.
モジュールの追加
まずモジュールを加えるから,下のようにチェックを入れインストール
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に追記
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にチェックを入れる.
引用: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という項目が追加されているだろう.
それをクリックして出力.
出力するとandroid_project/android
にunityLibraryというフォルダが作成されている.
flutter側
以下のコードは公式ページより引用した
https://pub.dev/packages/flutter_unity_widget
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を組み込むなんてイレギュラーではあると思うしバグもあるし資料全然ないからおすすめでない..けど組み込んでるワイ..
稚拙な文を読んでくれてありがとうございました