概要
Unity ML-Agentsの検証で、ターン制でも強化学習できるのか?という疑問があったので、ターン制バトルゲームを作ってみようと思い、まずは仕様検討からしてみました。1人プロジェクトだけど、インセプションデッキもつくってみました。
インセプションデッキは1人プロジェクトでもまとめておくと、後々頼りになるから、おすすめ。
設計もUMLとかで見える化しておくとないのとでは、後からじわじわと効いてきます。
詳細はまあ適当。まぁ週末の息抜きだからね。仕方ないね。
同じような案件を抱えておられるからがいたら、ぜひ話がしたい!呑みに行きたい!
インセプションデッキ
プロジェクトの名前
EndlessTurnBattle
名前をつけた理由
- 終わらないターン制バトルゲームにしたい
- 強化学習でぶん回せるようにしたい
我われはなぜここにいるのか?
- ターン制ゲームで強化学習が活用できるか検証する
- Unity ML-Agentsの使いどころを知るため
プロジェクトの根幹に関わる理由
Unity ML-Agentsが活用できるターン制ゲームをつくる!
エレベーターピッチ
- Unity ML-Agentsを活用してゲーム開発したい
- ゲーム開発者向けの、
- ずっと俺のターンというプロダクトは、
- ターン制2Dゲームです。
- これはUnity ML-AgentsによるNPCの実装ができ、
- 開発者による調整とは違って、
- NPCの調整が自動かできる可能性が備わっています。
パッケージデザイン
ずっと俺のターン!!
最高のキャッチコピー
Unity ML-Agentsを利用してターン制バトルのNPCが調整できる!
ユーザーへのアピール
- Unity ML-Agentsを利用してNPC調整ができる
- Unity ML-Agentsの活用方法がみえてくる
やらないことリスト
カテゴリ | 項目 | やる/やらない/あとで | 理由 |
---|---|---|---|
強化学習 | Unity ML-Agentsの組み込み | やる | 必須 |
ゲーム | バトル | やる | 必須だから |
ゲーム | ストーリー | やらない | リリースしないから |
ゲーム | キャラクタ育成 | やらない | 自動でパターンつくるから |
ゲーム | ユーザ操作 | あとで決める | 強化学習が優先されるから |
デザイン | キャラ作成 | やらない | 既存キャラを流用するから |
プロジェクトコミュニティは...
(略)
技術的な解決策の概要
採用する技術
- C#
- Unity ML-Agents
- Unity、VSCode
- PPO
夜も眠れなくなるような問題は何だろう?
- ターン制ゲームにUnity ML-Agentsが合わない
- ゲーム開発できない
期間を見極める
(略)
トレードオフ・スライダー
典型的なフォース
max | >>> | >>> | >>> | min | 項目 |
---|---|---|---|---|---|
o | 機能をぜんぶ揃える(スコープ) | ||||
o | 予算内に収める(予算) | ||||
o | 期日を死守する(時間) | ||||
o | 高い品質、少ない欠陥(品質) |
上記以外で重要なこと
max | >>> | >>> | >>> | min | 項目 |
---|---|---|---|---|---|
o | 使い勝手 | ||||
o | とにかくシンプルに! | ||||
o | 詳細な監査ログ |
何がどれだけ必要なのか
(略)
俺たちの"Aチーム"
人数 | 役割 | 強みや期待すること |
---|---|---|
1 | アナリスト | Unity ML-Agentsの特性を知っている |
2 | 開発者 | Unity、C#が利用できる |
仕様
キャラデータは流用する
すばらしきポケモンエコシステム
https://qiita.com/seya/items/47dc0ebae55674d8902f
バトル方式
- アクティビティターン(FF方式?)
- 3 vs 3
- 6体の速度によってコマンド選択順を決定する
- コマンドは[どの行動]を[どの敵に]する
- なにもしない、防御もあり
- コマンド選択後すぐに行動する
- 全滅させたら勝ち、させられたら負け
行動
- アイテム利用はなし
画面描画
- コマンド選択と行動がログ表示される
- 状況が表示される
- 勝敗数が表示される
強化学習
- 3体の行動を選択する
- プレイヤーと敵
- プレイヤーは強化学習せず操作可能にする
- 敵駒を倒すと+
- 手駒が倒されると-
- 全滅させると+
- 全滅させられると-
- 敵駒を攻撃すると+
- 手駒が攻撃されると-
詳細仕様
ゲーム制御
ゲーム開始時
- キャラクターをプレイヤごとに3体ずつランダムに選択する
- ターン制御を開始する
ターン終了時
- 勝敗を判定する
- 勝敗が決した場合、ゲーム終了する
- ゲーム終了後、再度ゲーム開始する
ターン制御
ターン開始時
- 行動可能なキャラクタで行動順を決定する
ターン進行中
- 行動可能なキャラクタのプレイヤに行動決定を指示する
- ターン順から行動終了したキャラクタを削除する
ターン終了時
- ゲーム制御に勝敗判定を確認する
プレーヤ
- 行動可能なキャラクターの行動を指示する
キャラクタ
- 指示された行動を行う
- 攻撃された場合、スタミナを減少させる
- 行動可能判定を行う
状況表示
- ターン順を表示する
- 各キャラクターの状態を表示する
スコア
- 勝敗数を表示する
ログ
- 各種ログを表示する
状態遷移図
@startuml{ターン制バトル状態遷移図.png}
[*] --> ゲーム開始前
ゲーム開始前 -> ゲーム中
state ゲーム中 {
[*] --> ターン開始前
ターン開始前 -down-> ターン開始
ターン終了 -right-> ターン開始前
ターン終了 -right-> ゲーム開始前
ターン終了 --> ゲーム終了
ターン開始 --> 行動選択
行動選択 -> 行動
行動 -right-> 行動終了
行動終了 -> ターン終了
}
state ゲーム終了 {
}
ゲーム終了 --> [*]
ゲーム開始前 : entry / キャラクター選択
ゲーム開始前 : exit / ゲーム開始
ゲーム中 : do / ターン順表示
ゲーム中 : do / キャラクター状態表示
ターン開始前 : entry / 行動キャラ指定
ターン開始前 : exit / ターン開始
ターン開始 : entry / 行動パターン設定
ターン開始 : exit / 行動開始
行動選択 : do / 行動選択待ち受け
行動 : entry / 行動実行
行動 : exit / 行動終了
行動終了 : entry / 行動結果反映
行動終了 : exit / 自ターン終了
ターン終了 : entry / 勝敗判定
ターン終了 : exit / 次ターン開始
ターン終了 : exit / ゲーム終了
@enduml
参考
5分でわかった気になるインセプションデッキ
https://www.slideshare.net/TakaoOyobe/5-45195080
スクラムで使う「インセプションデッキ」のmarkdown形式版テンプレート
https://qiita.com/bremen/items/ed491246ed83630bc84d
PlantUML - 状態遷移図(ステートマシン図)
http://yohshiy.blog.fc2.com/blog-entry-157.html
サクッとPlantUMLで状態遷移図を書いてみた
https://qiita.com/ysida/items/0bcc207947cbce6251df