2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

Image from Gyazo

キャラクターは[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
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ずつ変える。
        }
    }

}
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?