Unityちゃんを車に乗せる

![unityちゃんライセンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/08d2ecc0-a108-1a73-e734-30c5a6d678ee.png)
<iframe width="560" height="315" src="https://www.youtube.com/embed/ErAQ21wfJoo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<h1>概要</h1>
オープンワールド型のゲームを制作するため，Unityちゃんを使用し，車のオブジェクトを乗り降りするシステムを構築しました。
また，車のオブジェクトは，UnityのStandard AssetsのCarオブジェクトに自分で制作したカーモデルを貼り付けたものを使用しました。

<h1>一つのオブジェクトにまとめる</h1>
車のオブジェクト（Car），Unityちゃん（unitychan），車のfbxモデル（Car_model）を一つのゲームオブジェクト（今回は，Mineという名前にしました）にまとめます。
初期状態として，車のオブジェクトのみ非表示としておきます。
また，車のオブジェクトにはCarCamera，UnityちゃんにはMain Cameraという名前でそれぞれオブジェクト内にカメラを設置しました。
![Mineオブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/641f8914-0835-e38e-1d66-3c8e346981a0.png)

※このテストでは，どちらのオブジェクトもHierarchyで生成したMain Cameraを使用しましたが，
Unirtちゃんの方は，下の写真のように，
Assets➡unity-chan!➡Unity-chan!Model➡Prefabs➡for Locomotion
のフォルダ内にあるMain Cameraを使用し，CamPos，FrontPos，JumpPos，LookAtPosもUnityちゃんのオブジェクト内に付け加えた方が，ジャンプした時などにエラーが出ないようになります。（エラーが出ても，ゲーム自体はストップしませんでしたが…）

![取り直し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/0742dce8-307e-8702-70ce-55cbec52b72d.png)


<h1>流れ</h1>
乗る時の大まかな流れは，キーボードのZキーを押して，Unityちゃんと車のfbxモデルの距離がある値（今回は5未満とした）より小さければ，車のfbxモデルの位置に車のオブジェクトを配置・表示し，Unityちゃんと車のfbxモデルは非表示にします。
降りるときは，Xキーを押して，車のオブジェクトの位置に，Unityちゃんと車のfbxモデルを配置し，
Unityちゃんと，車のfbxモデルを表示，車のオブジェクトは非表示にします。

<h1>プログラム</h1>
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Change : MonoBehaviour
{
    int car = 0;

    Vector3 posA;
    Vector3 posB;

    void Start()
    {
        
    }


    void Update()//Update関数内に記述
    {
        //事前に二つのオブジェクトの座標を取得
        posA = transform.Find("unitychan").position;
        posB = transform.Find("Car_model").position;


        //乗る時
        if (Input.GetKey(KeyCode.Z))//Zキーを押す
        {
            if (car == 0)
            {

                if (Vector3.Distance(posA, posB) < 5)
                {
                    //車のfbxモデル位置に車のオブジェクトを配置
                    transform.Find("Car").position = transform.Find("Car_model").position;

                    //車のオブジェクトのローテーションに車のfbxモデルのローテーションを代入（あまり必要ないかも）
                    transform.Find("Car").rotation = transform.Find("Car_model").rotation;

                    //車のオブジェクトを表示
                    transform.Find("Car").gameObject.SetActive(true);

                    //Unityちゃんと車のfbxモデルを非表示に
                    transform.Find("unitychan").gameObject.SetActive(false);
                    transform.Find("Car_model").gameObject.SetActive(false);
                    car = 1;
                }         
            } 
        }


        //降りる時
        if (Input.GetKey(KeyCode.X))//Xキーを押す
        {
            if (car == 1)
            {
                //車のオブジェクトの位置にUnityちゃんを配置
                transform.Find("unitychan").position = transform.Find("Car").position;

                //車のオブジェクトの位置に車のfbxモデルを配置
                transform.Find("Car_model").position = transform.Find("Car").position;

                //unityちゃんのローテーションに車のオブジェクトのローテーションを代入（こっちは重要）
                transform.Find("unitychan").rotation = transform.Find("Car").rotation;

                //車のfbxモデルのローテーションに車のオブジェクトのローテーションを代入（こっちは重要）
                transform.Find("Car_model").rotation = transform.Find("Car").rotation;

                //車のオブジェクトを非表示に
                transform.Find("Car").gameObject.SetActive(false);

                //Unityちゃんと車のfbxモデルを表示
                transform.Find("unitychan").gameObject.SetActive(true);
                transform.Find("Car_model").gameObject.SetActive(true);
                car = 0;
            }
        }
    }
}

```

このプログラムをMineオブジェクトにドラッグしました。


<h1>結果（gifファイル）</h1>
乗る時
![車乗るgif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/b62b3aad-8832-3687-a508-93cb8e5f23ed.gif)

降りる時
![降りるgif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1312991/ceffdae7-deb0-9ca2-59a7-519795e65a1d.gif)

<h1>おわり</h1>
一応，できたつもりですが，少ない知識の中で作成したので，もっと楽な方法があると思います。興味がある方は，他も調べてみてください。

<h1>参考させていただいたWebサイト</h1>
Unityオブジェクトの表示・非表示切り替え【非表示オブジェクトの読み込みも】
https://your-3d.com/unity-set-active/

【Unity C#】オブジェクト間の距離を取得する
https://futabazemi.net/unity/object_distance/