ミッドランドブログ

長めのお知らせ、紹介記事を掲載します

【2024年版】Flutterにアプリをリプレイスして感じたFlutterの良い点/悪い点

Flutterにアプリをリプレイスすることを検討している方に向けた記事です。検討する際の助けになるとうれしいです。

諸般の事情によりUnityで制作したアプリをFlutterにリプレイスました。この作業の中で感じたことを記載します。

 

Flutterの良かった点

・開発速度が速い

Flutterに関する知識の類は下の記事を書いた時点でほぼほぼ0の状態でした。
※2月19日に記載しました。前日Flutterのインストールをしていました。

midland.hatenadiary.jp

規模が小さなアプリですが、一か月ちょっとでリプレイスが完了したことになります。
巷で言われている学習コストが小さいという話は嘘ではないなと感じました。

 

・背景透過のスクリーンショット等が簡単に作成できた

パッケージを利用しましたが実装がとても簡単でした。

・ビルド~リリース関連のトラブルがほとんどなかった

iOS、Andoroidとも少なくとも私の環境では調査が必要なビルドエラー等がほぼありませんでした。

・Admobとの相性がいい

ビルドなどでトラブルが発生することもなく、実装も簡単で動作も安定していました。
巷で言われているGoole製品との相性がいいという話は嘘ではないなと感じました。

・比較的デザインの良いアイコンやローディングバーなどが準備されている

人によってはデザインが気に食わないと感じるかもしれませんが、もともと良いデザインのアプリではなかった為ありがたく使わせてもらいました。

 

 

Flutterの悪かった点

・UI周りに癖がある

レイアウト関連のWidget入れ子の順番によってExceptionが発生したりWidgetが予期せず再描画したりと、UI周りに癖があるなと感じました。
学習によって解決する事とは思いますが、プログラミング初心者やお試しで使っているモチベーションがそれほど高くない人の心を折るのには十分な挙動で、ここら辺がFlutter利用者のすそ野が広がらない/流行らないといわれる要因の一つになっているように感じました。

・描画が遅い

描画周りがもっさりしています。(もちろん最適化に関する技術が不足している点はあると思います)
対象のアプリでは一覧表示などが明らかに遅くなってしまいました。動的なアプリではないためそのままリリースしています。

 

 


以上が感じた良い点/悪い点となります
癖があり不向きなアプリケーションはあるとは思いますが、静的な小規模アプリケーションを作るのには悪くないプラットフォームだと思いました。


巷で言われている日本語のドキュメントが少ないという話についてはこの記事を書いている時点ではほとんど気になりませんでした。
解説記事を書かれている方々に感謝します。

 

 

Unity2020からUnity2022にアップグレードしたらGradleエラーが出た話

※2024年3月

Unity2020.3→Unity2022.3にアップグレードしたら、ビルド時に下記のエラーが発生しました

 

Starting a Gradle Daemon, 1 incompatible Daemon could not be reused, use --status for details

 

当環境ではUnity2020.3でAPIレベルを上げる時に作成した、Gradle関連ファイルを全部消すことで対応しました。
Publishing Settingsのチェックを外すだけでも良いようです

※チェックを外す事で違うビルドエラーが出るようになったら、残っているファイルを削除したほうがいいかもしれません

 

上の対応をするとダイアログが表示されPlugins/Android下にaarなどが大量に生成されます

 

生成されていない場合は変更がうまく認識されていない可能性が高く、チェックを付けなおしたり再起動をさせれば生成が開始されるようです。

 

追記:

事前におまじないとしてexternal-dependency-managerとGoogleMobileAdsの再インストールも行っています。

 

 

 

 

 

 

unityで保存されたPlayerPrefsにFlutterからアクセスする実験


unity製のアプリをFlutterに移し替える検討をしている方に向けた記事です。
ファイルシステム周りの調査をしている方の助けになれば幸いです。

 

前回unityのApplication.persistentDataPathをFlutterで取得する方法について調べました。

midland.hatenadiary.jp

諸事情によりPlayerPrefsに保存されたデータにアクセスする必要あったので、調べてみました。
※元のアプリはUnity2020.3で作成されています

docs.unity3d.com

 

Android端末に保存されたPlayerPrefsの取得方法

保存場所
- Android: /data/data/[パッケージ名]/shared_prefs/pkg-name.v2.playerprefs.xml


final file = File('/data/data/[パッケージ名]/shared_prefs/pkg-name.v2.playerprefs.xml');
String data = await file.readAsString();

データの保存先がアプリ毎に固定です

 

iOS端末に保存されたPlayerPrefsの取得方法


保存場所
- iOS: Uses the [NSUserDefaults standardUserDefaults] API to store PlayerPrefs data.


//まずLibraryパスを取得します(path_providerを利用)
final appDocumentsDirectory = await getLibraryDirectory();
String libraryDirectory = appDocumentsDirectory.path;

//plist_parserを利用してファイル読み込み resultはMapです
var result = PlistParser().parseFileSync(libraryDirectory + '/Preferences/[パッケージ名].plist');
print(result);

必要なインポートは二つ


import 'package:path_provider/path_provider.dart';
import 'package:plist_parser/plist_parser.dart';

plistをテキストとして読み込むことができなかったので、plistparserを利用しました

 

pub.dev

 

pub.dev

 

 

【Flutter】ColorFilteredのColorFilter.matrixを利用して画像に加算効果をかける実験

BlendModeになぜか加算モードがなかったので、ColorFilter.matrixを用いて加算効果のフィルターを作成してみました。


class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;
  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State {
  ColorFilter customMultiplyColor(Color color) {
    // Normalize the color values to range from 0 to 1
    double red = color.red / 255;
    double green = color.green / 255;
    double blue = color.blue / 255;
    // Create a matrix to multiply the RGB values with the desired color
    return ColorFilter.matrix([
      1,0,0,red,0,
      0,1,0,green,0,
      0,0,1,blue,0,
      0,0,0,1,0,
    ]);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset('assets/sample.png', width: 200, height: 200),
            ColorFiltered(
              colorFilter: customMultiplyColor(
                  Colors.blue), 
              child: Image.asset('assets/sample.png', width: 200, height: 200),
            ),
          ],
        ),
      ),
    );
  }
}
  

実行結果

 

 

変換テーブルの意味については、Flutterの資料ではありませんがこの資料がわかりやすく説明されていました

developer.mozilla.org

 

ColorFilter.matrixの記載方法はこちらを

api.flutter.dev

 

unity製のアプリをFlutterに移し替える為の実験(ファイルシステム編)

unity製のアプリをFlutterに移し替える検討をしている方に向けた記事です。
ファイルシステム周りの調査をしている方の助けになれば幸いです。

 

pub.dev

Unityでアプリのデータを保存する際に、Application.persistentDataPathを利用しています。
このApplication.persistentDataPathの取得についてFlutterで対応するものを調べてみました

 

どうもAndroidiOSで対応する取得方法が異なるようです

iOS
path_provider getApplicationDocumentsDirectory()

 

Android
path_provider getExternalStorageDirectory()

 

当テスト環境ではこのようになりました。

IOS

Android

 

PreyerPrefsについてはこちらを

midland.hatenadiary.jp

 

 

unity製のアプリをFlutterに移し替える為の実験(リリース編)

unity製のアプリをFlutterに移し替える検討をしている方に向けた記事です。ストアにアップロードが成功するまでに行った事を忘備録として記載します。
androidのキーストア周りの移行作業の助けになれば幸いです。
(Flutter 3.3.0)

 

1. unity側の作業


keystoreファイルを探す。保存場所がわからなくなったら、Publishing Settingを確認すれば表示されています。
またAliasがわからなくなった場合はこれもPublishing Settingで確認します。(キーストアのパスワードを入力するとエイリアス名が表示されます)

 

2. Androidの設定


keystoreファイルをandroid/app下に配置
android/key.propertiesファイルを作成

android/key.propertiesファイルの作成とbuild.gradleの編集
編集内容についてはこちらを参考にさせてもらいました

qiita.com

 

3. iOSの設定

Flutterの設定ファイルでの編集箇所がよくわからなかったため、MacXcodeプロジェクトを開き直接バンドルIDとSKUを編集しました

Xcodeで直接編集した場合一時的にビルドは成功したのですが、どうもプロジェクトを壊してしまったようなので(汗
こちらを参考にios/Runner.xcodeproj/project.pbxprojを編集しました
いろいろいじりましたが、このファイル内の変更だけで対応できるようです

zenn.dev

 

 

4. バージョン番号の変更


pubspec.yamlを編集してみました

 

1~4を行った後、所定の手順でビルドをすればストアにアップロード出来る状態になると思います。

 

 

以上となります

 

midland.hatenadiary.jp

 

midland.hatenadiary.jp

 

 

体験版を50本以上遊んでみた感想と体験版の必要性 (SteamNextFest 2024年2月版)

これはSteam向けにゲーム開発を行っていて、ダウンロード数やウィッシュリストの登録数を増やしたいと考えている人に向けた記事です
SteamNextFestへの参加や体験版のリリースを検討している人のお役に立てたらうれしいです。

 

Steam NEXTフェスに参加したのでこれについて記事を書きました

midland.hatenadiary.jp

 

今回のSteam NEXTフェスでは調査の為、他のデベロッパー様がリリースした体験版を沢山遊んでみました(たぶん50本以上遊んだと思います)
以下感想です。

 

[caution]完全に個人的な感想なのでご注意ください[caution]

 

実際にお金を出して買いたいと思ったゲームは数本

続きがプレイしたい/お金を払っていいと思ったゲームは数本でした

 

チュートリアルをクリアできないゲームが結構な数あった

チュートリアルの作りの問題なのか進行不可バグなのかは分かりませんが、チュートリアルがクリアできないゲームが結構ありました。(1~2割位)

 

ほとんどのゲームはプレイ前よりゲームの評価が下がった

ストアページが好印象で、チュートリアルを問題なくクリアできたとしてもプレイを続けたいか/購入したいかとなると「うーん」となってしまう事が多かったです。

 

ヴァンパイア サバイバーズライク、タワーディフェンス系はプレイ前より評価が上がる事が多かった

完全に個人的な感想です

 

ローグライクゲームが多かった

私がプレイしたゲームの半分以上はローグライクXX的な文章が説明に入っていました。

 

Steam NEXTフェス参加、体験版の効果

ジャンルによると思います
ヴァンパイア サバイバーズライク、タワーディフェンス系のゲームはフェスに参加して損が無さそうな気がしました。(完全に個人的な感想です)

自分が出そうとしているジャンルの体験版を色々遊んでみて、プレイ前より評価が下がる/購入のモチベーションが落ちるものが多い場合、特にプロモーションに力を入れていて、既に十分なウィッシュリストを集めているゲームについては、フェスへの参加は見送った方がいいのかもしれません。

 

以上となります