BDD(振舞駆動開発)でUnity3Dのゲームを開発する | サイバーエージェント 公式エンジニアブログ
こんにちは、ポルトガル出身アプリエンジニアのマリオ フレイタスと申します。

なぜUnity?

2011年8月に中途採用で入社してからずっとUnity 3Dをやってきました。
Unityを使って、iOSとAndroid版のVideoPoker by COINPLAZAというゲームをリリースして、今は新しいゲームを開発しています。前のプロジェクトと新しいプロジェクトの間に、社内向けのUnityプラグインを10以上創ったりしました。

cukunityフレームワークの紹介

最近創ってgithubで公開したcukunityというUnity用のBDD(Behavior Driven Development:振舞駆動開発)フレームワークとその使い方を紹介したいと思います。現在、iOSとAndroidの実機のみサポートしています。
下記URLは公式サイトです。

http://github.com/imkira/cukunity

上級のテーマになってしまうかもしれないので、ヘビーな説明より倉庫番という例のゲームで説明したいと思います。

まずは、BDD(振舞駆動開発)とは?

BDDの3つのポイントは「前提」、「もし」、「ならば」というキーワードです。
この3つのキーワードで、プログラミングが出来る方ではなくてもテストのシナリオを表現することが出来ます。cukunityが利用しているBDDフレームワークはcucumberです。cukunity言葉自体、cucumber + Unityというかばん語です。

ゲームのレベル1をクリアする(機能の記述)

上記の通り、プログラマーではなくてもシナリオの記述が出来ます。

例として倉庫番のレベル1をクリアする、という機能とそれらの例のシナリオを下記のように自然言語で書いてみましょう!

最初は、機能の概念記述です。

フィーチャ: ゲームクリア
倉庫番のプレイヤーとして、
レベルを次から次へチャレンジしていくために
人間を操作して荷物を目的地まで運んでレベルをクリアしたい。

その次、例のパーフェクトでレベル1をクリアするというシナリオの記述です。

シナリオ: パーフェクトでレベル1をクリアする
前提 "fixtures/sokoban"からゲームをインストールしている
かつ ゲームを起動している
かつ レベル"demo_title"をロードしている
もし "Play"をタップしたら
かつ "Up"をタップしたら
かつ "Left"をタップしたら
# 省略
かつ "Right"をタップしたら
ならば "GameClear"を表示していること
かつ "44"と表示していること


実際に裏で何が起きる?

cukunityに上記のシナリオを投げると、次のような動きになります。

前提 "fixtures/sokoban"からゲームをインストールしている
Unityでfixtures/sokoban.app(もしくは.apk)に出力してあるアプリが端末にインストールされていなければ、cukunityがそのアプリを自動的にインストールする。


かつ ゲームを起動している
アプリが既に端末で実行していなければcukunityがそのアプリを起動する。


かつ レベル"demo_title"をロードしている
CukunityがUnityの”demo_title”というシーンをApplication.LoadLevel(Cocos2DのreplaceSceneと同様なAPI)で強制的にロードさせる。

$サイバーエージェント 公式エンジニアブログ-倉庫番ゲーム:タイトル画面




もし "Play"をタップしたら
Cukunityが”Play”というGUIElementやRendererを使った”Play”というGameObjectの画面上の座標の中心にタッチイベントを発生させる。"Play"というのは、「Play」メニューというものを指します。こうすると、プレイ画面に遷移します。

$サイバーエージェント 公式エンジニアブログ-倉庫番ゲーム:プレイ画面




かつ "Up"をタップしたら
"Up"というのは、プレイ画面に表示されている「Up」(前へ進む)ボタンとのことです。

$サイバーエージェント 公式エンジニアブログ-倉庫番ゲーム:画面下部のボタンによって操作できる




かつ "Left"をタップしたら
"Left"というのは、プレイ画面に表示されている「Left」(左を向く)ボタンとのことで。"Right"は右を向くとのことを指します。


ならば "GameClear"を表示していること
上記のタップ操作によって”Game Clear”というテクスチャーが見えるようになったかどうかを確認する。

$サイバーエージェント 公式エンジニアブログ-倉庫番ゲーム:クリア画面




かつ "44"と表示していること
上記省略された合計で44のステップでレベル1をクリアすると、"44"という内容を持ったラベルが見えるかどうかを確認する。

$サイバーエージェント 公式エンジニアブログ



終わりに

現状、cukunityがUnityのコアなクラスの一部(GameObject、Component、Behavior、Camera、GUIElement、GUIText、GUITexture、Transformなど)しか対応していません。
そのため、今の時点ではすぐに導入出来るツールではないです。将来的に、EZGUIのような業界でよく使われているプラグインのクラスを対応してもっと役に立つフレームワークにしたいと思います。

cukunityフレームワーク、コンセプトとしてはいかがでしょうか?