障害物とリスタート

確認済のバージョン: 5.5

-

難易度: 初級

このままでは誰でも確実にゲームをクリアしてしまいます。 そこで、「ぶつかってはいけない壁にぶつかったらゲームオーバー」のルールを追加します。

要素を分解すると以下の要素を追加すれば良さそうです。

  1. 「ぶつかってはいけない壁」の設定
  2. 壁にぶつかった際のイベントを設定
  3. ぶつかった際にシーンを再ロードする

ぶつかってはいけない壁の作成

まずは「ぶつかってはいけない壁」を作成します。

Danger Wallプレハブの作成

  1. HierachyビューのCreateをクリックします。
  2. 3D Object > Cubeを選択します。
  3. 作成したオブジェクト名は"Danger Wall"とします。
  4. 作成したDanger WallオブジェクトはPrefabに設定します。

DangerWallプレハブの作成

DangerWallの色を設定

DangerWallは接触することの出来ない危険な壁ですので、より危険度の高く見えるよう「光る壁」として色を設定します。

  1. ProjectブラウザのCreateをクリックします。
  2. Materialを選択し、DangerWallMaterialを作成します。
  3. Inspectorビューで以下の設定を行います。
    (Albedoを「赤」に設定、 Emissionを「1.3」に設定し色を赤に設定)

DangerWallMaterialの設定

  1. 作成したDangerWallMaterialをHierarchyビューのDangerWallオブジェクトへドラッグ&ドロップします。
  2. ApplyをクリックしDangerWallプレハブを更新します。

DangerWallの色を更新

Danger Wallの配置

次にDanger Wallをいくつか配置します。 この部分は好きなように配置して構いません。ただしゲームがクリア出来なくなるのでItemの位置にかぶらないようにして下さい。

例えば、以下のように配置します。

DangerWall配置例

  1. DangerWallを3つシーンに配置します。
  2. 各オブジェクトを以下のように配置します。
    DangerWall 1

* position (x:4, y:0.5, z:3) rotation (x:0, y:0, z:0) scale(x:10, y:1, z:1)
DangerWall 2
* position (x:4, y:0.5, z:-4) rotation (x:0, y:0, z:0) scale(x:10, y:1, z:1)
DangerWall 3
* position (x:-5, y:0.5, z:4) rotation (x:0, y:90, z:0) scale(x:10, y:1, z:1)

DangerWallの整理とstatic化

DangerWallがSceneに沢山配置されていますので、これをDangerWallsオブジェクトを使用して整理します。また、DangerWallは動かないオブジェクトですので、staticを使用して位置を固定します。

  1. HierarchyビューのCreateをクリックします。
  2. Create Emptyを選択し、作成したオブジェクト名を「DangerWalls」に変更します。
  3. DangerWallオブジェクト一覧をDangerWallsへドラッグ&ドロップして親子関係を設定します。
  4. DangerWallsのstaticにチェックを入れる。

DangerWalls設定

太陽光の輝度を下げる

壁が光っていますが太陽光の輝度が高く少し分かり難いです。 ですので、太陽光の輝度を下げます。

  1. HierarchyビューのDirectionalLightを選択します。
  2. InspectorビューでLightコンポーネントのIntensityを「0.7」に設定します。

DirectionalLightの設定

ぶつかったら判定の設定

次に「当たったらシーンを再起動」する機能を作成します。

  1. HierarchyビューでDanger Wallを選択します。
  2. InspectorビューでAdd Componentボタンをクリックします。
  3. New Scriptを選択し、「DangerWall」コンポーネントを作成します。
  4. Applyをクリックし、全てのPrefabへ反映させます。

DangerWall Component

スクリプトの更新

まずは「接触したか」の判定を受けるコールバックを設定します。

  1. DangerWall.csをMonodevelopやVisual Studioで開きます。
  2. 内容を以下の内容に変更します。

Code snippet

using UnityEngine;
using System.Collections;

public class DangerWall : MonoBehaviour
{
    // オブジェクトと接触した時に呼ばれるコールバック
    void OnCollisionEnter (Collision hit)
    {
        // 何かの処理
    }
}

シーンの再読込

接触対象がPlayerタグを持つオブジェクトの場合、シーンを再読込します。

  1. 再びDangerWall.csをMonodevelopやVisual Studioで開きます。
  2. コードを以下の内容に変更します。

Code snippet

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class DangerWall : MonoBehaviour
{
    // オブジェクトと接触した時に呼ばれるコールバック
    void OnCollisionEnter (Collision hit)
    {
        // 接触したオブジェクトのタグが"Player"の場合
        if (hit.gameObject.CompareTag ("Player")) {

            // 現在のシーン番号を取得
            int sceneIndex = SceneManager.GetActiveScene().buildIndex;

            // 現在のシーンを再読込する
            SceneManager.LoadScene(sceneIndex);
        }
    }
}

ゲームをプレイしてみてください。 今度はDangerWallを回避するように精密な操作を要求するゲームになりました。

※なお、Unity 5.5現在シーンをロードした際に画面が薄暗くなるバグが発生するかもしれません。
問題が発生した場合、以下の手順を行って下さい。

  1. メニュー>Window>Lightingを選択
  2. autoのチェックを外す
  3. Buildボタンをクリック