Unityを使用してゲームを作成してみた

# はじめに
今回は、Unityを用いて簡単なゲームを作成していこうと思います！
しかし、私自身ゲームを作成したことがないため簡単なゲームとはどのようなものかが分からず、自分で作成できるのかも分かりません。
# AIに簡単なゲームについて聞いてみた
そこでAIに「簡単なゲーム」について聞いてみました！![スクリーンショット 2024-12-17 20.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951392/f5a6490a-b963-cb19-9bcb-694e041fc569.png)
使用したAIは「Microsoft Copilot」です！AIが考える簡単なゲームとは、「ブロック崩しゲーム」、「テトリス」、「クリックゲーム」、「ジャンプゲーム」などがありました。
今回は、「ブロック崩しゲーム」を作成しようと思います！
# 準備するもの
ゲームを作成するためのゲームエンジンとして、「Unity」を使用して作成します。
まず初めに、「Unity Hub」のインストールを行います。
以下のリンクからダウンロードが可能です。https://unity.com/ja/download
ダウンロードが終わりましたら「Install Editor」をクリックし、「2021.3.45f1」台のバージョンの「Install」ボタンをクリックし、ダウンロードを始めます。
# ゲーム作成の準備
まず初めに「Unity Hub」内にある「New project」ボタンを押します。「Editer Version」を先程ダウンロードした「2021.3.45f1」に変更を行い、テンプレートを「3D(Built-In Render Pipeline)」に設定します。設定が完了しましたら、「Create project」を押します。![スクリーンショット 2024-12-18 19.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951392/d3e0252c-1ce9-9971-6255-70263dcdc05e.png)
# ステージ作成
まず初めにブロックとステージを作成していきます。やり方としては画面左の「＋」ボタン→「3D object」→「Cube」の順番で作成していきます。ステージの作成に必要な4つのオブジェクトを作成していきます。オブジェクトのサイズを変更するために、画面右側の「Transform」と言う項目の数値を変更します。作成したオブジェクトがどこにあるかが分かりやすいように名前を変更します。（方法：オブジェクトをダブルクリックし、「Rename」を押す）
![スクリーンショット 2024-12-18 20.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951392/35c7514d-79ac-266c-a048-6a31f41ac1c7.png)
この画面では「right」のオブジェクトのポジションがX:3であるため、「left」のオブジェクトはX:-3にするとステージ内のバランスが良くなります。「up」「under」オブジェクトはステージの一番上と一番下のオブジェクトを表しています。
# ステージ内の作成
続いてステージ内のブロックを作成していきます。ブロックのバランスが良くなるようにステージの大きさを基準にして配置します。「right」オブジェクトのポジションがX:3であるため「Cube」オブジェクトのポジションはX:2となります。
ブロックを画面のように並べるために「Cube」のポジションX:2に「-0.8」（Scale Xの数値）を入力します。するとブロックが横並びになります。画面のステージ内では6つのブロックを横並びできます。
ブロックを下に配置するためには「Cube」のポジションY:4.8に「-0.6」（Scale Yの数値）を入力します。するとブロックが下に配置されます。
画面右の「Tag」の項目に「Block」と名のタグを追加します。
「Tag」の🔽のボタンを押す→「Add Tag...」→「Tags」を押して「＋」ボタン→「New Tag Name」に「Block」を入力する。→全ての「Cube」に「Tag」を「Block」に設定する。
![スクリーンショット 2024-12-18 22.38.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951392/1cced047-b1a9-007d-6ecc-c83bf551f829.png)

続いてブロックを崩す球のオブジェクトを作成します。画面左の「＋」ボタン→「3D object」→「Sphere」の順番で作成していきます。ステージ内に収めるため、ScaleはX、Y、Z全て「0.4」と入力します。
最後に球の下に、平行移動が出来る土台を想定したオブジェクトを作成します。
# 重力の設定
続いて球に重力を設定します。「ball」オブジェクトから画面右下の「add component」→「Rigidbody」の項目を追加します。続いて、画面左下の「Project」の「+」ボタン→「Physic Material」を追加します。名前を「ball Physic Material」に変更します。
「Assets」フォルダ内に「ball Physic Material」があることを確認しましたら、クリックを行い下の画面のように数値・項目の変更を行なってください。
![スクリーンショット 2024-12-18 22.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951392/502fd1b5-d1da-0f51-826a-8552a5385e6a.png)
数値の変更が完了しましたら、「ball Physic Material」をドラッグし「ball」オブジェクトにコピーしてください。コピーが完了しましたら画面上の再生ボタンを押してください。再生ボタンを押して球が上下に移動することが出来れば正常に動いていることが分かります。
# オブジェクトに機能を付ける
作成したオブジェクトに「球が当たったら消える」「動かすことが出来る」と言ったスクリプトを作成していきます。スクリプトの作成方法としては、「Project」の「+」ボタン→「C#Script」を追加します。名前を「ball Physic Material」に変更します。「ball Physic Material」に以下のコードを入力することで球が重力によって落下し、上のブロックを崩せるようになります。
```php:ball.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ball : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GetComponent<Rigidbody>().AddForce(new Vector3(100, -100, 0));
    }
    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Block"))
        {
            Destroy(collision.gameObject);
        }
    }
}
```
続いて「move Physic Material」と言うスクリプトの作成を行います。以下のコードを入力することによって、球の下にある土台を動かすことができます。
```php:move.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move : MonoBehaviour
{
    private float posY;

    // Start is called before the first frame update
    void Start()
    {
        posY = transform.position.y;
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 pos = Input.mousePosition;
        Vector3 targetPos = Camera.main.ScreenToWorldPoint(new Vector3(pos.x, pos.y, 10));
        targetPos.x = Mathf.Clamp(targetPos.x, -1.9f, 1.9f); 
        targetPos.y = posY;
        transform.position = targetPos;
    }
}
```
しかし、スクリプトだけでは球が上手く跳ね返せない快適なプレイをすることができません。
そこで球が上手く返せる設定を行います。設定方法は画面一番上の「Edit」→「Project Settings」→「Physics」の数値を2から0に変更する。この設定をすることによってこれまでは2より高い数値でないと球は跳ね返すことができなかったが、0に変更したことによってどの数値でも球を跳ね返すことが可能な設定になりました。
![スクリーンショット 2024-12-18 23.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951392/1e8c5de4-8f1c-0252-ee72-d3365b302dd7.png)
その結果、快適にブロック崩しゲームをプレイできるようになりました！