Unityでシューティングゲームを作る(5)

##ここまでの進捗

- 背景がループするようにした。
- 普通の敵の動作を作成し、その敵が3秒ごとに生成される。
- 瞬間移動する敵の動作を作成し、5秒ごとに生成する。
- プレイヤーが画面の範囲外に行かないようにした。
- 敵とプレイヤーが衝突したらプレイヤーが消滅する。
- 分散攻撃の敵を実装する。
- タイトルシーンとエンディングシーンを追加する。
- プレイヤーがダメージ受けると点滅して数秒だけ無敵状態になる


##今後やること

- ボスキャラの動作を実装する。
- エフェクトとBGMを追加する。
- <font color="Red">プレイヤーが横に移動すると機体が傾くアニメーションをつける</font>

この記事では赤い部分を作成した。


##傾くアニメーション

これを実装する際にしたミスを含めて書きたいと思う
まずanimationを作成するには上のように
[window]→[Animation]→[Animation]を選択する
![コメント 2020-02-14 034311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/f0d83b78-460b-9918-b6a7-02f0ea49bb6c.png)

そうすると以下のようにAnimator controllerとAnimatorコンポーネントとAnimation Clipが作成される


![コメント 2020-02-14 034048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/43d152d8-ea3b-2347-dc03-feddd9026888.png)


###最初に試した方法

Animation Clipの中で設置するひし形のものをキーという。
Animation Clipを編集するが、傾きをrotateで表せばいいと思っていた。
0.10,0.20,0.30の位置にY軸にそれぞれ30,40,50で回転させたキーを置いた。

![コメント 2020-02-14 035615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/c0859b46-bee7-3172-99b4-9986f332f868.png)

####これの問題点
実行してみるとボタンを押したときに回転するが、なぜか少ししたらプレイヤーの機体が消えてしまう。
原因を調べてみたらどうやらZ座標がマイナス方向に増えていってしまい、カメラよりも後ろにプレイヤーの機体が行ってしまっていることが分かった。
おそらく30や40に傾けた上でtranslateで移動しているのでz軸方向にも移動してしまったと思われる。

###次に試した方法
gameの中でプレイヤーの機体をY軸で傾けたものをスクリーンショットで撮り、それをUnity内でSprite Editorを用いることで余計な部分から切り抜いた。
Sprite EditorのCustom Outlineで以下のように点をとって切り抜いていく

![コメント 2020-02-14 042522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/6fb509dd-c774-d4b0-36af-2f3d96bb7f15.png)

これを右に傾けた時と左に傾けた時で作成してAnimation Clipに以下のようにそれぞれ配置する。

![コメント 2020-02-14 042947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/d2c710c8-2a04-b903-2d8d-7cd07a3338e9.png)

このクリップをAnimator Controllerで遷移させる。作成したクリップをAnimator Controller上にドラック&ドロップする。
このとき遷移させる条件を指定しないといけないので左上のParametersから[+のマーク]→[Bool]を選択する。

![コメント 2020-02-14 044223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/1ff2ebbd-a8af-0f9d-b8c6-3dc86f028e87.png)

これでスクリプトの中でParametersのパラメータをtrue or falseにすることで遷移させることができる。

![コメント 2020-02-14 045807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/98a52dfa-2684-c412-1ec1-d9a4fe26ebc6.png)

Has Exit Timeのチェックを外してTransition Durationを0にする
Conditionsの+マークをおして遷移条件を作成する。

![コメント 2020-02-14 044223 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/af693739-5b8f-99a3-9aba-804b24176272.jpeg)

後はスクリプトでタップしたらAnimationが動作するようにする

```csharp
//タッチ判定
        if (Input.touchCount > 0) {

            Touch touch = Input.GetTouch(0);

            if (touch.position.x < Screen.width * 0.5f) {

                //画面外に行かないようにする
                if (-3.1 < transform.position.x) {
                    transform.Translate(-0.05f, 0, 0);
                    if (touch.phase == TouchPhase.Began) {
                        //押した時
                        anim.SetBool("left_long", true);
                    }
                    if (touch.phase == TouchPhase.Moved) {
                        //長押しの時
                        
                        anim.SetBool("left_long", true);
                    }
                    if (touch.phase == TouchPhase.Ended) {
                        //指を離した時
                        anim.SetBool("left_long",false);
                        
                    }

                } else {
                    transform.Translate(0, 0, 0);
                    anim.SetBool("left_long", true);
                }
            } else if (touch.position.x > Screen.width * 0.5f) {
                //画面外に行かないようにする
                if (3.1 > transform.position.x) {
                    transform.Translate(0.05f, 0, 0);
                    if (touch.phase == TouchPhase.Began) {
                        //押した時
                        anim.SetBool("right_long", true);
                    }
                    if (touch.phase == TouchPhase.Moved) {
                        //長押しの時
                        
                        anim.SetBool("right_long", true);
                    }
                    if (touch.phase == TouchPhase.Ended) {
                        //指を離した時
                        anim.SetBool("right_long",false);
                        
                    }


                } else {
                    transform.Translate(0, 0, 0);
                    anim.SetBool("right_long", true);
                }
            }

        }
```
例えばanim.SetBool("left_long", true)でParameter"left_long"をtrueにするので左に傾くアニメーションを流す。

スクリプトの内容を説明するとInput.touchCount > 0　でタッチされているかチェックする。
Touch touch = Input.GetTouch(0)は長押しなどのタッチされた時の状態を取得している。
条件の中にあるtouch.phase==TouchPhase.Beganは「タッチしたとき」、touch.phase == TouchPhase.Movedは「長押ししてるとき」、touch.phase == TouchPhase.Endedは「指を話したとき」の判定をしている。

これでできたのが以下になる。

![ezgif.com-video-to-gif (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/fff27d11-f9db-9fd3-e05b-326e0049cbd3.gif)

これ簡単にみえるけどつまづいたところを調べたりしてかなり時間かかってしまった。

これであとはボスを作るだけになった。