Unityメモ(3D編)

# 初めに
Unity操作を目的別にまとめます。(※随時更新予定)
| 項番 | ページ内リンク |
|:----:|:-------------|
| 1 |[ゲームオブジェクトの色を変更したい](#ゲームオブジェクトの色を変更したい)|
| 2 |[重力を設定したい](#重力を設定したい)|
| 3 |[ゲームオブジェクトをキーボード入力で移動させたい](#ゲームオブジェクトをキーボード入力で移動させたい)|
| 4 |[ジャンプしたい](#ジャンプしたい)|
| 5 |[カメラ追従をしたい](#カメラ追従をしたい)|


# ゲームオブジェクトの色を変更したい
ゲームオブジェクトの色を変更する方法についてです。
```:# 手順
1:Materialを作成
2:作成したMaterialを対象のGameObjectにアタッチする(ドラッグ&ドロップ)
3:Albedoを選択
4:任意の色に変更
```
#### 1:Materialを作成
「__右クリック__」 → 「__Create__」 →「__Material__」の順に選択
![スクリーンショット 2022-06-05 21.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/8c5f7dd0-5b08-9af4-981d-95bdcf5df62b.png)

#### 2:作成したMaterialを対象のGameObjectに追加(ドラッグ&ドロップ)
![スクリーンショット 2022-06-05 21.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/bdafb079-7dec-f83f-6171-bcc211a26fa0.png)

#### 3:Albedoを選択
![スクリーンショット 2022-06-05 21.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/5020bd67-3219-30c6-f567-c7b65f36d189.png)

#### 4:任意の色に変更
![スクリーンショット 2022-06-05 21.20.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/c20876c4-92f4-5da9-2c08-e122948fe634.png)

# 重力を設定したい
重力を設定する方法についてです。
```:# 手順
1:Add Componentを押下
2:Rigidbodyを押下
```
#### 1:Add Componentを押下
「__任意のオブジェクトのを選択__」 → 「__Inspector__」 → 「__Add Component__」の順に選択
![スクリーンショット 2022-06-05 21.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/e1169a34-87e5-7474-efd2-8dc4bb1c8c9c.png)

#### 2:Rigidbodyを押下
![スクリーンショット 2022-06-05 21.40.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/f1ffdd78-76c8-b988-d7ce-bcc892e7c146.png)

「__Use Gravity__」のチェックをありの場合は重力の影響を受ける
![スクリーンショット 2022-06-06 1.55.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/b8cf03bc-a0da-2e50-93d0-713ae555af97.png)

「__Use Gravity__」のチェックをなしの場合は重力の影響を受けない
![スクリーンショット 2022-06-06 1.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/c9044da3-39ba-999b-1b82-e43e13b99089.png)


# ゲームオブジェクトをキーボード入力で移動させたい
ゲームオブジェクトをキーボード入力で移動させる方法についてです。
```:# 手順
1:スクリプトファイルの作成
2:ゲームオブジェクトに作成したスクリプトをアタッチする(ドラッグ&ドロップ)
```
#### 1:スクリプトファイルの作成
「__右クリック__」 → 「__Create__」 →「__C#Script__」の順に選択
![スクリーンショット 2022-06-09 1.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/76c39abe-5f59-2ae0-b0bd-fa1963a59108.png)

2パターンの移動方法のスクリプトを紹介します。

__velocity(物理法則を無視した)__ パターンの移動方法です。
```:# パターン1(velocity)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
    private Rigidbody rb;
    float speed = 3f;
    float moveX = 0f;
    float moveZ = 0f;
    void Start()
    {
        this.rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        /* 横移動 */
        moveX = Input.GetAxis("Horizontal") * speed;
        /* 縦移動 */
        moveZ = Input.GetAxis("Vertical")* speed;
    }

    void FixedUpdate()
    {
        rb.velocity = new Vector3(moveX, 0, moveZ);
    }
}
```
__AddForce(物理法則を無視しない)__ パターンの移動方法です。
```:パターン2(AddForce)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
    private Rigidbody rb;
    float speed = 3f;
    float moveX = 0f;
    float moveZ = 0f;
    void Start()
    {
        this.rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        /* 横移動 */
        moveX = Input.GetAxis("Horizontal") * speed;
        /* 縦移動 */
        moveZ = Input.GetAxis("Vertical")* speed;
    }

    void FixedUpdate()
    {
        rb.AddForce(moveX, 0, moveZ);
    }
}
```

# ジャンプしたい
```:# 手順
パターン1:スクリプトファイルの作成(2段ジャンプあり)
パターン2:スクリプトファイルの作成(2段ジャンプ禁止)
```
#### スクリプトファイルの作成
```:# ジャンプするスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
    public float jumpPower = 300f;
    private Rigidbody rb;
    void Start()
    {
        this.rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }

    void Jump()
    {
        rb.AddForce(Vector3.up * jumpPower);
    }
}
```

#### パターン2:スクリプトファイルの作成(2段ジャンプ禁止)
2段ジャンプ禁止(地面に着くまでジャンプの禁止)の方法についてです。
Cube(地面)を選択する。
![スクリーンショット 2022-06-06 1.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/25934b4f-032d-f95d-9690-3ae8012e9cd4.png)

__Tag__ のプルダウンの「__Add Tag...__」を選択する。
![スクリーンショット 2022-06-06 1.18.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/f7753711-bd9c-0317-d2ec-a9607e193999.png)

__Tags__ の「__+__」を押下する。
![スクリーンショット 2022-06-06 1.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/db5a871a-827e-228e-597b-365fb0ef880b.png)

任意の名前を設定し(今回はCube)、__Save__ を押下する
![スクリーンショット 2022-06-06 1.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/56c5a5ef-e81b-13c9-25ce-8a6d5b0a726d.png)

今作成した(__Cube__ という名の) __Tag__ が追加される。
![スクリーンショット 2022-06-06 1.25.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/87d93602-6be1-8a1f-9ca4-23cb1251826f.png)

再度Cubeを選択する。![スクリーンショット 2022-06-06 1.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/45dbb795-2cda-9700-f768-e214ef0f6f01.png)

__Tag__ のプルダウンの「__Cube__」を選択する。
![スクリーンショット 2022-06-06 1.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/91e6cb6d-e598-669b-fe38-1b26ba87f227.png)
![スクリーンショット 2022-06-06 1.31.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/cf3ae026-dc36-c552-6b6b-4ee7be727e2f.png)

パターン1のスクリプトを修正する。
```:# 2段ジャンプ禁止のスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallController : MonoBehaviour
{
    public float jumpPower = 300f;
    private Rigidbody rb;
    /** 追加 */
    private bool isJumping = false;
    void Start()
    {
        this.rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && !isJumping)
        {
            Jump();
        }
    }

    void Jump()
    {
        rb.AddForce(Vector3.up * jumpPower);
        /** 追加 */
        isJumping = true;
    }

    /** 追加 */
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Cube"))
        {
            isJumping = false;
        }
    }
}
```

# カメラ追従をしたい
```:# パターン
パターン1:Main Cameraを追従したいオブジェクトの子オブジェクトに設定する
パターン2:カメラを回転させずに追従させる
```
#### パターン1:Main Cameraを追従したいオブジェクトの子オブジェクトに設定する
![スクリーンショット 2022-06-05 22.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/00cf89cb-703f-721f-5efe-72ddf6b8d1ae.png)
![スクリーンショット 2022-06-05 22.08.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/70bd50c0-0a12-518c-b492-9b7916501786.png)

#### パターン2:カメラの回転を固定したい場合
![スクリーンショット 2022-06-06 0.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/dde1b858-79c8-d25b-5853-6e5b20ae1d77.png)

以下のようなスクリプトを作成して、Main Cameraにアタッチする(ドラッグ&ドロップ)
```:# カメラの回転を固定したい場合のスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    [SerializeField]
    [Tooltip("追従させたいターゲット")]
    private GameObject target;

    private Vector3 offset;

    // Start is called before the first frame update
    void Start()
    {
        // ゲーム開始時点のカメラとターゲットの距離（オフセット）を取得
        offset = gameObject.transform.position - target.transform.position;
    }

    void LateUpdate()
    {
        // カメラの位置をターゲットの位置にオフセットを足した場所にする。
        gameObject.transform.position = target.transform.position + offset;
    }
}
```
![スクリーンショット 2022-06-06 0.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/b309a0b3-8dc2-1e95-e96b-55727c576d5e.png)

Targetに追従したいオブジェクトをアタッチする(ドラッグ&ドロップ)
![スクリーンショット 2022-06-06 0.57.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663952/877d7b09-7a75-ee48-6321-e7e25a6bd4ab.png)

# 参考

https://tama-lab.net/2017/05/unity%E3%81%A7%E3%82%AD%E3%83%A3%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%BC%E3%82%92%E7%A7%BB%E5%8B%95%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95%E3%80%903d%E7%B7%A8%E3%80%91/

https://mono-pro.net/archives/7562

https://programming.sincoston.com/unity-camera-follow-player/

https://ekulabo.com/tool-tip-attribute