ミッドランドブログ

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

Steam公式動画「Steamでゲームがプレーヤーに紹介される仕組み」を視聴してみた

これはSteam向けにゲーム開発を行っていて、ダウンロード数やウィッシュリストの登録数を増やしたいと考えている人に向けた記事です。

steamworksのお知らせで「Steamでゲームがプレーヤーに紹介される方法」が掲載されていました
興味深い内容だったので、内容を少し書き出してみました。
※記載内容には筆者の勘違いなどが含まれる場合があります。ご注意ください

 

 

www.youtube.com

 

Steamビジネスチームのエリックさんからの解説動画です
この動画では、Steamでどのような仕組みでユーザーに表示されるゲームが決定されるかについて解説がされています。

 

Steamの目標

・ユーザーにユーザーに適した・興味を持ってもらえるゲームを提示する事
 →Steamはユーザーへの露出(広告)を販売しません
 →掲載を手助けするパブリッシャは必要ない
 →Steamの担当者に依頼する必要はない

・プレイヤーと開発者の両方と長期的な関係を構築する

 

Steam掲載の仕組み

  • アルゴリズムによる掲載スペースとキュレーションによる掲載スペースとがある
  • アルゴリズムでの掲載内容は顧客の興味に合わせてカスタマイズされる
  • キュレーションによる掲載スペースの中には掲載条件が非常に厳しい物がある
  • 話題の新作・売り上げ上位・人気の近日登場・スペシャルセクションの掲載内容はアルゴリズムが決定する
  • 人気の近日登場は主に過去二週間のウィッシュリストの動向が反映される
  • アルゴリズムは一つではない。完璧なアルゴリズムは無い。常にアルゴリズムを調整している
  • ストアの表示内容はプレイヤーによって異なる。
  • ユーザーの興味の判定に影響する物は影響する事柄は、ゲームのプレイ、ゲーム購入、パブリッシャーのフォローレビュー投稿、ゲームをお勧めする事。フレンド追加、フレンドのゲームプレイ観戦など
  • 多くのプレイヤーが時間とお金を使っているゲームは評価が上がる
  • ゲームへの評価は常に変化する→リリース直後の評価が低くても挽回可能

 

TwitterRedditで語られている噂について

 

その他

  • リリースまでに行う宣伝は重要。ゲームの出来だけでヒットするケースは稀
  • SNSインフルエンサーを利用してゲームを宣伝してほしい。

 

「私やSteamビジネスチームの誰かと友達じゃなくても大丈夫です!」と強く訴えていたのが印象的でした。大変な業界です

 

英語字幕がある動画の視聴はCaptionSpeakerを使ってます。

 

chromewebstore.google.com

 

 

 

 

 

Flutter icon searchのご紹介

FlutterのIconsクラスで定義されているアイコンを、様々なカテゴリから簡単に探し出すサービスです。
カスタムコードスニペットなども利用できます。

「Flutter icon search」

 

Iconsクラスには2000以上のアイコンが定義されていますが、目的とするアイコンを探すのはかなり大変です。

自分好みのアイコン検索サービスが見つからなかったのと、エディター系のアプリを作る予定があり、多量にアイコンを使いそうなので自作してみました。
非常に簡単なアプリですが、アイコンの分類が想像以上に手間で、完成まで結構時間がかかってしまいました

正直サービスといえるほど大したものではないですが、私と似たような感覚の人には役に立つものになっていると思います。

 

アイコンのカテゴリ分け作業の中で面白いアイコンをいくつか見つけたのでご紹介。

 

初めて見たとき一分間くらい理解ができなかったのですが「弁当」らしいです
ローカルな文化に配慮しているようです

bento_rounded constant - Icons class - material library - Dart API

 

トランスジェンダー
社会派ですね

transgender constant - Icons class - material library - Dart API

「pokemon」
ちょっとうれしいですね

catching_pokemon_outlined constant - Icons class - material library - Dart API

 

 

 


カテゴリの追加やバグの修正は暇を見て行っていこうと考えています。カテゴリは今の倍くらいにはしたいですね

アプリ版は近日公開予定です。

 

 

 

 

 

【アプリ開発者用】Googleの「ポリシーに関するお知らせ」を読んでみる(2024 年 4 月 3 日掲載分)

これはGooglePlayでアプリを公開していてGoogleポリシー変更などに興味がある方に向けた記事です。
2024年4月3日に掲載された「ポリシーに関するお知らせ」にふわっとした解釈を付けてみました。
※記載内容には筆者の勘違いなどが含まれる場合があります。ご注意ください

 

support.google.com

 

ソーシャル アプリと出会い系アプリに対し、特定の基準に従うことと、公開前に Google Play Console で準拠を自己認定することを義務付ける子どもの安全基準に関するポリシーを導入しました。

レーティングに関するアンケートに変更があるのかもしれません

 

Google Play での健康関連アプリの可視性と管理性を向上させるため、Google Play Console での健康アプリの申告制度を導入します。健康や医療に関する機能を搭載するアプリは、Google Play Console でこの点についての証明が必須になります。詳細

健康アプリに関するアンケートが追加されるのかもしれません

 

不適切なコンテンツに関するポリシーを更新し、書籍や動画のカタログアプリにおける性的コンテンツに関するガイダンスを追加します。

性的なコンテンツ、ヘイトスピーチ、暴力、暴力的な過激主義、政治宗教、いじめや嫌がらせ、薬物→ダメよ

 

操作されたメディアに関するポリシーを更新し、ポリシーが適用されるメディアの種類の例として、音声を追加します。

ユーザーを偽る表現は禁止、ストアページ、アプリの内容すべて
審査が厳しくなるのかもしれません

 

個人ローンに関するポリシーを更新し、ローンの返済期間は現地の規制を遵守することを明確にします。

だそうです

 

フォアグラウンド サービスの権限に関するポリシーを更新し、「dataSync」フォアグラウンド サービス タイプについて、Play Asset Delivery 機能の使用を許可する例外を追加します

更新内容の詳細は近日公開になるという話でした

 

ヘルスコネクトに関する申請手続きを合理化し、健康アプリのポリシーとの整合性を確保することを目的に、ヘルスコネクトのポリシーを更新します。本年中に従来の申請フォームは終了し、Google Play Console で申告していただくことになります。

アンケートに変更があるのかもしれません

 

以前は暴力に関するポリシーにまとめていたテロに関するコンテンツと危険な団体および運動に関するポリシーを、暴力的な過激主義に対するポリシーに統合します。

だそうです

 

スパイウェアに関するポリシーを更新し、悪意のあるアプリケーション、コード、動作からユーザーを保護するための既存のアプローチを明確にします。

「最新バージョンの Android が動作しているデバイスは、廃止された API を使って悪意のある動作を実行しようとする有害なアプリの影響を受けません。」

APIアップデートの話でしょうか?

 

個人ローンに関するポリシーを更新し、他の用途で機密情報に関わる権限にアクセスすることを制限します。
QUERY_ALL_PACKAGES 権限を更新し、金融サービスと現金賭博に関する例外的なケースが明確になるようにします。

金融系のアプリを作っている人は影響があるのかもしれません

 

モバイルの望ましくないソフトウェアに関するポリシーを更新し、デベロッパーはデバイスのセキュリティ保護機能(Google Play プロテクトなど)を無効にするようユーザーに要求したり、ユーザーを欺いて無効にさせたりしてはいけないことを明確にしました。

広告に関してまた何か制限が追加されるかもしれません

 

マルウェアに関するポリシーを更新し、マスクウェアマルウェアの一種であることを明確にしました。マスクウェアとは、さまざまな回避手法を駆使して、ユーザーが予期し得ない、または偽の機能を提供するアプリのことです。

「マスクウェア」は「さまざまな回避手法を駆使して、ユーザーが予期し得ない、または偽の機能を提供するアプリです。」
だそうです

 

昨年、Google Play は、ユーザーによる自身のデータ管理を強化するため、新しいアカウント削除要件を導入しました。ユーザーがアプリを通してアカウントを作成できる場合、2023 年 12 月 7 日までにデータ セーフティ フォームのアカウント削除セクションへの入力を完了する必要がありました。違反のためアプリがブロックされている場合、または、アプリをアップデートするために時間が必要な場合は、Google Play Console で 2024 年 5 月 31 日まで延長をリクエストできます。

だそうです

 

昨年 10 月、写真または動画の広範な権限(READ_MEDIA_IMAGES と READ_MEDIA_VIDEO)をリクエストできるアプリの数を減らすため、写真と動画の権限に関するポリシーを導入しました。2024 年 8 月 31 日から、アプリの機能に直接関係のある目的でのみ、アプリは写真と動画にアクセスできるようになります。こうしたファイルに一度だけアクセスする必要があるアプリや、頻繁にアクセスする必要がないアプリでは、Android の写真選択ツールなどのシステムの選択ツールを使用することが求められます。

マニフェストファイルの変更が必要という話でした

 

 

 

 

 

 

 

 

 

 

 

クリエーターにおけるビギナーズラックの正体 - 新人は下駄を履かされている?

年度が変わり世に言われる「新人」が増える時期になったせいか、クリエーターにおけるビギナーズラックとは何なのかについて書きたくなりました。

「初心を忘れない事の重要性」であったり「思考のバイアス」であったり「本人の心の持ちようによるもの」という話はここではしないようにします。
もちろん重要な要素ではあると思いますが、他で十分語られているのでわざわざ新しく話をする必要はないと考えたからです。

私はクリエーターにおけるビギナーズラックは次の2点からくると考えています。


・プラットフォームによる優遇
・新人を支援する事を人は楽しいと感じる為

 

プラットフォームによる優遇

絵画、ゲーム、音楽、動画、クリエーターは制作物を作り、これを様々なプラットフォームを介して発表します。
ここで言うプラットフォームとはGoogleApple、その他様々な巨大プラットフォームを指します。
まず新着欄のようなものが存在する場合、確実に新規であることが優位性として働きます。
また新規アカウントであると一時的にプラットフォーム内の露出度を増やすようなアルゴリズムが組み込まれているといわれています。
もちろんストアのアルゴリズムは公開されてはいないので、正確な情報を得ることはできません。
しかしアルゴリズムに関する考察をされている方の情報を見ると、そのような話が沢山出てきます。
「新人の優遇はある」と考えておいた方がいいのかもしれません


新人を支援する事を人は楽しいと感じる為

「新人」という属性は人を引き付けます。新人には良い人も悪い人もたくさん寄ってきます。(ここでは新人に寄ってくる悪い人については語りません)
そして新人は沢山の支援を受けることができます。
なぜたくさんの支援を受けることができるのでしょうか。

それは新人を支援する事は多くの人が単純に楽しいと感じるからです。
もしかして育児本能と似たようなものかもしれません。それ故「新人」には見返りを求めず支援する人も沢山いるでしょう。

でも彼方が「新人」から「ベテラン」に変わったら、新人であるが故に支援をしていた人はどのように感じるでしょうか。
答えはたぶん我々の心の中にあるはずです。

 

【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/[パッケージ名].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