アイテム回収の追加

確認済のバージョン: 5.5

-

難易度: 初級

次にゲーム性を持たせるためにアイテム回収する機能をゲームに追加します。

この機能は簡単に言えば「ステージ上に大量に配置したアイテムにプレイヤーが接触したらアイテムが消える」という物です。では、この機能を分解してみましょう。

  1. 沢山配置出来る
  2. "Player"が接触したら反応する
  3. 接触時アイテムが消える

この機能を作れば良い訳です。では、早速作ってみましょう。

Itemオブジェクトの追加

まずItemの元となるアイテムを作成します。

  1. HierarchyビューのCreateをクリックします。
  2. "3D Object" -> "Capsule"を クリックします。
  3. 生成したCapsuleを選択し名前を"Item"に設定します

Capsule作成

少し大きすぎるので、Itemの大きさと位置を調整します。

  • Position:(x:0, y:1: z:0)
  • Scale:(x:0.5, y:0.5, z:0.5)

Itemの作成

Itemオブジェクトの構成をPrefabへ書き出す

この作成したアイテムですが、量産し易いようにオブジェクト構築情報をprefab(プレハブ)として書き出します。

今回もファイルを整理するため、専用フォルダを作成して、そこに格納しましょう。

  1. ProjectブラウザでCreateをクリックし、Folderを選択します。
  2. 新しく作成したフォルダ名をPrefabとします。

Prefabフォルダ設定

あとはItemオブジェクトをPrefabとして書き出します。青いアイコンの「Item」オブジェクトが出来れば成功です。

  1. HierarchyビューのItemを選択します。
  2. ProjectブラウザのPrefabフォルダへItemオブジェクトをドラッグ&ドロップします。

Prefab作成 ItemのPrefab

Itemオブジェクトの配置

先ほどファイルへ書きだしたアイテムをシーンへ配置します。

  1. ProjectブラウザのPrefabフォルダのItemを選択します。
  2. Sceneビューへドラッグ&ドロップします。

これで、先ほどセットアップしたオブジェクトと同様にセットアップされたオブジェクトがシーンへ配置されました。簡単に円系に配置してみます。

Itemプレハブを配置

PlayerとItemの接触判定

Itemに接触判定を追加します。この機能も標準では用意されていない機能ですので、新しくコンポーネントを追加します。

  1. HierarchyビューでItemオブジェクトを選択します。
  2. InspectorビューでAdd Component > "New Script"を選択します。
  3. Nameに「Item」と指定し「Create And Add」ボタンをクリックします。

まずはMonobehaviourのAPIリファレンスから、使えるコールバックを確認します。 接触判定のコールバックとしては、以下のコールバックが使えそうです。

  • OnTriggerEnter : 判定のみのTriggerとの接触判定
  • OnCollisionEnter : 物理的な反射を持つColliderとの接触判定

今回はどちらかと言えば、アイテム回収時にスルっと抜けて欲しいのでOnTriggerEnterを選択します。MonoBehaviour.OnTriggerEnter(Collider)を参考にItem.csにコールバックを追加します。

Code snippet

using UnityEngine;
using System.Collections;

public class Item : MonoBehaviour
{
    // トリガーとの接触時に呼ばれるコールバック
    void OnTriggerEnter (Collider hit)
    {
    }
}

Itemの接触判定をTriggerに変更

また、判定方式をTriggerにしたため、接触判定もTriggerに設定する必要があります。 Unityエディタへ戻り、ItemのColliderの設定をTriggerに設定します。

  1. HierarchyビューのItemオブジェクトを選択します。
  2. InspectorビューのCapsuleColliderコンポーネントのIsTriggerにチェックを入れます。

IsTriggerにチェックを入れる

Playerとの接触判定

先ほどの処理で、あらゆるTriggerとの接触判定を行うことが出来るようになりました。しかし、本来当たり判定はPlayerのみと行いたい所です。

ここでいくつかのアイディアがあります。例えば、Playerへの参照を事前に登録しておき接触時に比較する、接触したオブジェクト名を確認する、接触したオブジェクトのタグを確認する、接触対象が指定コンポーネントを持っているか確認する、メッセージを送信する(自発的に動いてもらう)等です。

今回はシンプルで汎用的な「タグを確認する」方法を採用します。OnTriggerEnterの引数であるhitには、接触対象の情報が含まれます。この接触対象のタグを調べ、Playerならば特別な処理を行うようにItemコンポーネントを以下のように修正します。

Code snippet

using UnityEngine;
using System.Collections;

public class Item : MonoBehaviour
{
    // トリガーとの接触時に呼ばれるコールバック
    void OnTriggerEnter (Collider hit)
    {
        // 接触対象はPlayerタグですか?
        if (hit.CompareTag ("Player")) {

            // 何らかの処理
        }
    }
}

Playerにタグを設定する

Playerオブジェクト側も設定しましょう。先ほど「Playerタグを持つオブジェクトと接触した場合」の処理を記述したため、PlayerオブジェクトにもPlayerタグが必要です。

  1. HierarchyビューでPlayerオブジェクトを選択します。
  2. InspectorビューのTagをPlayerへ変更します。

Playerタグの設定

接触判定時にItemを削除する

接触時にオブジェクトを削除するように設定します。削除はDestroyメソッドを使用します。

Destroyはオブジェクトを削除するメソッドです。このメソッドで指定したオブジェクトは削除され、ゲームから消滅します。

Code snippet

using UnityEngine;
using System.Collections;

public class Item : MonoBehaviour
{
    // トリガーとの接触時に呼ばれるコールバック
    void OnTriggerEnter (Collider hit)
    {
        // 接触対象はPlayerタグですか?
        if (hit.CompareTag ("Player")) {

            // このコンポーネントを持つGameObjectを破棄する
            Destroy(gameObject);
        }
    }
}

これでPlayerとの接触時にItemオブジェクトが破棄されます。

Itemの取得

Prefabの更新

現状、セットアップした一つのItemオブジェクトのみ消えるようになっています。 それではPrefabとして配置したオブジェクトも同様のセットアップになるように、Prefabの値を更新します。

  1. HierarchyでItemオブジェクトを選択します。
  2. InspectorでApplyボタンをクリックします。

Prefabの更新

アイテムの整理

最後にアイテムを整理します。 手順はStageの設定時に行った内容と同じです。ただし、アイテムはStaticなオブジェクトではありませんので、Staticにチェックは入れません。

  1. HierarchyビューでCreateを選択します。
  2. Create Emptyを選択します。
  3. Inspectorビューで先ほど作成したオブジェクトの名前をItemsに変更します。
  4. 先ほどから作成したItemオブジェクト全てを選択し、Itemsオブジェクトへドラッグ&ドロップします。

Itemsの設定