ゲーム開発を受注しようぜ＜その１＞　開発環境の準備

# 告知
読者がいるところ悪いんだが、連載の続きは　別ブログに移した。

http://ordergame.warabenture.com/?p=25

Qiita にも画像アップロード容量の上限があるようで、全記事のまとめ直しを進めている。


# ゲーム開発を受注しようぜ

実践が　何よりもの技術解説になるだろう。

早見表

|見どころ|内容|
|---|---|
|開始|2017-04-10(月) 打ち合わせ時|
|規模|5人以下|
|もの|スマホ、アンドロイド|
|内容|ただ走るだけのアクションゲーム|
|自分がやること|指示を出される側<br />プログラム<br />ワイヤーフレーム作り、初期の設計・開発|
|サイクル|設計： 先に固める<br />開発： 週次、金曜　成果物提出|
|縛り|プログラムのコードをQiitaに載せない|

流れ

|時期|わたし視点|
|---|---|
|これ以前|イベントでの知り合いとともに、１か月かからず将棋対局サーバーを立てた。家賃を払えた。|
|2017-04-02(日)|家賃を払いたい。その知り合いづてに仕事くれくれ！とTwitterでDMを送る。<br />紹介してもらう。次は4/10。|
|2017-04-10(月)|対面して打ち合わせ。コンテンツ制作を事業としている人と、<br />家賃が払いたい人との間で成立。|
|2017-04-13(木)|説明、環境等が準備される。|

# 一元管理

「出した指示を　見逃されている」ということを防ぐためのもの。どちらかと言うと　指示を出す側の技術。

べつに　ゲーム開発だから、というテクニックでもないが、**ホワイトボードの代わりになるもの** と **タイムマシンのようなもの** は　よく使うようだ。


## ホワイトボードのようなもの
例えば

- [x] グーグル・ドキュメント
- [ ] スラック
- [ ] サイボウズ

などなど。
やりたいことは、 **TODO:** を **Done** に　させること。

## タイムマシンのようなもの
例えば

- [ ] ビットバケツ
- [x] ギットハブ
- [ ] サブバージョン
- [ ] 手動コピー・バックアップ

などなど。
やりたいことは、 **開発の方針が　うまくいかなくなったときに、ある時点まで戻って　復帰させる** こと。

# **[必要]** こんなゲームを作りたい、という見本を遊ぶ

スマホの　このゲーム、あのゲーム　を作りたい、と言った感じで **URL** を紹介される。

- Ｗｅｂサイトに行く
- 自分の　スマホのメールアドレス　を入力する
- スマホにメールで　ゲームをインストールするページへのリンクが送られてくる。[Play ストア]でアクセス
- [インストール] ボタンを押す
- [開く] で遊べる

**とりあえず　当てもなく　３０分ぐらい遊ぶ。**

# **[オプション]** 「どうやる」を　こうやると思っている、という参考記事リンク

- 背景を奥に置いて、近景があって、キャラクターを手前に置いて……といった　記事
- 伸びるソシャゲの育て方のような（分析系の）　記事

などなど。　ソシャゲの（分析系の）専門用語がキツい。

「参考」をどこまで利用するのかも悩みどころだが　多分これが「普通」だと思っているはずなので、その **普通の感覚** を合わせる。

- たぶん、岩とか　オブジェクトを　１枚画像で置けると思っているのだろう。（タイル方式にしたらヤバいかもしれない）
- ソシャゲ運用に出てくる（分析系の）専門用語を知っておく（多分、自分にはほとんど関係ない）

などなど。

**後回しにしよう。**

# **[必要]** 環境

- [x] 設計図
  - [x] シーケンス図
  - [x] クラス図
- [x] 使用ソフトウェア/技術
  - [x] Unity
  - [x] C#
  - [x] Visual Studio 2017
  - [x] Plant UML (ローカルPC版)
    - [x] Plant UML (Web版; 大きな画像は切れてしまう欠点がある)
  - [x] Dropbox (JSONを置くのに使う)
  - [x] JSON
  - [x] Git Hub
  - [x] Libre Office (JSONをスプレッドシートに吸い取れないだろうか？ 実際使うかどうかは不明)
  - [x] グーグル・ドライブ
- [ ] コード規約(C#)
  - [ ] クラスにコメント
  - [ ] メソッドにコメント
  - [ ] 定数にコメント（ゲームバランスに関係のある値は全て定数化）

これの報告が必要。
これだけで　ゲームが作れるんだろうか？　他に漏れはないか？

## シーケンス図って何だ？

![20170413a1.png](https://qiita-image-store.s3.amazonaws.com/0/159417/43d0140b-57f7-d2f7-9fba-aa77d9f8fbcf.png)

```PlantUML
@startuml
きふわらべ -> お父ん : 起きろ☆！
きふわらべ <- お父ん : 起きてるぜ☆！
@enduml
```

**リファレンス**
「シーケンス図」PlantUML in a nutshell
http://plantuml.com/sequence-diagram

上のコードを、下のWeb版のテキストボックスにコピペして [Submit]ボタンを押せば　画像が生成される。

**Web版** (画像が大きくなると　ちょん切れてしまうという欠点がある)
http://www.plantuml.com/plantuml/uml/SoWkIImgAStDuNhSsFkuSUlZflx7JPsF6tSgwDefF6xiUjwnxN7JP0KhXHTRjuDKDFK-cj7sVayZXd8RNMpA6vSzRkf-t3W7giaXDIy5Q1S0

「plantUML(Web版)」Qiita
http://qiita.com/borerere/items/99d73d7295840a28c473

Web版が早いが、ローカルPC版の PlantUML も以前にインストールした。

「PlantUMLをインストールしようぜ」Qiita
http://qiita.com/muzudho1/items/25c229a60559b0aa2bc4

シーケンス図を使う段階は　プログラムも　具体的な段階だ。

## クラス図って何だ？

![20170413a2.png](https://qiita-image-store.s3.amazonaws.com/0/159417/9034b3c0-e6b3-dcbd-eeee-814f68cff14e.png)

```PlantUML
@startuml
interface 二足歩行{
  + 前進()
}
interface USI将棋エンジン{
  + ベストムーブ()
}
class お父ん{
  + お金
}
class きふわらべ{
  + 電力
}
二足歩行 <|-- お父ん
二足歩行 <|--きふわらべ
USI将棋エンジン <|-- きふわらべ
@enduml
```

**リファレンス**
「クラス図」plantuml
http://plantuml.com/class-diagram

クラス図を使う段階は　プログラムも　具体的な段階だ。

## PlantUML って何だ？

UML という種類の図面を書くソフト。

「PlantUML Cheat Sheet」Qiita
http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48

## ドロップボックスって何だ？

Dropbox
https://www.dropbox.com/

ファイルを置いておけるところ。

## JSON って何だ？

JSON
http://www.json.org/

```json
{
  "きふわらべ":"起きろ、お父ん！",
  "お父ん":"起きてるぜ"
}
```

テキストで送受信できる、データの書き方。PHP とか　これに対応している。
保存しておくもの。

- ゲームのプレイデータ
- 各プレイのトータルしたデータ

## Unity って何だ？

Unity
https://unity3d.com/jp/

ゲーム開発環境。スマホ/アンドロイド のゲームも作れる。

## C# って何だ？

Unity でプログラムを書くときに使える言語の１つ。

「C# Programming Guide」MSDN
https://msdn.microsoft.com/en-us/library/67ef8sbd.aspx

## Visual Studio 2017 って何だ？

Visual Studio
https://www.visualstudio.com/ja/vs/whatsnew/?rr=https%3A%2F%2Fwww.google.co.jp%2F

Windows で C# を書くのに使いやすい。開発環境。

「UnityでVisualStudioをデフォルトのエディタに設定する」Qiita
http://qiita.com/nishiken1112/items/94634a07551fc8d54c0e

## Git Hub って何だ？

Git Hub
https://github.com/

ソースコードを　置いておくところ。古いバージョンも残しておいてくれる。

## Libre Office って何だ？

無料のスプレッドシート。
データ入力するなら基本装備なんだが、大量のデータを扱わない人は　使ったことがないこともあり、これの導入が採用されるかどうかは　チームの経験による。

「LibreOfficeをインストールしよう」Qiita
http://qiita.com/muzudho1/items/dcd876a26a223045535c

## グーグル・ドライブ

共同作業ができるオフィス・スイート。企業が使う場合は、有料のバージョンを使うことになるか。

# 実装目標
まだ　コーディングしない。先に　シーケンス図、クラス図　が必要。

## ハードウェア面
- [ ] アンドロイドOS (スマホ)
- [ ] Unity 2D (横に走るゲームで3Dを要望されるだろうか？)
- [ ] アスペクト比、画面サイズ

## **[要件にはない]** 状態遷移図 (画面)

要件にはないものの　プログラムするときには使う。

![20170413a5b2.png](https://qiita-image-store.s3.amazonaws.com/0/159417/0c9b8576-04eb-87fd-2a46-3e413f69e0ba.png)

参照記事: 「ステートマシン図 & 状態遷移表 チュートリアル」ChangeVision http://www.changevision.co/tutorial-statemachine-japanese.html
参照記事: 「誤解しがちなモデリングの技 第3回：ステートマシン図（Ｉ）」豆蔵ソフト工学ラボ http://labo.mamezou.com/special/sp_002/sp_002_003.html

PlantUML で 気づきにくい書き方を抜粋。

改行 `\n` ヨコ線の引き方 `--`

```PlantUML
note "用語\n--\nスター : ステージ中で拾うもの" as n2
```

ボックスを縦に並べる方法 `-up->` と `-down->` の両方を書くこと。PlantUMLによると、指定は多用せず自動描画に頼るのがよいとのこと。

```PlantUML
ステージ詳細 -down-> ステージ : スタートボタン タップ
リザルト -up-> ステージ詳細 : OKボタン タップ
```

その他詳細

- ステージは最初　１つで、ミッション規定数クリアー時に　次のステージが開放されていく
- ミッションは　もらっている説明書に書いてあるのを用意していく。２種類ある
 - そのステージ内で達成するもの
 - 累積で達成するもの

## **[要件にはない]** 状態遷移図 (ステージ)

要件にはないものの　プログラムするときには使う。

![20170413a6b3.png](https://qiita-image-store.s3.amazonaws.com/0/159417/d68ed75a-707f-7356-5b13-6b00092c67f1.png)

書き方が　よく分からないんだが、読む方も　読み方が　よく分からないんじゃないだろうか？
仕様を読むと「待機」と「スペシャル」もあるんだが、ここに書いとかないと忘れる。書いた。

## **[要件にはない]** 状態遷移図 (体力ゲージ)

要件にはないものの　プログラムするときには使う。

![20170413a7.png](https://qiita-image-store.s3.amazonaws.com/0/159417/6062f1da-597f-961e-20ba-16a85dd76c47.png)

## **[要件にはない]** 状態遷移図 (スペシャルゲージ)

要件にはないものの　プログラムするときには使う。

![20170413a8.png](https://qiita-image-store.s3.amazonaws.com/0/159417/d71c9735-3dc4-b97c-a273-f1cb64fa0c64.png)

# データ構造

## ステージ / 画面構成 / レイヤー

空（そら）とか　キャラクターとか。Unityに初期装備の機能。

|奥が0|用途|備考|
|---|---|---|
|0|空(そら)||
|1|背景||
|2|足場||
|3|キャラクター||
|4|エフェクト|爆発とか|
||**以下、システム表示系**||
|5|コントローラー|ボタンとか|
|6|ポップアップ|メニューとか|

## キャラクター・データ、ステージ構成

データを　どう入力するか、どう格納するか、なんだが　しばらく JSON だけでいけるか。

Unity でファイルの保存ができたかどうか？ 開発中はローカルに保存しておくとして、
そのうち C# で Webサイトに向かって JSON を POST送信 することになるかもしれない。

例えば　データをソートしたくなったときは C# で対応できるのか？ LINQ を覚える必要があるか？

# シーケンス図と　クラス図

要件に入ってるんで、コーディングはまだだが　設計図レベルで　プログラミングを始めろということだろう。
じゃあ　設計を考えるか。

２Ｄ格闘用のライブラリを自前で持っているんだが、**メンテナンスしてくれ、と言われるのも面倒なので、** 一から書き直してコードの責任は丸投げすることにする。

**Assets/Scripts/Scenes** (スクリプトの内、特定シーンの中だけで使うもの)

- [ ] TitleScene/
 - [ ] Common (同名のクラスが多いが、ネームスペースで分ける)
 - [ ] Camera
- [ ] StageSelectScene/
 - [ ] Common
 - [ ] Camera
- [ ] StagePreviewScene/
 - [ ] Common
 - [ ] Camera
- [ ] StageDetailScene/
 - [ ] Common
 - [ ] Camera
- [ ] StageScene/
 - [ ] Common
 - [ ] Camera
 - [ ] Player
 - [ ] Enemy
 - [ ] StageItem
- [ ] ResultScene/
 - [ ] Common
 - [ ] Camera

**Assets/Scripts** (スクリプトの内、シーンを跨って使うもの)

- [ ] CampMenu
 - [ ] Cursors (スマホゲーにカーソルとかあっただろうか？）
 - [ ] - PauseMenuCursor
 - [ ] Buttons
 - [ ] - GameStart
 - [ ] - Stage1Start (ここらへん　どう用意するのか）
 - [ ] - JumpButton
 - [ ] - TackleButton
 - [ ] - MenuButton
 - [ ] Menus
 - [ ] - PauseWindow
 - [ ] - ContinueMenu (ここらへん　どう用意するのか）
 - [ ] - QuitMenu
 - [ ] QuestItems

**Assets/Resources/AnimationClips** (いわゆるドットアニメ)

**Assets/Resources/AnimatorControllers** (いわゆるモーションの状態遷移)

**Assets/Resources/Prefabs** (爆発の粒など、量産品)

**Assets/Resources/SoundEffects** (効果音)

**Assets/Resources/Sprites** (いわゆる画像)

- [ ] Ui
 - [ ] Bars (ゲージとか)
 - [ ] - LifeBar
 - [ ] - SpecialBar
 - [ ] Figures (数字)
 - [ ] - ScoreNum
 - [ ] Buttons
- [ ] Stages
 - [ ] Backgrounds (背景)
 - [ ] - TitleBack
 - [ ] - CampBack
 - [ ] Grounds (地面)
- [ ] Characters
 - [ ] Player (ここらへん　どう用意するのか）
 - [ ] - Wait (ダメージもここに含む)
 - [ ] - Dash
 - [ ] - Jump
 - [ ] - Tackle
 - [ ] - Special
 - [ ] - Other (ダウンなどはここに含む)
 - [ ] Enemy （敵といっても、ブロックみたいな障害物だろう）
 - [ ] - Wait
- [ ] Particles
- [ ] StageItems (ステージ中に落ちているもの)
 - [ ] Magnet
 - [ ] Invincible
 - [ ] CoinFever (コイン２倍)
 - [ ] LifeS (ライフ小)
 - [ ] LifeL (ライフ大)
 - [ ] Coin
- [ ] CampItems (クエストで購入するもの。今回は対象外か)

現状　何の話題にも上ってないが、台詞ウィンドウとか　ランキング・ボードとか　出てくるかもしれない。

# クラス設計

シーンの初期化とか　Unity で　どんなメソッドだったろうか。調べ直さないと。

初期化が Start( ) で、不定期のフレーム実行が Update( ) ではないだろうか。

## シーン

![20170419a1.png](https://qiita-image-store.s3.amazonaws.com/0/159417/fa346679-4607-5706-3bc0-f694a0290f1d.png)

まだ全然足りないんだが、そのうち埋めていくことにしよう。

PluntUML は、400KB を超えると　画像が切れてしまうようだ。 設定で 800KB まで増やせるようだが、Windows 出のやり方が分からなかった。

「PlantUMLのpng画像が切れてしまう」pospomeのプログラミング日記
http://pospome.hatenablog.com/entry/20160422/1461322513

# シーケンス設計

シーケンス図も要件なんだが、多者間で交互に同期するものでもないと　書くことがないぜ。
ファイルをロードするとか。

# 提出場所

決まってないが、指示書があったとこに　放り込んどくか。

以降の記事は　再構成中だ。
http://qiita.com/muzudho1/items/86fedc87b4b9e5731bfb