(第八回)Unityでゲーム開発 作成編⑤

(第八回)Unityでゲーム開発 作成編⑤

目次

はじめに
アイテムの作成
アイテム取得
次回予告

はじめに

前回は水面の表現や玉の操作について紹介しました。今回は玉が操作できるようになったので、コース上に落ちているアイテムを取得するといった操作を作成していきたいと思います。

アイテムの作成

コース上に星のオブジェクトを置いて、玉が衝突するとそのアイテムが消えるような仕組みを作りたいと思います。
今回使用する星のオブジェクトはアセットストアで見つけたものを使用しています。
好きなオブジェクトで同じ動きを作っていただけたらと思います。

使うオブジェクトが決まれば、Prefabsというフォルダを作成してそこに格納します。
今回は入手したアセットがすでにPrefabの状態であったので、フォルダに入れて整理するだけで済みました。

自分で作成する際には、GameObjectで作成したものをProjectビューに放り込むことでPrefabが生成されます。

試しにCubeで作成してみます。
GameObjectからCubeを選択して生成します。

生成されたCubeをProjectビューにドラッグアンドドロップさせます。
整理の都合上、Prefabsというフォルダに入れてます。
先程生成したCubeが青字になっていれば、Prefabができています。
複数作成する必要があり、サイズや色などが同様の場合など、このPrefabを変えるだけですべての該当するPrefabのインスタンスの設定もPrefabと同様になります。

そもそもPrefabとは何かと思われるかもしれませんが、これは作成済みのオブジェクトを複製する機能のことです。
Prefabオブジェクト自体はテンプレデータというイメージです。
大規模なゲームになるほど、同じものを複製することも多いと思われるので、作業効率化や設定内容の間違いを防げるなど大変便利な機能です。
詳しく知りたい方は公式サイトに記載がございますので、ご覧ください。

https://docs.unity3d.com/ja/2018.1/Manual/Prefabs.html

それではプレハブを使って、複数作成してみます。

Prefabのオブジェクトをコピーして、複数個生成してみました。
設定内容に関しては、下記のPrefabと同じ設定内容になっているのを確認できました。

変更した箇所は、サイズ感とAnimationの設定がされていたので、今回は使用しないので、全てをオフにしています。
また衝突の判定が必要になるため、お馴染みのRigidbodyを要素として追加します。
前回記事で要素の追加部分は紹介しているので、そちらを参考にしてください。

RIgidbody設定の上での注意点は下記の2点になります。

  • Use Gravityのチェックを外す
  • Is Kinematicのチェックを入れる

一つ目は重力の影響を受けてしまうと、床の下に落ちてしまうからです。
設定場所が動く床なので、ここは重力の影響は受けないようにしておきます。

二つ目は物理判定の影響を受けないようにしておくことです。
ドミノと違い飛ばされる必要はないので、そのためにこのチェックをtrueにしておきます。

ここまでの設定で動作させてみました。
表示されているキーを入力して、下に落ちないように操作してみました。
想定通りの動きで特に問題ないです。
次に星に衝突した際に、星が消えるような仕組みを作っていきます。

アイテムの取得

この部分は簡単にスクリプトで書くことができます。
前回コードに追加したものが下記になります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerControll : MonoBehaviour{

    public float speed;

    private Rigidbody rb;

    void Start ()
    {
        //Rigidbodyを取得
        rb = GetComponent<Rigidbody> ();
    }

    void Update()
    {
        //カーソルキーの入力情報を取得
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        //入力情報に応じて移動方向を設定
        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        //Rigidbodyに力を与える
        rb.AddForce(movement * speed);
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag ("Stars"))
        {
            other.gameObject.SetActive (false);
        }
    }

}

OntreggerEnterで物体をすり抜けた際の判定を取得しています。
その判定のキーとなるのが、Collider要素になります。
この要素で、すり抜けの判定とするために。Is Triggerにチェックを入れます。
もし、Box Colliderの要素がオブジェクトにない場合は、Rigidbodyの時と同じ要領で追加してください。

次にCompareTagの説明ですが、こちらはgameObjectである玉と衝突対象である星のtagが関連付けられているかを確認しています。
この結果が確認できれば、オブジェクトが非表示になるという仕組みです。

星のオブジェクトのtagを設定する必要があるので、下記で説明します。
Prefabの最上部にTagがあるので、横のリストを表示します。
Tagを作成していないので、Starsはないので、作成する必要があります。
リスト一番下のAdd Tag..をクリックします。

下記の画面になるので、+マークを押して、作成画面に移ります。

こちらの作成画面で、Starsという名前をつけて、Saveを押せばTagの作成が完了です。

作成したStarsがPrefabのTag一覧から選択できるので、こちらを選択します。
複製したオブジェクトにもそれぞれ同一のTagが設定されているかを確認します。

ここまでの設定が完了していれば、玉が星に衝突した際に、星が消える仕組みができているはずなので、
実際動作検証をおこなってみます。

うまく操作して、全ての星を取ることができました。
ただ取得した星をカウントするシステムなどがないと、少しわかりにくい感じですね。
この辺り次回以降もう少しわかりやすいものにしていきたいと思います。

次回予告

今回作成した動作結果がプレイヤーにとって分かりづらいものなので、次回記事では結果を可視化出来るような機能も追加したいと思います。