Unityを初めて使った結果

## 1. ボールゲームの作成
今回は新しいデジタルテクノロジーの１つとして
Unityを勉強し、実際にゲームを作ってみたので
その紹介です。

最新のデジタルテクノロジーであり
ゲーム開発のツールとして検索をしたところ

https://metaversesouken.com/metaverse/tool-4/

メタバース開発ツールとして紹介されており
世界最大手のゲームエンジンとのことでした。
わたしはデジタルテクノロジーには疎いので初めて耳にした次第です。
ごめんなさい。

ゲームがどうやって作られているかを
想像したことはありましたが
正直よくわからなかったので
一生理解できないものだと思っていました。

ところでこのUnityという開発ツール
なんとポケモンやドラクエもこれで
作られているものがあるというではありませんか。

そんなすごいツールなら勉強しない手はないと思い
とりかかることにしました。

https://unity.com/ja

とはいえいきなり何かを作るのはかなり難しいと感じました。
初心者にもわかりやすく解説してくれている資料はないのでしょうか。
探していると以下のようなサイトが見つかりました。

https://dotinstall.com/lessons/basic_unity_v2

というわけで入門させていただきました。
手取り足取り教えてくれました。
できあがったのがこれです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/6qpBfjk9yno?si=n3r9AYY3z7Vj9C31" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


## 2. 作成手順

無料で作成できることは限られてはいますが、プロジェクト開始時に２Dと３Dで選べるので
今回は３Dを選んで始めていきました。

3Dオブジェクトでcubeを使ってゲームボードのFloorと動かせるPaddleブロックを作りました。

Paddleを動かせるようにScriptを記入しました。
ここでコードが必要になります。

次にsphereを使ってballを作ります。
ballが一定の範囲内からランダムに出現するように
scriptを書きます。

さらにballがpaddleにぶつかったときにballが消失し
paddleの幅が狭くなるように
scriptを書きます。

ballに対してpaddleにぶつからずにある軸方向に一定の距離を進むと
ゲームオーバーになるように設定します。

ゲームオーバー用のsceneを作ります。
ここにtextとbuttonを入れ込みます。

ゲームオーバーになったらsceneが変わるようにballのscriptを設定します。

ゲームオーバー用のsceneに入れ込んだボタンを押すとリプレイされるように
scriptを書きます。

この手順でコードしていくと
上記のようなゲームが完成します。

## 3. 実際に使用したscriptたち

<details><summary> paddleのscript</summary>

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PaddleScript : MonoBehaviour
{
    //private float speed;
    public float speed;

    // Start is called before the first frame update
    void Start()
    {
        //speed = 5f;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += new Vector3(Input.GetAxis("Horizontal") * Time.deltaTime * speed, 0f, 0f);
        //Debug.Log(transform.position.x);
    }
}

```
</details>

<details><summary>ballのランダム出現のscript</summary>

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallFactoryScript : MonoBehaviour
{
    public GameObject ball;

    // Start is called before the first frame update
    void Start()
    {
        //Instantiate (ball, transform.position, transform.rotation);
        InvokeRepeating("SpawnBall", 0f, 1f);
    }

    void SpawnBall()
    {
        Instantiate(ball, new Vector3(Random.Range(-5f, 5f), transform.position.y, transform.position.z), transform.rotation);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```
</details>

<details><summary>ballの消失やゲームオーバーを定義するscript</summary>

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class BallScript : MonoBehaviour
{
    private float speed;

    // Start is called before the first frame update
    void Start()
    {
        speed = Random.Range(5f, 15f);
    }

    // Update is called once per frame
    void Update()
    {
        transform.position += new Vector3(0f, 0f, -1 * speed * Time.deltaTime);
        if (transform.position.z < -13.0f) 
        {
            //Debug.Log("Game Over");
            //Time.timeScale = 0;
            SceneManager.LoadScene("GameOverScene");
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Paddle"))
        {
            Destroy(gameObject);
            collision.gameObject.transform.localScale -= new Vector3(Random.Range(0.2f,1.0f), 0f, 0f);
            if (collision.gameObject.transform.localScale.x < 1.0f)
            {
                collision.gameObject.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
            }
        }
    }
}
```
</details>

<details><summary>リプレイのためのbuttonを定義するscript</summary>

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class ButtonScript : MonoBehaviour
{
    public void ReplayGame()
    {
        SceneManager.LoadScene("MainScene");
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```
</details>

## 4. ゲームを作ってみて

今回はUnityの使い方について学習しながら
この基本的なゲームを作るので精一杯でした。

しかし、ある平面の上でボールが動かせたということは
ゴルフのパターゲームを作れる可能性を感じました。

もちろん簡単なコードではできないでしょうが
どんなものを作れるのかを想像するだけでも学習意欲は向上します。

ただ、クオリティによらず
自分で作成したゲームは面白いですね。

## 5. 課題
Unreal EngineやMaya、Blender、3dsMAXといったいくつかの3D関連の開発ツールが存在し
それぞれがどのような特性を持っているのかを調査し
作りたい作品にどれがマッチするのかを理解することが必要と考えます。
それぞれを学習し、１つずつでも作品を作ることができればより理解が深まると思われます。
今回のプロダクトをきっかけに少なくともUnityで何かを制作する際の
メリットやデメリットについて伝えていけるようにしたいです。