Unity：2DShootingの作り方　#4

#解説動画
https://youtu.be/SRoXF_1hv8Q

・前回：https://qiita.com/simanezumi1989/items/2b409cb18792fba33d1d
・コードの差分可視化サイト：https://www.diffchecker.com

#コード

```PlayerShip.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


// PlayerShipを方向キーで動かす
//　・方向キーの入力を受け取る
//　・Playerの位置を変更する

// 弾をうつ
// ・弾を作る
// ・弾の動きを作る
// ・発射ポイントを作る
// ・ボタンを押したときにたまを生成する：Instantiate
// -------------//


public class PlayerShip : MonoBehaviour
{
    public Transform firePoint; // 弾を発射する位置
    public GameObject bulletPrefab;

    AudioSource audioSource;
    public AudioClip shotSE;

    private void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    // 約0.02秒に一回実行される
    void Update()
    {
        Shot();
        Move();
    }

    void Shot()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Instantiate(bulletPrefab, firePoint.position, transform.rotation);
            audioSource.PlayOneShot(shotSE);
        }
    }
    void Move()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float y = Input.GetAxisRaw("Vertical");
        //課題：GetAxisRawとGetAxisの違いをDebug.Log(x)で調べる
        Vector3 nextPosition = transform.position + new Vector3(x, y, 0) * Time.deltaTime * 4f;
        // ・Playerの移動範囲制御
        // x：(-2.9,2.9) y：(-2,2)
        nextPosition = new Vector3(
            Mathf.Clamp(nextPosition.x, -2.9f, 2.9f),
            Mathf.Clamp(nextPosition.y, -2f, 2f),
            nextPosition.z
            );
        transform.position = nextPosition;
    }
}
```

```Explosion.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// ・音
//　　・スピーカー：AudioSource
//　　・音の素材：AudioClip

public class Explosion : MonoBehaviour
{
    AudioSource audioSource;
    public AudioClip boomSE;
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
        audioSource.PlayOneShot(boomSE);
        Destroy(gameObject, 0.5f);
    }
}
```

```EnemyShip.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 敵の移動：ましたに移動する
// 敵を生成：生成工場を作ってやる
// 敵に弾が当たったら爆発する
// 敵とPlayerがぶつかったら爆発する
// ------
// 敵を左右に揺らせる
// スコアの表示
// 敵を倒したときにスコアを上昇させる
// リスタートの実装

public class EnemyShip : MonoBehaviour
{
    public GameObject explosion; // 破壊のプレファブ

    // GameControllerの入れ物を作る：AddScoreを使いたいから
    GameController gameController;

    float offset;
    void Start()
    {
        offset = Random.Range(0, 2f*Mathf.PI);
        // GameObject.Find("GameController")
        //・ヒエラルキー上のGameControllerという名前のオブジェクトを取得
        gameController = GameObject.Find("GameController").GetComponent<GameController>();
    }

    void Update()
    {
        // 敵の移動：ましたに移動する
        // ・敵が左右に移動する
        transform.position -= new Vector3(
            Mathf.Cos(Time.frameCount*0.05f + offset) * 0.01f,
            Time.deltaTime,
            0
            );

        if (transform.position.y < -3)
        {
            Destroy(gameObject);
        }

    }

    // 敵に弾が当たったら爆発する
    // 当たり判定の基礎知識：
    // 当たり判定を行うには、
    // ・両者にColliderがついている
    // ・少なくともどちらかにRigidbodyがついている

    // isTriggerにチェックをつけた場合はこちらが実行される
    private void OnTriggerEnter2D(Collider2D collision)
    {
        // collisionにぶつかった相手の情報が入っている：bullet, Player
        if (collision.CompareTag("Player") == true)
        {
            Instantiate(explosion, collision.transform.position, transform.rotation);
            gameController.GameOver();
        }
        else if (collision.CompareTag("Bullet") == true)
        {
            gameController.AddScore();
        }
        Instantiate(explosion, transform.position, transform.rotation);
        Destroy(gameObject);
        Destroy(collision.gameObject);
    }

    /*
    private void OnCollisionEnter2D(Collision2D collision)
    {  
    }
    */
}
```

```Bullet.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour
{
    // 上に動く
    void Update()
    {
        transform.position += new Vector3(0, 3f, 0)*Time.deltaTime;

        // ・弾と敵の表示範囲
        if (transform.position.y > 3)
        {
            Destroy(gameObject);
        }
    }
}
```

#スタジオしまづからのお知らせ
スタジオしまづ は「プログラミング未経験でもゲームをリリース」をコンセプトに集まるオンラインサロンを運営しています。
（2020年になって7リリースしています：4月現在）
https://camp-fire.jp/projects/view/149191
対象は以下の方としています。興味のある方はぜひ！
・独学でゲームを作れるか心配な方
・コミケで出展側として参加したい方
・一度でいいから自分のゲームを世に出したい方
・ゲームを作って憧れのゲーム会社に就職したい方