Unity5の教科書　Chapter6を学習してみた!

#**初めに**
今回は[Unity5の教科書](http://www.sbcr.jp/products/4797386790.html "Unity5の教科書")　Chapter6を学習して見ました!

Chapter6まで進めて大分Unityでゲームを作る流れやC#の特徴が分かってきました！
今回はChapter6の特徴と言える部分を中心にやって行きたいと思います！

#**物理エンジン Physics**

Physicsとはオブジェクトを物理法則に従って動かす事ができたり、当たり判定を自動で行ってくれる物理エンジンになります。

Unityで標準で付属している物理エンジンになります。

- オブジェクトに重力を付けられる。
- オブジェクトに当たり判定を付けられる。

#**Physicsの設定**
配置したオブジェクトが重力にしたがって落下するように設定してみようと思います。
オブジェクトに物理挙動を作用するRigidbody 2Dをアタッチします。

・Rigidbody 2Dアタッチ手順
対象オブジェクト　→　Add Component →　Physics 2D → Rigidbody 2D

この状態でゲームを実行すると物理法則(重力)に従って、オブジェクトが落下します。

**Rigidbody 2D 公式ドキュメント**
https://docs.unity3d.com/jp/540/Manual/class-Rigidbody2D.html

#**当たり判定**
他のオブジェクトと衝突判定をするにはCollider 2Dコンポーネントを使用します。

・Circle Collider 2Dアタッチ手順
対象オブジェクト　→　Add Component →　Physics 2D → Circle Collider 2D

Circle Collider 2Dをアタッチすると、オブジェクトの周りに緑の円が表示されます。
これを当たり判定用のコライダと呼び、緑の円に他のオブジェクトが接触すると当たったと判定します。

**Circle Collider 2D公式ドキュメント**
https://docs.unity3d.com/jp/540/Manual/class-CircleCollider2D.html

**当たり判定モード**
Collisionモード　オブジェクト同士の接触時に跳ね返りなど衝突応答も実行される。

- 衝突した瞬間「OnCollisionEnter2D」が1回呼ばれる。
- 衝突中は「OnCollisionStay2D」が呼ばれ続ける。
- 衝突が終わった瞬間に「OnCollisionExit2D」が1回呼ばれる。
- 2つのオブジェクトが衝突した時に物理挙動をさせたい場合<br>
両方のオブジェクトに「Rigidbody 2Dコンポ―ネント」「Collider 2Dコンポーネント」をアタッチする必要がある。<br><br>


Triggerモード　  オブジェクト同士の接触時すり抜ける。

- 衝突した瞬間「OnTriggerEnter2D」が1回呼ばれる。
- 衝突中は「OnTriggerStay2D」が呼ばれ続ける。
- 衝突が終わった瞬間に「OnTriggerExit2D」が1回呼ばれる。
- 当たり判定だけを行う場合<br>
「Rigidbody 2Dコンポ―ネント」は片方のオブジェクトにアタッチすればよい。<br>
「Collider 2Dコンポーネント」は両方のオブジェクトにアタッチする必要がある。

**当たり判定スクリプト**

```
void OnTriggerEnter2D(Collider2D other){
    Debug.Log("接触");
}
```

#**重力の影響を受けない様にする設定**
ゲーム上での地面や空中に浮かぶ土台にも重力の影響を受けさせた場合、キャラクターもろとも落下していきます。
これではゲームにならず困ってしまう為、重力の影響が受けない様に設定をします。

・Unity5.5以前
対象オブジェクト　→　Rigidbody 2D　→　Is kinematicのチェックを外す。

・Unity5.5
対象オブジェクト　→　Rigidbody 2D　→　Body Type → kinematicを選択する。

Unity5.5よりRigidbody 2Dの表記が変わった様で、Is kinematic項目が無くて少し困惑しました。
教科書通りのversionでやれって話ですがw....勉強になりました。

#**オブジェクトが動いたときにアニメーションを付ける**
Mecanimという機能を使って、オブジェクトに動きを付けていきます。

#**Mecanimを理解する**
アニメーション作成から実行までをUnityで操作できる機能になります。

Mecanimを使用する上で重要な「スプライト」、「Animation Clip」、「Animator Controller」、「Animatorコンポーネント」に関して説明していきます。

- **スプライト**
コマの画像のこと。<br><br>

- **Animation Clip**　
スプライトをまとめた、一連の動作。「飛びつく」「走る」等。<br><br>

- **Animator Controller**
Animation ClipをまとめたものでどのタイミングでAnimation Clipを再生するか指定をする。
飛び付く時はsnatchアニメーション、空を飛んでいるときはflyアニメーションなど指定ができます。<br><br>

- **Animatorコンポーネント**
アニメーションをしたいオブジェクトが持つAnimatorコンポーネントにAnimator ControllerをセットすることでAnimator Controllerで定義したアニメーションを再生できます。

#**アニメーションの遷移設定**
Animation Clip「run」と「snatch」があるとして解説していきます。

今回はAnimation Clipが2つだけの為、互いを行き来する動きを作って行きます。

- 「run」→「snatch」
   飛びつきボタンを押した時に遷移する。
- 「snatch」→「run」
   飛びつきアニメーション再生が終了したタイミング

 **「run」→「snatch」遷移設定**
1.「run」ノード上で右クリック後、MakeTransitionを選択する。
2.「run」から矢印が伸びるので「snatch」上でクリックをする。
3.タイミングの設定を行う。
4.遷移矢印上にTriggerを設置する。
5.飛びつきボタンが押されたタイミングでTriggerを開く事で「run」→「snatch」と遷移します。
6.Prameters → +ボタンをクリック　→ Triggerを選択 → snatchTriggerに名前変更。
7.「run」→「snatch」への遷移矢印を選択して、インスペクタのConditions項目の+をクリックする。
8.リストからsnatchTriggerを選択する。
9.Has Exit Timeにチェックを外す。
10.Settings　→　Exit Timeを「1」,Transition Durationを「0」,Transition Offsetを「0」に設定する。
11.スクリプト処理。

```
public class player : monoehaviour {

Animator anime;

   void Update () {
        if(Input.GetKeyDown(KeyCode.Space)) {
          this.anime.SetTrigger ("snatchTrigger");
      }
   }
}
```
<br>
 **「snatch」→「run」遷移設定**
1.「snatch」ノード上で右クリック後、MakeTransitionを選択する。
2.「snatch」から矢印が伸びるので「run」上でクリックをする。
3.タイミングの設定を行う。
4.「snatch」→「run」へ向かう矢印を選択して、インスペクタから下記設定を行う。
5.Has Exit Timeにチェックを入れる。
6.Settings　→　Exit Timeを「1」,Transition Durationを「0」,Transition Offsetを「0」に設定する。<br><br>

**各パラメータ詳細は公式マニュアル参照**
https://docs.unity3d.com/jp/540/Manual/class-Transition.html

#**シーンの遷移**
1.監督スクリプトを作成する。
2.SceneManagerパッケージをインポートする。
3.LoadSceneメソッドを使ってシーンの遷移を行う。

```
using UnityEngine.SceneManagement;

public class director : monoehaviour {

   void Update () {
        if(Input.GetKeyDown(KeyCode.Space)) {
          SceneManager.LoadScene("OtherScene");
      }
   }
}
```

4.空のオブジェクトを作成する、名前をdirectorに変更する。
5.監督スクリプトをからのオブジェクトにアタッチする。

#**加速度センサの値取得**
スマートフォンの加速度センサの値の取得にはInputクラスのaccelerationメソッドを使う。

```
float thr = 0.3f;

void Update(){
int move = 0;
if(Input.acceleration.x > this.thr) move = 10;
if(Input.acceleration.x < this.thr) move = -10;
}
```

- スマートフォンを右に傾けて値が0.3より大きくなるとkeyに10を代入。
- スマートフォンを左に傾けて値が-0.3より大きくなるとkeyに-10を代入。