【Unity】落下判定エリアの設置|落ちたらリトライ!

Fall-judgment-area Unity development

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

1-Fall-down

このままでは永遠にゲームが再開しません。
コースアウトしたら元に戻るようにしていきましょう。

これは、以前に解説した接触判定を応用することで解決できますよ。
「落下判定エリア」の設定と言います。

やり方としては、落下した先に、無限に広い板を配置し、その板にオブジェクトが接触したら、Scriptを使ってゲームをスタート(あるいは特定のシーン)に戻すという流れです。

ご理解を深めるために、実際に画面操作をしながら進めていただくことをオススメしています。
解説では、以下の続きとして解説をしていきます。
エッセンスだけを知りたい方は、スキップして本文へとお進みください。

【解説画面に沿ってやりたい方】
以下の2記事の内容をベースに解説しますので、事前に実施をお願いします。
(必須)[所要時間:約10分]

 

▼キーボードからオブジェクトを操作▼

解説画面と全く同じ環境にしたい場合は、追加で以下の4記事を実施お願いします。
(任意)

[所要時間:約60分]

▼オブジェクトに色を付ける▼

▼オブジェクトが落ちないように壁を作る▼

▼エディタでパラメータ調整▼

▼回転するアイテム配置▼

▼当たり判定▼

▼UI配置▼

▼プレイヤーにカメラ追従▼

ここまで、実施すると[Player]が四方壁に覆われた状態になり、落下することができません。そのため、壁を1枚取り去る必要があります。

2-Wall-blind

Hierarchyウインドウで[Wall_4]を選択して、Inspectorウインドウで名前の左のチェックを外します。これで、[Player]が落下可能な状態になります。

ここまでで、事前準備は完了です。早速作成していきましょう。

落下挙動の確認

3-Wall-blind-gameview

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

4-fall-down-forever

無限に落下していきますね。(一生ゲームは再開されない)

そのため、ある程度落下したら、スタートに戻るような設定が必要になります。

早速、対策をしていきましょう。

落下判定エリアの作成

オブジェクトの追加

落下判定をするオブジェクトを設置します。

5-Object-add
[Hierarchyウインドウ]下の[+]>[3D Object]>[Cube]をクリックします。

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

6-Object-Transform
7-Object-set
設置した[Cube]の名前を[RetryBoard]に変更し、Transformを以下のように変更します。[Ground]よりは極端に大きくします。

白色のオブジェクト[RetryBoard]が配置されます。

接触検出

[Player]が落下して[RetryBoard]に接触した時に、スタートに戻るというイベントを発生させますので、接触検出をしていきます。

接触検出は以前の記事でも解説しましたので、復習です。

▼当たり判定▼

8-Is-Trigger
[Hierarchyウインドウ]の[RetryBoard]を選択し、[Inspectorウインドウ]の[Box Collider]>[Is Trigger]のチェックを付けます。

[Is Trigger]は、自動的に接触判定を行うのではなく、接触した時の振る舞いをScriptで設定できるモードでしたね。これで接触検出ができるようになります。

条件分け

今回のケースのそうですが、接触判定はゲームの中では、複数のシーンで利用されます。そのため、その条件毎に、振る舞いを分ける必要があります。

今回は[Player]が、

  • 移動して、[Item]に接触したら、GETする
  • 落下して、[RetryBoard]に接触したらスタートに戻る

というように、接触するオブジェクトによって処理を変える必要があります。

その場合分けをタブの機能を使って実現します。

タグの設定

[Item]と[RetryBoard]のそれぞれにタグを設定します。

[Item]はプレハブ化していますので、プレハブを変更することで、全てを一度に変更することができます。

9-Item-tag
[Projectウインドウ]の[Item](プレハブ)を選択し、[Inspectorウインドウ]の[Open Prefab]をクリックします。

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

10-Item-tag2
11-Item-tag3
12-Item-tag4
[Inspectorウインドウ]のTag右のプルダウンメニューから[Untagged]をクリックします。
プルダウンメニューが開きますので、[Add Tag…]をクリックして新規作成します。
[+]をクリックして、NewTag Nameを[Item]と変更して[Save]をクリックします。

追加したタグを[Item]に設定します。

15-Item-Tag-Add
[Projectウインドウ]の[Item](プレハブ)を選択し、[Inspectorウインドウ]のTag右のプルダウンメニューから、先ほど設定したタグの[Item]をクリックします。

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

13-Retryboard-tag
13-Retryboard-tag2
17-Tag-Choice


これでタグの設定は完了です。

Script追加

設定したタグを使って、[Player]の振る舞いをアイテムGETとリトライするパターンで分けます。

[Player]のScriptを開きます。

18-PlayerController
[Projectウインドウ]の[PlayerController]をクリックします。

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

19-Script1
20-Script2
21-Script3
if文で、[item]の場合と[RetryBoard]の場合で処理を分けます。
[item]の場合の処理は今まで記載した内容の流用です。
[RetryBoard]の場合は、再読み込みする(スタート状態に戻る)という処理です。

SceneManager.LoadScene(SceneManager.GetActiveScene().name);

  • SceneManager.GetActiveScene().nameで、現在の名前のSceneを取得します。
  • これをScene移動の命令であるSceneManager.LoadScene( )の中に書きます。

落下したら現在のSceneに移動、つまり、現在のSceneを読み直すという処理になります。

実行結果の確認

[▶︎]ゲームプレイで確認します。
白の[RetryBoard]に触れると、リトライされていれば確認は完了です。

ゲーム中には、[RetryBoard]を表示する必要はないため、確認が済んだら、[RetryBoard]は非表示にしておきます。

22-Meshcollider-off
23-ON
24-OFF
[Hierarchyウインドウ]の[RetryBoard]を選択し、[Inspectorウインドウ]の[Mesh Collider]のチェックを外して、OFFにします。

これで、見栄えもよくなりました。

以上です。お疲れ様でした。

▼ポチッと応援お願いします▼
にほんブログ村 IT技術ブログ Unityへ
にほんブログ村
タイトルとURLをコピーしました