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

## 概要

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

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

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

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

## インセプションデッキ

### プロジェクトの名前

EndlessTurnBattle

#### 名前をつけた理由

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

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

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

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

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

### エレベーターピッチ

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


### パッケージデザイン

ずっと俺のターン！！

![](https://i.imgur.com/t5FuuzT.png)


#### 最高のキャッチコピー

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体ずつランダムに選択する
- ターン制御を開始する

#### ターン終了時

- 勝敗を判定する
- 勝敗が決した場合、ゲーム終了する
- ゲーム終了後、再度ゲーム開始する

#### ターン制御

#### ターン開始時

- 行動可能なキャラクタで行動順を決定する

#### ターン進行中

- 行動可能なキャラクタのプレイヤに行動決定を指示する
- ターン順から行動終了したキャラクタを削除する

#### ターン終了時

- ゲーム制御に勝敗判定を確認する

#### プレーヤ

- 行動可能なキャラクターの行動を指示する

#### キャラクタ

- 指示された行動を行う
- 攻撃された場合、スタミナを減少させる
- 行動可能判定を行う

#### 状況表示

- ターン順を表示する
- 各キャラクターの状態を表示する

#### スコア

- 勝敗数を表示する

#### ログ

- 各種ログを表示する


### 状態遷移図

![ターン制バトル状態遷移図](http://www.plantuml.com/plantuml/png/XPJDJi904CVl-nHpDgdUEHZUmtWmWI295eCrQWY7jW6KGf03Oln06ab08vX8K8967sRP5jx2qcxRxMw9j-xCR_xpiRDD7YjxUUNayA1WLp-iah5KF-t-5xaRRnx9cIBQsTW5ITe6hBrZ_HlhtUMrGVe6kQmZqGGiE9yEaQEjf2CcA220KFJNTOn3KOWnWfJAdSeYpyBsH9lFoY3bivbzvLzfaHQwYw5PqBCXiLuNMvWrOhIMwjIgTXo4FKBW3XnX7TwPQaFa26nJb2Zo0wPemV7mjbLPpjnHtBKb82qh-NFOSfI6M7_2-ZFMthnij8dugBEiuWP5V4oArOKd89Lp8NzCtVB27DYzsHgCBy1RIng2OhOZhDwRLo1XrIfaTBicn2yzkb4yB8hhpG1P38On-g4ulNQg75a2sYrh8pybh9gaqSPgqwU5z6Jqw7mmNZQJlvEHjU4LxCcLrRadZRfrqnL8gbPvuJSDyOyXb2N6WzLgaujUP1QyflLgyhDUo_AFB9cMKyuFwWy0 "ターン制バトル状態遷移図")

```uml
@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