やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

メンテナンス不要でチュートリアルを突破するAnjinのオートパイロット設定

Anjin v1.3で追加された機能を使って、スマートフォンゲームによくあるアウトゲームのチュートリアル(次に押せるボタンが限定される系)を自動で突破するオートパイロット設定の方法を紹介します。

Anjinパッケージのインストール

Anjinパッケージ(com.dena.anjin)は、株式会社ディー・エヌ・エーが開発・OSSとして公開しているUnity向けオートパイロットフレームワークです*1。 Unityエディタ上で動作させることを前提とし、また基本的な設定をすべてUnityエディタ上で完結できます。 本記事の事例もノーコードです。

github.com

パッケージのインストールは、openupm-cli を使用して次のコマンドで行なうのが簡単です。

openupm add com.dena.anjin

Package Managerウィンドウによるインストール方法は、リポジトリのREADMEを参照してください。

インストールしたら、.gitignoreなどで次のパスをトラッキングしないよう設定しておきましょう。

/Assets/AutopilotState.asset*

チュートリアルを突破するオートパイロット設定

最小構成として、Agentの設定を2つと、それを統括するオートパイロット設定を作成します。

uGUI Monkey Agentの設定

uGUI Monkey Agentは、uGUIで構築されたUI画面をでたらめに操作する、いわゆるモンキーテストを行なうためのAgentです。 本記事ではこれをチュートリアルの操作に利用します。チュートリアル中、ユーザが実際に操作可能なUI要素以外はブロックされているのであれば、「操作できるものを操作する」だけでチュートリアルは進行するはずです*2

Projectウィンドウで右クリック > Create > Anjin > uGUI Monkey Agent でAgent設定ファイルが作られます。 これをInspectorウィンドウで開き、動作設定を行ないます。

細かくは適用するプロジェクトによりますが、Lifespacn Sec は0以外*3チュートリアルを突破できるまでの時間を余裕を持って指定します。 また Secs Searching Components には、操作できるUI要素が1つもない時間を何秒検出したらエラー(進行不能)と判断するかを指定します。スキップできないムービー再生や演出がある場合は考慮が必要です。

なお、MonkeyAgentに操作されたくないUI要素*4がある場合は、IgnoreUGUIMonkey コンポーネントを追加することで操作を避けることができます。

Time Bomb Agentの設定

Time Bomb(時限爆弾)Agentは、Anjin v1.3で追加されたAgentです。 別のAgentを内包して動作させ、そのAgentが動作を終えるまでに指定した「解除メッセージ」がログ出力されなければエラー終了するAgentです。

Projectウィンドウで右クリック > Create > Anjin > Time Bomb Agent でAgent設定ファイルが作られます。 これをInspectorウィンドウで開き、動作設定を行ないます。

Agent には、先に作ったMonkey Agentの設定ファイルを指定します。 Defuse Message には、チュートリアルを完遂したときにログ(UnityEngine.Debug.Log)出力している文字列*5を指定します。正規表現が使用できます。

Tutorial Monkey Agentは40秒間動作する設定です。40秒以内に解除メッセージ「チュートリアル突破!」がログに出力されればTime Bomb Agentは正常終了、40秒経過してTutorial Monkey Agentが終了してしまうとエラーとなります。

オートパイロット設定

最後にオートパイロット本体の設定です。

Projectウィンドウで右クリック > Create > Anjin > Autopilot Settings でオートパイロット設定ファイルが作られます。 これをInspectorウィンドウで開き、動作設定を行ないます。

ここでは、Sceneに対して、そのSceneを操作するAgentを割り当てます。 まず、最初に表示されるTitle sceneにはTitle To Tutorial Agentという名前のuGUI Playback Agentを指定し*6、TitleからHomeに遷移するよう設定しています(詳細は割愛します)。

続いて Home scene(ここでチュートリアルが進行する想定)に先のTime Bomb Agentを指定して、チュートリアルを突破させます。

設定を終えたら、Inspectorウィンドウを下までスクロールして Run ボタンをクリックするとその場で再生モードに切り替わり、オートパイロットが実行されます。

なお、図の設定ではチュートリアル突破後、Lifespan secに設定された60秒までなにもしないで終了します。 実際のプロジェクトでは、Time Bomb Agentの後にさらにuGUI Playback Agentで各画面を巡回するシナリオを組んだり、uGUI Monkey Agentでモンキーテストを実行するなりするとよいでしょう。

その他の新機能

Anjin v1.2およびv1.3で追加された機能を簡単に紹介します。

Play Modeテストからのオートパイロット実行

Inspectorウィンドウやコマンドラインからでなく、Play Modeテストコード内でオートパイロットを起動し、終了を待つことができるようになりました。 次のように使います。

[Test]
public async Task LaunchAutopilotFromTest()
{
  await LauncherFromTest.AutopilotAsync("Assets/Path/To/AutopilotSettings.asset");
}

uGUI Monkey Agentのスクリーンショット撮影オプション

uGUI Monkey Agentに、操作ごとにスクリーンショットを撮影するオプションが追加されました。 Inspectorウィンドウで有効化できます。

デフォルトでは、Application.persistentDataPath 下の "/TestHelper/Screenshots/" に Agentの名前+連番のファイルが保存されます。

batchmode起動サポート

CIなどでコマンドラインから起動するとき、-batchmodeを指定しても動作するようになりました。 Unityのbatchmode(ヘッドレスモード)には様々な制限がありますが、それを回避するハック(下記)によるものです。

www.nowsprinting.com

参考

swet.dena.com

swet.dena.com

*1:筆者がDeNA在籍時代に作ったものですが、すでにメンテナではありません。本記事で紹介している新機能は、現在お手伝いしているプロジェクトで使いそうなものをPull Requestし採用されたものです

*2:進行しない場合、専用のAgentを実装する必要があります

*3:0は無制限に動作します

*4:課金要素、広告表示、外部アプリ起動、デバッグメニューなど

*5:なにも出力していなければ、プロダクト側に手を加える必要があります

*6:uGUI Playback Agentは、マウス操作を記録してその通りに操作を再現するAgent