(今回はこんなことを学びます)
・ある物体に触れると数秒後に落下する方法
・「OnCollisionEnter」の使い方
(落ちる床のスクリプトを作成する)
・まず、「Hierarchy」→「Create」→「3D Object」→「Plane」で新たに物体を1つ作成してください。
・物体の名前は「FallFloor」に変更しておきます。
・「大きさ」と「色」は自由に設定しましょう。(画像を貼り付ける場合はこちら)
(復習!)
*大きさを変える場合は「Inspector」の「Scale」の数値を変更します。
*「色」を変える場合は、「Assetsの余白を右クリック」→「Createを選択」→「Materialを選択してクリック」。「Material」の名前を「FallFloor」に変更。「白色の四角部分」をクリックして色を変更。
・次に、「C# Script」を作成し、名前を「FallFloor」に変更します。
・「FallFloor」スクリプトには下記のコードを記載しましょう。
(ここがポイント!)
*今回は2つの命令ブロックを書きます。
*「OnCollisionEnter」の命令ブロックは下記のような内容です。
「もしも、ぶつかってきた物体のタグに”Player”という名前が付いていたら」(条件)
「”Fall”という名前の命令ブロックを2秒後に発動する。」(実行すること)
*Invokeは「発動する」という意味のメソッドです。これは「引数」を2つ持っています。Invoke(引数1,引数2)
引数1に発動したい命令ブロックを記載し、引数2に何秒後に発動させるのかの時間を記載します。
・スクリプトが書けたら、「物体のFallFloor」にドラッグ&ドロップしましょう。
(BallにPlayerという名前のタグを付ける)
・「Hierarchy」で「Ball」を選択する。
・「Inspector」で「Tag」をクリック。
・「Add Tag…」をクリック。
・「+」をクリック
・Tagに「Player」と記載してエンターを押す。
・再度「Ballを選択」→「Tagをクリック」→「Playerを選択してクリック」
これでタグの設定が完了しました。
(床にRigidbodyを付ける)
FallFloorに「重力」をつけましょう。
「Hierarchy」で「FallFloor」を選択した状態で、「Add Componentをクリック」→「Physicsをクリック」→「Rigidbodyをクリック」
この段階で一度「再生ボタン」を押してみましょう。
FallFlor(床)がスタートと同時に落下していくと思います。
これは「Rigidbody」の「Gravity(重力)」が作用しているからです。
では、この重力の作用をいったん「止める」ことにしましょう。
・「Rigidbody」の「Is Kinematic」にチェックを入れてください。
(ここがポイント!)
*チェックを入れた状態はプログラミング的には、「isKinematic = true」と表現します。
これで重力の作用がなくなりました。
「再生ボタン」を押して確認してみましょう!
(床が落ちる仕組み)
これで全ての準備が整いました。
「再生ボタン」を押してBallを動かして、FallFloorの上に乗ってみましょう。
Ballが乗って2秒後に落下を始めれば成功です。
では、この仕組みを考えてみましょう。
「Hierarchy」の「FallFloor」を選択した状態でもう一度「再生ボタン」を押してください。
「Is Kinematic」には当然チェックが入っています。
では、BallをFallFloorの上に乗せて観察してみてください。
数秒後、突然チェックが「解除」されると思います。
そしてその瞬間、落下が始まります。
これはプログラミング的には、
「isKinematic = true」の状態から「isKinematic = false」の状態になったと表現します。
では、ここで「FallFloor」スクリプトをもう一度みてみましょう。
void Fall()の命令ブロックの中に「isKinematic = false」の記述があると思います。
簡単に言えば、「BallがFallFloorとぶつかった2秒後に、isKinematic = falseの状態になったので、再び重力が作用して落下した。」となります。
以上が、落ちる床の仕組みとなります。