ML-Agents を使ったゲームをリリースしようと、ここ知らばくUnityばかりしていましたが、ようやくリリースすることができました。

Google Play のこちらからダウンロードできます。

以下、苦労した点の覚書です。まだ、Unityに慣れていないこともあり、もっとよい対処の方法があるものもると思いますが、とりあえず私はどうしたか、という記録です。

強化学習で動かす複数のロボットをゲームで使う

強化学習で学習をさせることは、ここで紹介した方法で可能ですが、その結果をゲームに応用するにはどうするのが良いのかがよくわからなく試行錯誤しました。

今回は、5種類のロボットを別々の強化学習で学習させ、全てのロボットを一つのゲームで使いたいという要望がありました。

worldの下の、Robot1_v2_L1, …, Robot5_v2_L3 というものがロボットになります。それ以外の、PadAss(パッド), Floor(床), GoalYou(自分のゴール), … などは、ゲームに使われるGameObjectです。

いろいろ考えて決めた方法が、同じscene でトレーニングもゲームも作るという方法です。トレーニングとゲームを別々に作ると、ゲームの環境のパラメータを調整したときに、その都度、トレーニングの環境も変更していくのが面倒だと思ったからです。

しかし、一つのsceneでロボット(Agent)を5個定義してしまうと、python側からmlagents-learn を走らせたときに、Agentで競合が起きてエラーが出てしまいました。

このエラーは次のようにして解決しました。

まず、強化学習で使う素材(robot, ball, pad, goal, wall などなど)を全て、world というgameobject の下に作っておきます。

そして、トレーニングさせるときには、このworldをdupulicate し、world1を作成、もとのworldは、inspector のactive のチェックを外します。

次に、world1でトレーニングさせないロボットは、delete してしまいます。

そして、プログラム全体をトレーニングモードで動かすように、public変数にチェックを入れます。

このチェックによって、ボールの初期位置やスピードはトレーニング用にする、自分のパッドを自動制御にするなどができるようにしておきました。

これで python側からのmlagents-learn がうまくいくことを確かめたら、world1をなんどもdupulicate し、world16まで作って並列Agents の環境で学習を行いました。

Agents はPrefab せず、GameObjectをコピーして使う

ゲームでは、ユーザーが複数のロボットのうち1台を対戦相手に選んでゲームを開始するという要望がありました。

ユーザーが選んだロボットを出すために、初めは、5台のロボットをPrefab化しておいて、対戦相手として決まったロボットのインスタンスを生成するという方法を考えていたのですが、Prefab にすると、そのscene のgameobjectを参照しておくことができないということがわかりました。

以下のように、ロボットに関連付けたscriptには、ボール(GO_Ball)やパッド(GO_Pad)など、いくつかの関連付けをしていましたが、prefab化するとこの関連付けがなくなってしまうということです。結果、うまく動きませんでした。

しかし調べると、prefab化していなくても、gameobjectそのものをコピー(インスタンス化)することができることがわかりました。

そこで、5台のロボットは非アクティブにしておいて、出現させるロボットはここからコピーしてアクティブ化するという方法にしました。これで、関連付けがそのままの状態で任意のロボットを出現させるということができるようになりました。

その他

アンドロイドでビルドするための設定

下の設定で、upload するためのaabファイルを作ることができた。しかし、同じ設定でもエラーが出てビルドに失敗することもある。しかし、Unity を立ち上げなおして、スマホもつなぎなおしてbuildを試すと、なぜかうまくいくことがある(なぜ?)。

Build Setting
Bulid App Bundle (Google Play): off

Project Settings/Player/icon
icon には、サイズ432×432の画像を登録した。Background は背景の色のみの画像、Foregrondは、背景を透明にしたアイコン画像。ここで登録すると324や216のサイズも自動で登録される。
画像は、いったんAssetの中にコピーして登録した。このとき、元の画像がprojectのホルダー内にあると、Assetにドラッグしてコピーすることができないので、外に出しておくことが必要。

Project Settings/Player/Other Settings

Color Space は、Gammaにしないとエラーが出た。

Bundle Version Codeは、リリースするごとに増やしていくみたい。そのままにしておくとアップロード時にエラーになる。

Project Settings/Player/PUblishing Settings