[Unity]数秒たったら落ちる床2D,3D対応

#落ちる床を作ってみよう

[![Image from Gyazo](https://i.gyazo.com/4d7f4ec75584bd19a56a0494328adc6f.gif)](https://gyazo.com/4d7f4ec75584bd19a56a0494328adc6f)
>キャラクターは[Medieval King Pack 2]を使っています。
背景は[Free 2D Adventure Beach Pack]を使っています。

##落ちる床を準備しよう
**2Dの場合**は床にする画像を用意してHierarchyに置こう。
>projectタブから画像をHierarchyにドラッグ＆ドロップ
または、Hierarchyタブのcreate→2Dobject→SpriteからSpriteRendererのspriteから画像を選択

**3Dの場合**はCube(好きなモデル)をHierarchyに出そう
>Hierarchyタブのcreate→3Dobjeckt→Cubeの順に選択

#床オブジェクトにスクリプト作ろう
まず**void Start()の上**に必要な変数を作っていこう。

``` FallFloor.cs
bool floor_touch; //床に触れたかの判定`
public float downSpeed; //落ちるスピード
float fallCount; //床が落ちるまでの時間
Rigidbody2D rb; //Rigidbodyの宣言
```
次に**void Start()**に初期化処理を書こう。

```FallFloor.cs
void Start()
    {
        rb = GetComponent<Rigidbody2D>(); //Rigidbodyの取得
        fallCount = 0; //fullCpuntを初期化
    }
```


**void Update()**に更新処理を書こう。

```FallFloor.cs
void Update()
    {
        //床に触れたら
        if (floor_touch == true)
        {
            //fallCountを1秒ずつ増やす。
            fallCount += Time.deltaTime;
            //DownStart関数を使う
            DownStart();
        }
    }
```

>DownStart()はまだ作ってないのでエラーのままで大丈夫。

当たり判定のプログラムを作ろう。今回使うのは**OnCollionEnter()**関数

```FallFloor.cs
 //当たり判定 2D場合
    private void OnCollisionEnter2D(Collision2D col)
    {
        //プレイヤータグが付いているオブジェクトに当たったら
        if (col.gameObject.tag == "Player")
        {
            fallCount = 0; //fallCountを初期化
            floor_touch = true; //floor_touchをtrueにする。
        }
    }
```

```FallFloor.cs
 //当たり判定 3D場合
    private void OnCollisionEnter(Collision col)
    {
        //プレイヤータグが付いているオブジェクトに当たったら
        if (col.gameObject.tag == "Player")
        {
            fallCount = 0; //fallCountを初期化
            floor_touch = true; //floor_touchをtrueにする。
        }
    }
```
>2Dと3Dで書き方が違うので注意しよう。

**void DownStart()**関数を作ろう。自分で定義する関数です。

```FallFloor.cs
//数秒後に床が落ちる
    void DownStart()
    {
        //fallCountが何秒かたったら
        if (fallCount >= 3.0f)
        {
            transform.Translate(0, downSpeed, 0); //Y座標をdownSpeedずつ変える。
        }
    }
```
>3.0fの部分はfallCountと比較する用の数字なのでここを変えると落ちる時間が調整できます。
Inspectorで設定したい場合は変数に置き換えよう。

#いろいろな設定をしよう
###Rigidbodyの設定
[![Image from Gyazo](https://i.gyazo.com/12949de513566772cd4cd23ea294c154.png)](https://gyazo.com/12949de513566772cd4cd23ea294c154)
**Constraints**のFreezPositionの**Y**のところにチェックを付けよう。そうすると乗っても落ちないようになるよ。

>画像は2D用のRigidbodyを使っているけど3Dの時も同じ場所を選択すればOK

落ちる床にRigidbody,Collider(当たり判定),FallFloor(script)がちゃんと付いてるか確認したらゲームを起動してみよう！
最後にFallFloor.csのコードを全文のせるのでエラーが起きたら確認してみよう。

#コード全文

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

public class FallFloor : MonoBehaviour
{

    bool floor_touch; //床に触れたかの判定
    public float downSpeed; //落ちるスピード
    float fallCount; //床が落ちるまでの時間
    Rigidbody2D rb; //Rigidbodyの宣言

    // ゲーム開始
    void Start()
    {
        rb = GetComponent<Rigidbody2D>(); //Rigidbodyの取得
        fallCount = 0; //fullCpuntを初期化
    }

    //更新処理
    void Update()
    {
        //床に触れたら
        if (floor_touch == true)
        {
            //fallCountを1秒ずつ増やす。
            fallCount += Time.deltaTime;
            //DownStart関数を使う
            DownStart();
        }

    }

    //当たり判定(3Dの場合は2Dは書かない)
    private void OnCollisionEnter2D(Collision2D col)
    {
        //プレイヤータグが付いているオブジェクトに当たったら
        if (col.gameObject.tag == "Player")
        {
            fallCount = 0; //fallCountを初期化
            floor_touch = true; //floor_touchをtrueにする。
        }
    }

    //数秒後に床が落ちる
    void DownStart()
    {
        //fallCountが何秒かたったら
        if (fallCount >= 3.0f)
        {
            transform.Translate(0, downSpeed, 0); //Y座標をdownSpeedずつ変える。
        }
    }

}
```