概要

Unity ML-Agentsの検証で、ターン制でも強化学習できるのか?という疑問があったので、ターン制バトルゲームを作ってみようと思い、まずは仕様検討からしてみました。1人プロジェクトだけど、インセプションデッキもつくってみました。

インセプションデッキは1人プロジェクトでもまとめておくと、後々頼りになるから、おすすめ。
設計もUMLとかで見える化しておくとないのとでは、後からじわじわと効いてきます。

詳細はまあ適当。まぁ週末の息抜きだからね。仕方ないね。

同じような案件を抱えておられるからがいたら、ぜひ話がしたい!呑みに行きたい!

インセプションデッキ

プロジェクトの名前

EndlessTurnBattle

名前をつけた理由

  • 終わらないターン制バトルゲームにしたい
  • 強化学習でぶん回せるようにしたい

我われはなぜここにいるのか?

  1. ターン制ゲームで強化学習が活用できるか検証する
  2. Unity ML-Agentsの使いどころを知るため

プロジェクトの根幹に関わる理由

Unity ML-Agentsが活用できるターン制ゲームをつくる!

エレベーターピッチ

  • Unity ML-Agentsを活用してゲーム開発したい
  • ゲーム開発者向けの、
  • ずっと俺のターンというプロダクトは、
  • ターン制2Dゲームです。
  • これはUnity ML-AgentsによるNPCの実装ができ、
  • 開発者による調整とは違って、
  • NPCの調整が自動かできる可能性が備わっています。

パッケージデザイン

ずっと俺のターン!!

最高のキャッチコピー

Unity ML-Agentsを利用してターン制バトルのNPCが調整できる!

ユーザーへのアピール

  1. Unity ML-Agentsを利用してNPC調整ができる
  2. 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

元記事はこちら

ターン制2Dゲーム作成の仕様を検討してみた