[11]落ちる床を作ろう

(今回はこんなことを学びます)

・オブジェクトに触れると数秒後に落下する方法

「OnCollisionEnter」の使い方

(1)スクリプトを作成する

・まず、「Hierarchy」→「Create」→「3D Object」→「Cube」で新たにオブジェクトを1つ作成してください。(*ここは「Plane」だとうまく作動しないので「Cube」で作成するのがポイントです。)

・オブジェクトの名前は「FallFloor」に変更しておきます。

・「位置」はボールが移動して乗れるところにします。

・「大きさ」と「色」は自由に設定しましょう。

(復習!)

・大きさを変える場合は「Inspector」で「Scale」の数値を変更します。

・「色」を変える場合は、「Assetsの余白を右クリック」→「Createを選択」→「Materialを選択してクリック」。「Material」の名前を「FallFloor」に変更。「白色の四角部分」をクリックして色を変更。

・次に、「C# Script」を作成し、名前を「FallFloor」に変更します。

・「FallFloor」スクリプトには下記のコードを記載しましょう。

using UnityEngine;
using System.Collections;

public class FallFloor : MonoBehaviour {

	// ★このメソッド(命令ブロック)を記載
	void OnCollisionEnter(Collision col){
		if(col.gameObject.CompareTag("Player")){
			Invoke("Fall", 2);
		}
	}

	// ★このメソッド(命令ブロック)を記載
	void Fall(){
		GetComponent<Rigidbody>().isKinematic = false;
	}
}

 

(ここがポイント!)

・今回は「命令ブロックを2つ」書きます。

「OnCollisionEnter」の命令ブロックは下記のような内容です。

「もしも、ぶつかってきたオブジェクトのタグに”Player”という名前が付いていたら」(条件)

「”Fall”という名前の命令ブロックを2秒後に発動する。」(実行すること)

「Invoke」は「発動する」という意味のメソッドです。これは「引数」を2つ持っています。Invoke(引数1,引数2)

「引数1」に「発動させたい命令ブロック」を記載し、「引数2」に「何秒後に発動させるかの時間」を記載します。

・スクリプトが書けたら、FallFloorオブジェクトにドラッグ&ドロップしましょう。

スクリーンショット 2015-10-15 23.48.01

(2)BallにPlayerという名前のタグを付ける

・「Hierarchy」で「Ball」オブジェクトを選択。

・「Inspector」で「Tag Untagged」をクリック。

「Playerを選択してクリック」(*Playerタグは最初からUnityに用意されています。)

スクリーンショット 2015-10-15 23.54.16

これでタグの設定が完了しました。

(3)FallFloor(床)にRigidbodyを付ける

FallFloorに「重力」をつけましょう。

・「Hierarchy」で「FallFloorオブジェクト」を選択した状態で、「Add Componentをクリック」→「Physicsをクリック」

スクリーンショット 2015-10-15 23.58.11

・→「Rigidbodyをクリック」

スクリーンショット 2015-10-15 23.58.17

スクリーンショット 2015-10-15 23.58.31

この段階で一度「再生ボタン」を押してみましょう。

FallFlor(床)がスタートと同時に落下していくと思います。

これは「Rigidbody」「Gravity(重力)」が作用しているからです。

では、この重力の作用をいったん「止める」ことにしましょう。

・「Rigidbody」の「Is Kinematic」にチェックを入れてください。

(ここがポイント!)

・チェックを入れた状態はプログラミング的には、「isKinematic = true」と表現します。

スクリーンショット 2015-10-16 0.04.50

これで重力の作用がなくなりました。

「再生ボタン」を押して確認してみましょう!

(4)床が落ちる仕組み

これで全ての準備が整いました。

「再生ボタン」を押してBallを動かして、FallFloorの上に乗ってみましょう。

Ballが乗って2秒後に落下を始めれば成功です。

では、この仕組みを考えてみましょう。

「Hierarchy」の「FallFloor」を選択した状態でもう一度「再生ボタン」を押してください。

スクリーンショット 2015-10-16 0.10.02

「Is Kinematic」には当然チェックが入っています。

では、BallをFallFloorの上に乗せて観察してみてください。

「2秒後、突然チェックが外れる」と思います。

そしてその瞬間、落下が始まります。

スクリーンショット 2015-10-16 0.12.53

これはプログラミング的には、

「isKinematic = true」の状態から「isKinematic = false」の状態になったと表現します。

では、ここで「FallFloor」スクリプトをもう一度みてみましょう。

using UnityEngine;
using System.Collections;

public class FallFloor : MonoBehaviour {

	// ★このメソッド(命令ブロック)を記載
	void OnCollisionEnter(Collision col){
		if(col.gameObject.CompareTag("Player")){
			Invoke("Fall", 2);
		}
	}

	// ★このメソッド(命令ブロック)を記載
	void Fall(){
		GetComponent<Rigidbody>().isKinematic = false;
	}
}

 

「void Fall()の命令ブロック」の中に「isKinematic = false」の記述があると思います。

簡単に言えば、「BallがFallFloorとぶつかった2秒後に、isKinematic = falseの状態になったので、再び重力が作用して落下した。」となります。

以上が、落ちる床の仕組みとなります。