(今回はこんなことを学びます)
・オブジェクトに触れると数秒後に落下する方法
・「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オブジェクトにドラッグ&ドロップしましょう。
(2)BallにPlayerという名前のタグを付ける
・「Hierarchy」で「Ball」オブジェクトを選択。
・「Inspector」で「Tag Untagged」をクリック。
・「Playerタグを選択してクリック」(*Playerタグは最初からUnityに用意されています。)
これでタグの設定が完了しました。
(3)FallFloor(床)にRigidbodyを付ける
FallFloorに「重力」をつけましょう。
・「Hierarchy」で「FallFloorオブジェクト」を選択した状態で、「Add Componentをクリック」→「Physicsをクリック」
・→「Rigidbodyをクリック」
この段階で一度「再生ボタン」を押してみましょう。
FallFlor(床)がスタートと同時に落下していくと思います。
これは「Rigidbody」の「Gravity(重力)」が作用しているからです。
では、この重力の作用をいったん「止める」ことにしましょう。
・「Rigidbody」の「Is Kinematic」にチェックを入れてください。
(ここがポイント!)
・チェックを入れた状態はプログラミング的には、「isKinematic = true」と表現します。
これで重力の作用がなくなりました。
「再生ボタン」を押して確認してみましょう!
(4)床が落ちる仕組み
これで全ての準備が整いました。
「再生ボタン」を押してBallを動かして、FallFloorの上に乗ってみましょう。
Ballが乗って2秒後に落下を始めれば成功です。
では、この仕組みを考えてみましょう。
「Hierarchy」の「FallFloor」を選択した状態でもう一度「再生ボタン」を押してください。
「Is Kinematic」には当然チェックが入っています。
では、BallをFallFloorの上に乗せて観察してみてください。
「2秒後、突然チェックが外れる」と思います。
そしてその瞬間、落下が始まります。
これはプログラミング的には、
「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の状態になったので、再び重力が作用して落下した。」となります。
以上が、落ちる床の仕組みとなります。