
オブジェクトがコースアウトしたら戻ってきません…どうしよう?


このままでは永遠にゲームが再開しません。
コースアウトしたら元に戻るようにしていきましょう。
これは、以前に解説した接触判定を応用することで解決できますよ。
「落下判定エリア」の設定と言います。
やり方としては、落下した先に、無限に広い板を配置し、その板にオブジェクトが接触したら、Scriptを使ってゲームをスタート(あるいは特定のシーン)に戻すという流れです。
ご理解を深めるために、実際に画面操作をしながら進めていただくことをオススメしています。
解説では、以下の続きとして解説をしていきます。
エッセンスだけを知りたい方は、スキップして本文へとお進みください。
以下の2記事の内容をベースに解説しますので、事前に実施をお願いします。
(必須)[所要時間:約10分]
▼キーボードからオブジェクトを操作▼
解説画面と全く同じ環境にしたい場合は、追加で以下の4記事を実施お願いします。
(任意)
[所要時間:約60分]
▼オブジェクトに色を付ける▼
▼オブジェクトが落ちないように壁を作る▼
▼エディタでパラメータ調整▼
▼回転するアイテム配置▼
▼当たり判定▼
▼UI配置▼
▼プレイヤーにカメラ追従▼
ここまで、実施すると[Player]が四方壁に覆われた状態になり、落下することができません。そのため、壁を1枚取り去る必要があります。

Hierarchyウインドウで[Wall_4]を選択して、Inspectorウインドウで名前の左のチェックを外します。これで、[Player]が落下可能な状態になります。
ここまでで、事前準備は完了です。早速作成していきましょう。
落下挙動の確認

[▶︎]ゲームプレイで、どのように落下するのか確認してみましょう。

無限に落下していきますね。(一生ゲームは再開されない)
そのため、ある程度落下したら、スタートに戻るような設定が必要になります。
早速、対策をしていきましょう。
落下判定エリアの作成
オブジェクトの追加
落下判定をするオブジェクトを設置します。

SceneビューにCubeが設置されます。


白色のオブジェクト[RetryBoard]が配置されます。
接触検出
[Player]が落下して[RetryBoard]に接触した時に、スタートに戻るというイベントを発生させますので、接触検出をしていきます。
接触検出は以前の記事でも解説しましたので、復習です。
▼当たり判定▼

[Is Trigger]は、自動的に接触判定を行うのではなく、接触した時の振る舞いをScriptで設定できるモードでしたね。これで接触検出ができるようになります。
条件分け
今回のケースのそうですが、接触判定はゲームの中では、複数のシーンで利用されます。そのため、その条件毎に、振る舞いを分ける必要があります。
今回は[Player]が、
- 移動して、[Item]に接触したら、GETする
- 落下して、[RetryBoard]に接触したらスタートに戻る
というように、接触するオブジェクトによって処理を変える必要があります。
その場合分けをタブの機能を使って実現します。
タグの設定
[Item]と[RetryBoard]のそれぞれにタグを設定します。
[Item]はプレハブ化していますので、プレハブを変更することで、全てを一度に変更することができます。

プレハブ編集モードになります。



プルダウンメニューが開きますので、[Add Tag…]をクリックして新規作成します。
[+]をクリックして、NewTag Nameを[Item]と変更して[Save]をクリックします。
追加したタグを[Item]に設定します。

[RetryBoard]も同様の手順でTagを追加します。



これでタグの設定は完了です。
Script追加
設定したタグを使って、[Player]の振る舞いをアイテムGETとリトライするパターンで分けます。
[Player]のScriptを開きます。

Scriptは以下のように修正します。



[item]の場合の処理は今まで記載した内容の流用です。
[RetryBoard]の場合は、再読み込みする(スタート状態に戻る)という処理です。
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
- SceneManager.GetActiveScene().nameで、現在の名前のSceneを取得します。
- これをScene移動の命令であるSceneManager.LoadScene( )の中に書きます。
落下したら現在のSceneに移動、つまり、現在のSceneを読み直すという処理になります。
実行結果の確認
[▶︎]ゲームプレイで確認します。
白の[RetryBoard]に触れると、リトライされていれば確認は完了です。
ゲーム中には、[RetryBoard]を表示する必要はないため、確認が済んだら、[RetryBoard]は非表示にしておきます。



これで、見栄えもよくなりました。
以上です。お疲れ様でした。