ブログ

Unity入門講座[11]落ちる床を作ろう

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

・ある物体に触れると数秒後に落下する方法

・「OnCollisionEnter」の使い方

 

(落ちる床のスクリプトを作成する)

・まず、「Hierarchy」→「Create」→「3D Object」→「Plane」で新たに物体を1つ作成してください。

・物体の名前は「FallFloor」に変更しておきます。

・「大きさ」と「色」は自由に設定しましょう。(画像を貼り付ける場合はこちら

(復習!)

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

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

 

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

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

スクリーンショット 2015-10-07 9.59.01

(ここがポイント!)

*今回は2つの命令ブロックを書きます。

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

「もしも、ぶつかってきた物体のタグに”Player”という名前が付いていたら」(条件)

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

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

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

 

・スクリプトが書けたら、「物体のFallFloor」にドラッグ&ドロップしましょう。

スクリーンショット 2015-10-07 9.59.20

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

・「Hierarchy」で「Ball」を選択する。

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

・「Add Tag…」をクリック。

・「+」をクリック

スクリーンショット 2015-10-07 17.35.23

・Tagに「Player」と記載してエンターを押す。

スクリーンショット 2015-10-07 17.36.32

・再度「Ballを選択」→「Tagをクリック」→「Playerを選択してクリック」

スクリーンショット 2015-10-07 17.37.31

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

 

(床にRigidbodyを付ける)

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

「Hierarchy」で「FallFloor」を選択した状態で、「Add Componentをクリック」→「Physicsをクリック」→「Rigidbodyをクリック」

スクリーンショット 2015-10-07 9.59.50

スクリーンショット 2015-10-07 10.00.00

スクリーンショット 2015-10-07 10.00.05

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

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

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

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

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

(ここがポイント!)

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

スクリーンショット 2015-10-07 16.58.52

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

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

 

(床が落ちる仕組み)

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

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

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

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

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

スクリーンショット 2015-10-07 17.15.50

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

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

数秒後、突然チェックが「解除」されると思います。

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

スクリーンショット 2015-10-07 17.15.52

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

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

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

スクリーンショット 2015-10-07 9.59.01

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

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

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