大学生が有料スマホゲームを作った全てを公開するよ（３）ゲームの構造・パズルとアクションの仕組み（前編）

[大学生が有料スマホゲームを作った全てを公開するよ（２）開発環境とゲームの構成](https://qiita.com/shoi_ito/items/b9acd13f5fe80536fd0d)
の続き。
第一回はこちら。
[大学生が有料スマホゲームを作った全てを公開するよ（１）イントロダクション](https://qiita.com/shoi_ito/items/2234414af441e448a85e)

今回は、メインの**ゲームシーン**について。
いわゆる、**インゲーム**と呼ばれる部分。
逆に、メニュー画面とかは**アウトゲーム**って呼ばれる。
pertica(この記事で紹介するゲーム)の場合は、**パズル**と**アクションの仕組み**を中心に解説していくよ。
パズルと言っても**謎解き**みたいな感じだから、もしかしたらみんなのイメージとは少し違うかもしれない。

#ちょっとずつUnityも出てくる
ここから先は、ちょっとずつ**Unity**の話になる。
**プログラミング**も出てくるし、
初めて見る人には結構難しいかもしれない。
**Unityがどんなものかの説明**も書いてるから、
なんとなーくでも理解してもらえると嬉しい。
後でUnityを使うようになったら**また見に来ても良いよ**！

Unityを知っている人や、ゲームを作った事がある人は参考にしてみて。
ボクはこうやってゲームを作ったよ。
この記事だと、後になるほど技術的になるから記事の下の方を見ると面白いかも。
これは前編で、後編はもっと技術的な話をするつもり。
アドバイスも待ってます！

#主要なゲームオブジェクト
前回の記事でも触れたけど、ゲームシーンは大きく３つの機能を持っている。

- メニューで選択したステージを生成する
- ステージが遊べる
- クリアしたら保存する

この３つだ。
そして、これを実現するために、
このゲームは**１０個の「部品」**で出来ている。

![pertica_Qiita説明.png](https://qiita-image-store.s3.amazonaws.com/0/343309/7f5e4f39-b0ae-fc2d-bfbf-f5a74353be4b.png "なぜかFireAlpacaで書いたよ")

1. プレイヤー [Player]
- ブロック [Blocks]
- 敵 [Enemies]
- アイテム [Items]
- その他のステージオブジェクト [Others]
- カメラ [Main Camera]
- ゲームマネージャー [GameController]
- デコードオブジェクト [DecodeObject]
- UI（リトライボタン、戻るボタン） [UI Canvas]
- BGM・SE [BGMSource, SESource]

これらの**「部品」**を今後は、**「ゲームオブジェクト」**と呼ぶことにするよ。
Unityの中でも同じ名前で呼ばれるんだ。
でも長いから短く**「オブジェクト」**って言う時があるかも。

ちなみに、[ ]の中はUnityの中での名前だ。
それぞれ説明するね。

###プレイヤー
ゲームを遊ぶ人が操作する**キャラクター**だ。

- タップした場所に弾を飛ばす
- 弾が当たったオブジェクトと入れ替わる
- 敵に触れたら死んでしまう

この３つの機能を持っているよ。


###ブロック
基本的に**四角くて動かない**もの。
壁のこと。
マリオのブロックみたいな、四角くて動かないオブジェクトだ。

###敵
**プレイヤー**は**敵**に当たると**死んでしまう**。
プレイヤーに対して**攻撃をしてくる**オブジェクトだ。
マリオのクリボーとかノコノコと同じだ。

###アイテム
壁を出したり消したりする**スイッチ**とか、**ワープホール**とか。
プレイヤーが道具として使うもの。
壁と違って**動く**可能性があって、**四角くない**。
マリオでいうと、キノコとかスターのことだ。

###その他のステージオブジェクト
今説明した「プレイヤー、ブロック、敵、アイテム」の事を、ボクは「**ステージオブジェクト**」と呼ぶことにしたんだ。
でも**背景の星**とか、敵が出す**レーザー**なんかはその４つでは分類できない。
だからブロック、敵、アイテムに分けにくいものを、例外として分類する為に「その他」を作ったんだ。
これでステージオブジェクトは**「プレイヤー、ブロック、敵、アイテム、その他」**の**５種類**になった。

###カメラ
**カメラ**はスマホの画面に**ゲームを映す機能**をもってる。
**テレビ**は**ビデオカメラで撮影**した映像を表示してるよね。
あれと同じで、**ゲームの中の出来事を撮影**して**スマホの画面に表示**してくれるんだ。
ズームしたり、カメラを複数使うことも出来るよ。

###ゲームマネージャー
ゲーム全体の**管理をする**オブジェクトだ。
このゲーム(pertica)では、

- リセット
- メニューに戻る
- ステージオブジェクトを作る
- フェードイン

の４つの機能を担当している。

###デコードオブジェクト
ゲームの最初に**ステージを設置**する機能を持ってる。
perticaはパズルゲームだから、パズルのステージを用意しないといけない。
ステージはたくさん欲しいよね。
そしたらボクだけじゃなくて、友達にもステージを作ってもらった方が良さそうだ。
友達がステージを作れるように、ボクは友達に**「ステージを作るツール」**を渡す。
友達はステージを作ったら、**「保存」**ボタンを押す。
そうすると、作ったステージが「どこに何があるか」を**文字**にした**データ**になるんだ。
でも**データ**では遊ぶ事は出来ない。
遊ぶ時には**データ**を実際に**ステージ**に変換しなきゃいけない。
それをするのが、この**デコードオブジェクト**なんだ。
ゲームが始まった瞬間に、「メニューで選んだステージの**データ**」から「**ステージ**」を作ってくれる、とっても賢いヤツなんだ。

###UI
**リトライボタン**とか、**メニューに戻るボタン**の事だ。
UIっていうのは、人がゲームを操作するために必要な**仲介人**なんだ。
「ゲームをもう一度やり直したい」とか、「メニューに戻りたい」と思うよね。
UIに頼めば、それを実際にやってくれるんだ。
頼む方法はボタンを押すだけだよ。

###BGM・SE
**音**を流す機能を持っている。
BGMはゲーム中にずっとなってる**音楽**
SEは「弾を飛ばす音」「スイッチを押す音」みたいな**効果音**の事だ。

#実装方法
ゲームが何で出来てるかは何となく分かったかな？
部品が「１０個」なのは多いと思った？
それとも少ないと感じたかな。
段々と技術的な話に入っていくよ。
面白くなかったら飛ばして、最後のコメントだけ見ても良いよ。
今回は、ちょっとした**制作秘話**も書いてみた。

ここからは、Unityを少し知っている人向けになると思う。
でもUnityを知らない人にも楽しんでもらいたいから、
簡単にUnityでの**ゲームの考え方**を書いてみるね。

##Unityの簡単な説明
![_Unityの説明.png](https://qiita-image-store.s3.amazonaws.com/0/343309/90d5c073-a577-709a-4e56-dd2e5a59c713.png)

Unityでは[主要なゲームオブジェクト](https://qiita.com/shoi_ito/items/a2adf87dd783c8379178#%E4%B8%BB%E8%A6%81%E3%81%AA%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88 "「Player2」になってるのは気にしないで")で書いたような**部品**の事を**ゲームオブジェクト**と呼ぶって言ったね。
それぞれの**ゲームオブジェクト**は、さらに**コンポーネント**と呼ばれるもっと**「小さな部品」**で出来てるんだ。

![スクリーンショット 2019-01-22 13.46.46.png](https://qiita-image-store.s3.amazonaws.com/0/343309/400dce0a-5ea3-3347-1c95-422cbd1ca7f2.png)


例えば、ゲーム内の**プレイヤー**は

- 今いる**座標**を定める部品 [Transform]
- **見た目**を決める部品 [Particle System]
- **物理挙動**を制御する部品 [Rigidbody 2D]
- **当たり判定**を調べる部品 [Circle Collider 2D]
- **アニメーション**を制御する部品 [Animator]
- プレイヤーの**動作(弾を飛ばす、移動するなど)**を制御する部品 [Player(Script)]

みたいな**小さな部品(コンポーネント)**で出来ている。
このうち、**上の５つ**はUnityが用意してくれてるんだ。
だから、ボクが作るのは**一番下の一つ**だけ。
このゲーム特有の動きを決めるんだ。
**脳**を作ると言っても良い。
そして、この部品を作るために**プログラミング**を使うんだよ。

[ ]の中はUnityの中での呼び方で、**Player(Script)**はボクが作ったんだ。
こういう**プログラミング**で、**自分で作ったコンポーネント**を今後は**「スクリプト」**と呼ぶよ。
Unityの考え方では、
「**車**の部品に**タイヤ**があって、**タイヤ**の部品に**ネジ**がある」みたいに
「**ゲーム**の部品に**プレイヤー**があって、**プレイヤー**の部品に**Player(Script)**」があるんだ。

少し退屈かもしれないけど、このゲームのUnityでの実装の仕方を書き残しておくね。

##プロジェクトツリー
メインシーンの説明の前に、Unityのプロジェクトのファイルツリーを書いておくよ。

```
Assets
├─ Animation
├─ Data
├─ Image
├─ Material
├─ Music
├─ ParticleSystem
├─ Prefab
├─ Scene
└─ Script
```
主要なのはこんな感じ。
さらに**Resources**って名前のフォルダを必要に応じてそれぞれのフォルダの下に作るんだ。

##ゲームの仕組みを構造的に見る

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.amazonaws.com/0/343309/7dde1d4c-499e-341d-33f5-c27c87341098.gif "gifだからカクカクダァ")


![pertica_Qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/343309/4d35c438-4840-3410-e9d4-8abada55c644.png "Draw.ioで書いたよ")

ここからゲームシーンの説明だ。
Unity内のメインのゲームシーンは、DecodeStageと呼ばれるシーン名で管理している。
このシーンが実行されると、まず**DecodeObject**がデータフォルダに入っているデータをもとに**ステージを生成**する。
次に、**Main Camera**がゴールからプレイヤーに向かって**移動**。
移動が完了すると、ゲームが始まる。
プレイヤーは、キャラクターを操作して**ゴールを目指す**。
ゴールにたどり着くとリザルトシーンに**遷移して**このシーンの役目は終わり。
分かりにくいかもしれないけど、上の図を目で追って見て欲しい。

ここからは、**１０個**の**ゲームオブジェクト**について**実装の概要**を説明するよ。

[Unityの簡単な説明](https://qiita.com/shoi_ito/items/a2adf87dd783c8379178#unity%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E8%AA%AC%E6%98%8E)で書いたようにUnityは１つの**ゲームオブジェクト**がたくさんの**コンポーネント**から出来ている。
**前編**の今回は、そのたくさんの**コンポーネント**のうちとても大事な**「脳」**の部分**「スクリプト」**を中心に解説するよ。
**「スクリプト」**は**プログラミング**を使って**ボクが作ったもの**だったね。
###プレイヤー
![pertica_Qiita_Player.png](https://qiita-image-store.s3.amazonaws.com/0/343309/f56b2f81-ea67-d3f6-f222-0014a30090f7.png "踊りは２種類あるよ。踊る意味はないよ。")

プレイヤーの構造はこんな感じだ。
そしてプレイヤーの持つスクリプトは

```Player.cs
void IdlingAnimation()
  踊るアニメーションを行うよ
  プレイヤーが一定時間何もしなかったときに使う。

public void Shift(GameObject obj)
  弾が当たったものと位置を入れ替える
  飛ばした弾が当たった時に使う
    
public void Die()
  プレイヤーが死ぬ時に使う
   ・死ぬ時のエフェクトを表示
   ・死んだ回数を保存
   ・プレイヤーのゲームオブジェクトを非アクティブにする
  みたいな事をするよ

public void Fire()
  タップした位置に弾を発射する
  画面をタップした時に使う

IEnumerator TypeAheadCoroutin()
  先行入力を行う
  弾のクールタイム中に画面がタップされた時に使う
  クールタイムの終了を待って弾を発射する準備をする
```
こんな感じ。
「void IdlingAnimation()」とか「public void Shift(GameObject obj)」とかはその下に書いてある**機能の名前**だと思ってくれたら良い。
プログラミングを触ったことが無い人は、分かりにくいよね。
プログラミングを触ったことがある人にとっては、**関数**の事だ。
日本語で書いてある説明を、UnityではC#っていう言葉を使って書くんだよ。

基本的に、先頭に**public**が書いてある関数は他のスクリプトから呼び出される。
書いていないのは、自身の**Update関数**から呼ばれる。
**Update関数**っていうのは、**毎フレーム**呼び出される関数のこと。
**フレーム**っていうのは、ゲームの世界での**時間**みたいな感じだ。
フレームは１秒に６０回くらい更新されるんだ。
だから、Updateも１秒に６０回くらい呼び出される。
Updateの中でif文で条件を書いて関数を呼び出すんだ。

###ブロック
![iOS の画像 (1).png](https://qiita-image-store.s3.amazonaws.com/0/343309/21ede954-ead9-4f2c-4742-fd95f4d43efa.png)
![iOS の画像 (2).png](https://qiita-image-store.s3.amazonaws.com/0/343309/fe51da9e-736e-3b0f-cec9-c3dc5ca208df.png)

ブロックは次の**３種類**だ。
#####通常の壁 [Wall]
四角いオブジェクトでどんなものがぶつかっても動かない。
プレイヤーの放つ弾が壁に当たると、弾が**消滅**する。

#####反射壁 [Reflection Wall]
四角いオブジェクトでどんなものがぶつかっても動かない。
プレイヤーの放つ弾が壁に当たると、弾が**跳ね返る**。

#####スイッチ壁 [Switch Wall]
レーザーのような見た目をしている。
後で紹介する**スイッチボタン**によって、壁が**出現している状態**と**消えている状態**の２つが切り替わる。
壁が**出現している**時の機能は**通常の壁と一緒**で、弾が当たるとその弾は消滅する。
壁が**消えている**状態では、壁の機能は発揮せずに弾はそのまま**通過**するよ。

さて、それぞれが持つスクリプトを説明するよ。
まずは**通常の壁 [Wall]**から。

```Wall.cs
```
何もない。
実際は少しはあるんだけど、エフェクトを出すとか名前をつけるくらいの簡単なものだけだ。
**通常の壁[Wall]**はほとんど**Unity**の機能だけで出来ているんだ。
次は**反射壁 [Reflection Wall]**。

```ReflectionWall.cs

```
も、何も無い。
反射するはずの壁が、反射するスクリプトを持っていない。
実は、弾が反射するかどうかは壁ではなく、弾の方で処理しているんだ。

じゃあ最後、**スイッチ壁 [Switch Wall]**

```SwitchWall.cs
public override void SetStats(int[] stats)
  初期状態で表示か非表示かを設定する。

public void SwitchEnabled()
  壁の表示非表示を切り替える。
  スイッチボタンの状態が切り替わった時に使う。
```
スイッチ壁はスイッチボタンが押されたときに、状態を変える。
でも壁の状態を切り替える処理自体は、スイッチ壁の機能として用意しておくんだ。

### 敵
![iOS の画像 (4).png](https://qiita-image-store.s3.amazonaws.com/0/343309/783e7082-bc7b-5c57-5ffc-aade478d322d.png)

今のところ敵は**２種類**。
名前は**ドッグ[Dog]**と**ピッグ[Pig]**だ。
名前の由来は...まぁそのうち話すよ...。
**ドッグ**は**直線移動**して、壁に当たったら**反対向き**になる。
**ピッグ**もそれは同じだけど、２つの**ピッグ**の間には**レーザー**が出るんだ。
**ドッグ**が持つスクリプトは、

```Dog.cs
public override void SetStats(int[] stats)
  最初の状態を決定する。
  上下左右とその間の斜め、８種類のうち最初に移動する方向を設定する。

void OnCollisionEnter2D(Collision2D coll)
  他のゲームオブジェクトとぶつかった時に使う。
  ぶつかったゲームオブジェクトがプレイヤーだったらプレイヤーを倒す。
```
そして、**ピッグ**はこれに**加えて**

```Pig.cs
void SetLinePosition()
  レーザーの端っこの位置を決める。
```

壁に当たったら**向きを変える処理は書いていない**んだ。
そういうのは全部Unityにやってもらってる。

### アイテム
![iOS の画像.png](https://qiita-image-store.s3.amazonaws.com/0/343309/26828642-05be-1107-dbcd-1c3c06c127ed.png)


アイテムは**５種類**。

- キューブ [Cube]
- クリアーホール [Clear Hole]
- スイッチボタン [Switch Wall Button]
- ワープホール [Dimension Crack]
- シフト弾 [Shift Bullet]

**キューブ**はその場で静止しているだけのゲームオブジェクト。
**クリアーホール**はその位置にプレイヤーが到着すると、ゲームクリアー。
要するに、ゴールの事だ。
**ワープホール**は**２つ１組**で使う。
プレイヤーの飛ばす**弾**や**敵**が片方のワープホールに入るともう片方のワープホールに**瞬間移動**するんだ。
**シフト弾**はプレイヤーが発射する**弾**の事だよ。

順番に見ていこう。

**キューブ [Cube]** のスクリプトは、

```Cube.cs

```
何もない。
これもUnityのコンポーネントだけで出来てる。

**クリアーホール [Clear Hole]**が持つスクリプトは 

```ClearHole.cs
void OnTriggerEnter2D(Collider2D coll)
  データの保存、ゲームシーンの遷移をする。
  プレイヤーが同じ位置に来た時に使う。
```
クリアーした時のデータの保存もこの**クリアーホール**で行う。
保存専用のゲームオブジェクトがあるわけでは無いんだ。

**スイッチボタン[Switch Wall Button]**は、さっき紹介した**[スイッチ壁](https://qiita.com/shoi_ito/items/a2adf87dd783c8379178#%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E5%A3%81-switch-wall)**の状態を切り替える事が出来るんだ。
スイッチボタンに敵の**ドッグ**か**ピッグ**がぶつかると、その**スイッチボタン**と繋がってる壁の状態が変わる。
表示されてる壁は消えて、表示されてない壁が出現するんだ。

スイッチボタンはこんな感じのスクリプトを持ってる。

```SwitchWallButton.cs
void Switch()
  繋がってるスイッチ壁の状態を切り替える。
  敵がぶつかった時に使う。
```

次は**ワープホール[Dimension Crack]**

```DimensionCrack.cs
void OnTriggerEnter2D(Collider2D coll)
  ステージオブジェクトがこのゲームオブジェクトに重なった時に使う。
  
void SetVisible(Vector3 viewpos)
  このゲームオブジェクトが現在カメラに写っているかの情報を更新する。  

void SetPairDC()
  現在このゲームオブジェクトと接続しているDimensionCrackを更新する。
```
ワープホールは開発中は、DimensionCrack(次元の亀裂）って呼んでる。
クリアーホールもシーンをワープする感覚だから、ワープホールって名前だと分かりにくかったんだ。
今回の説明では逆に、次元の亀裂って言ってもイメージ出来ないと思ったからワープホールって書いたよ。

最後は**シフト弾[Shift Bullet]**だ。
シフト弾はプレイヤーが発射するエネルギーの玉の事だ。
タップした方向に飛んでいって、**「入れ替われるオブジェクト」**にぶつかるとプレイヤーとぶつかったオブジェクトの**位置を入れ替える**。
スクリプトを見てみよう。

```ShiftBullet.cs
void OnCollisionEnter2D(Collision2D coll)
  何かとぶつかった時に使われる。
  ぶつかったオブジェクトが入れ替われるならプレイヤーの入れ替わる処理をする。

IEnumerator DieCoroutine()
  弾が発射されてからしばらくたつと弾を消滅させる。

public override Die()
  弾を消滅させる。
  弾が反射壁以外のものとぶつかった時に使う。
```
**反射壁**は反射する処理を書かないで、逆に壁に当たった時に弾が消える処理を書くことで実現してる。
反射する機能はUnityが用意してくれてるからボクはそれを上手に使うだけで良いんだ。


### その他のステージオブジェクト
![iOS の画像 (5).png](https://qiita-image-store.s3.amazonaws.com/0/343309/735be140-fd5f-2d69-1506-6d5e1f9c2213.png)

「プレイヤー, ブロック, 敵, アイテム, その他」をステージオブジェクトと呼ぶって言ったね。
その他のステージオブジェクトには、**背景の星**とか**ピッグのレーザー[PigLazer]**とか**予測線**[Prediction Line]がある。
他にもあるけれど、それはこのゲームシーンでは登場しないから今度話すね。
背景の星は、Unityのコンポーネントだけで出来てる。
**ピッグのレーザー**は、

```PigLazer.cs
void OnTriggerEnter2D(Collider2D coll)
  プレイヤーにぶつかった時にプレイヤーを倒す。
```
これだけのスクリプトを持ってる。
予測線は、画面を長押ししたときに**弾が飛ぶ軌道**を**赤い線**で教えてくれる。

```PredictionLine.cs
void SetLine()
  予測線の軌道を設定する。
  予測線は、プレイヤーからタップした方向にに直進する。
  予測線はものにあたるとその先までは貫通して表示されない。
```
こんな感じのスクリプトだけで出来てる。

###カメラ [Main Camera]
perticaでの**カメラ**は基本的にプレイヤーが**画面の中心になるように追う**事だ。
でも**ステージの始め**は、ゴールを映して徐々にプレイヤーにカメラを動かす演出がいる。
プレイヤーが**入れ替わるとき**にも、少し遅らせ気味にプレイヤーを追うように演出する。
これを実装するために、ボクはこんな感じにいくつかの状態（ステート）で考えたよ。
![pertica_Qiita_Camera.png](https://qiita-image-store.s3.amazonaws.com/0/343309/893bb724-c5e0-3a01-3004-799d5994e267.png "頑張れカメラマン")
持ってるスクリプトは

```MoveCamera.cs
void SetState(CameraState state)
  状態(ステート）を切り替える関数

void LookClearHole_Move()
  ゴール(ClearHole)からプレイヤーの位置にカメラを移動させる。
  ゲームの開始時に使う。
  LookClearHoleという状態(ステート)のときに使われる。

void TracePlayer_Move()
  プレイヤーのカメラの中心に捉えるように、プレイヤーを追いかけ続ける。
  プレイヤーが静止しているときに使う。
  TracePlayerという状態(ステート)のときに使われる。

void GoToTarget_Move(GameObject objTarget, float speed)
  プレイヤーの方向にゆっくりと移動する。
  プレイヤーが入れ替わるときに使う。
  GoToTargetという状態(ステート)のときに使われる。
```
実はカメラの制御は結構難しい。
良い演出が思いついても、難しくて実現できてないものもあるんだ。
特に、ズームとかが入ってくると厄介で...。

###ゲームマネージャー
ゲーム全体の管理をすると言ったね。
このオブジェクトはボクが作ったスクリプトだけで出来てる。

```Main.cs
public void Reset(float WaitTime = 1)
  ステージをリセットする。
  ゲームシーンを最初から読み込み直す。
  リトライボタンを押したり、死んでしまったときに使うよ。

public void LoadMenu()
  ゲームシーンを終了して、メニューシーンに移動する。
  メニューボタンを押したときに使うよ。

public void FadeIn()
  ゲームシーンを終わるときに、画面全体を徐々に暗くするよ。
  ゲームをクリアーしたり、メニューに戻ったりするときに使う。
```
と、

```Tutorial.cs
void Update()
  ゲームを初めてプレイする場合、チュートリアルを表示する。
```
主にこの２つのスクリプトだ。

初めてスクリプトを**２つ**もった**ゲームオブジェクト**が出てきたね。
**ゲームオブジェクト**は２つどころか、**スクリプト**を**いくつでも**持てるんだ。

ゲーム全体を管理すると言ったけど、
このゲームでは、ゲームマネージャーの仕事は少なめだね。

###デコードオブジェクト
Dataフォルダに入っている、StageCodeDataという名前のステージの**データ**を元に実際に**ステージを生成**するよ。
データの仕組みや構造については別の回で説明するね。
デコードオブジェクトは**スクリプトだけ**で出来ているよ。
ちなみに、これは先輩が作ってくれたんだ。

```DecodeStageScript.cs
void Awake()
  メニュー画面で選択したステージのデータをロードする。
  データを解読(デコード)して、対応するゲームオブジェクトを次々に生成していく。
  生成したオブジェクトによっては、初期状態を指定する。
```

###UI
UIは、**ボタン**の事だったね。
UIは基本的に**スクリプトを持っていない**んだ。
これは**全部**Unityが用意してくれている**コンポーネント**で出来ている。
ボタンを押すと、[ゲームマネージャー](https://qiita.com/shoi_ito/items/a2adf87dd783c8379178#%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC-1)が持ってるスクリプトの

```Main.cs
public void Reset(float WaitTime = 1)
```
とか

```Main.cs
public void LoadMenu()
```
を使うように設定できるんだ。

###BGM・SE
**音を鳴らす**機能を持っていたね。
これは、スクリプトを持っているよ。
まず、SEは

```SEPlayer.cs
public static void PlaySE(string keyname)
  指定したSEを再生するよ。
  流すSEは、事前に曲のファイルとキーワードを紐付ける必要がある。
```
そして、BGMは

```BGMPlayer.cs
public static void FadeinBGM(string keyname,float pertime=0.008f)
  指定したBGMをフェードインしながら再生するよ。
  曲が変わるときの違和感をなくすために、曲の入りで徐々に音を大きくするんだ。
  流すBGMは、事前に曲のファイルとキーワードを紐付ける必要がある。

public static void FadeoutBGM(float pertime=0.009f)
  指定したBGMをフェードアウトしながら終了するよ。
  曲が変わるときの違和感をなくすために、曲の終わりで徐々に音を小さくするんだ。
```
大事なのはこんな感じだ。

例えばプレイヤーが球を発射するときは音が鳴る。
この時、SEPlayerのPlaySEを使うんだよ。

他にも、音を出したいときにはこのスクリプトを使って音を鳴らすんだ。
ちなみに、これも先輩が作ってくれたよ。

#まとめ
ゲームは**「１０個の部品」**で出来ていた。
さらに**「１０個の部品」**はもっと**「小さな部品」**で出来ている。
Unityではこの**「１０個の部品」**を**「ゲームオブジェクト」**、
**「小さな部品」**を**「コンポーネント」**と呼ぶ。

**「コンポーネント」**はUnityが用意してくれているものと、自分で作るものがある。
自分で作るコンポーネントの事を**「スクリプト」**と呼ぶことにしたね。

**「スクリプト」**は大事な機能を持っていて**「脳」**みたいなものなんだ。
だから今回は、そんなスクリプトについて説明したよ。
実際には、パソコンが理解できるように**C#**という言葉を使って書くんだ。
その言葉を書く作業が**プログラミング**だよ。

なんとなく分かったかな？

#制作秘話
**pertica**の制作を初めて２ヶ月くらいたったある日。
帰り道でボクが唐突に言った。

「先輩、重力を消しましょう」

先輩「？？？？？」

ボクが真顔で言うもんだから、ついに頭がおかしくなったかと思われた。

今のperticaは宇宙感のあるゲームで**無重力**だ。
でも昔は**重力**があったんだよ。

昔のperticaは入れ替わった直後に重力で下に落ちたんだ。
でもそれだと、画面の動きが目まぐるしくて落ち着いて遊べなかった。
そこで、perticaでは重力をなくした方が良いんじゃないかと思ったんだ。

先輩はオーケーしてくれて、それから**「無重力計画」**が始まった。
結構な変更だったから大変だったよ。
先輩もよく付き合ってくれた、本当に感謝してる。

無重力にしたのが良かったのか悪かったのかは分からない。
でも面白いゲームを作るために思い切って変えたことに後悔はしていないよ。

他にこんな話もある

メインシーンは「ゲームを作ろう」と思って最初に作り始めた部分だった。

「プレイヤー」「Dog」「通常の壁」「反射壁」「ClearHole」「ワープホール」「キューブ」「スイッチ壁」
これは機能だけなら最初の**１ヶ月くらい**で出来たんだ。
見た目とかは、適当な画像で代用してたけどね...。

実は最初の頃は「Cat」とか「Ojisan」とかもいたんだよ。
その辺は今後「デザインについて」の記事も書くからその時に話そうかな。
多分その記事は**神回**になるよ。

#コメント
ここまで読んでくれてありがとう。

今回は、メインシーンについて触れた。
少し文量が多かったね...。

Unityを知らない人にも、ゲームの仕組みが分かるように書いてみたんだけど、どうだったかな？

今このシリーズ記事の全体の構成をぼんやりと考えてるんだけど、多分全部で１０回くらいになると思う。

なるべくこのゲームを全部公開したいんだけど、どうすると上手く伝えられるかな。
もし、気になる事とか書いてほしい事があったらコメントしてね。

そろそろ実物があった方が分かりやすいんじゃないかな？
もし興味をもってくれたら、よろしくお願いします。
perticaは下のリンクからインストール出来るよ。

- [AppStore](https://itunes.apple.com/jp/app/id1445813632?mt=8&ign-mpt=uo%3D4)
- [Android](https://play.google.com/store/apps/details?id=tmy.jack.pertica)

[大学生が有料スマホゲームを作った全てを公開するよ（１）イントロダクション](https://qiita.com/shoi_ito/items/2234414af441e448a85e)
[大学生が有料スマホゲームを作った全てを公開するよ（２）開発環境とゲームの構成](
https://qiita.com/shoi_ito/private/b9acd13f5fe80536fd0d)
[大学生が有料スマホゲームを作った全てを公開するよ（３）ゲームの構造・パズルとアクションの仕組み（前編）](https://qiita.com/shoi_ito/private/a2adf87dd783c8379178)
[大学生が有料スマホゲームを作った全てを公開するよ（４）ゲームの成り立ち・パズルとアクションの仕組み（後編）](https://qiita.com/shoi_ito/items/ed485d4f956959e6cd36)