SG-フルーツのプレファブ化!PrefabとPrefabVariantを使いこなそう!part04

フルーツの進化に着手する前に、各フルーツをどの様に管理するかの話をしたいと思います。ここではプレファブとプレファブバリアントというものを利用したいと思います。

目次

Prefab/PrefabVariantとはなんぞな?

これから各フルーツをいろんなタイミングで生成する必要があります。これらの生成には雛形が必要になってきます。その雛形というのがPrefab(プレファブ)です。また今回のようなフルーツの種類が多い場合、各フルーツのプレファブを作成した後に、「やっべー、全体に加えなきゃいけない変更が入ったー!」って時に計11個のプレファブすべてに変更を加えるのは非常に大変です。そんな時役に立つのがPrefabVariant(プレファブバリアント)となります。

Prefab

いわゆる雛形です。シーン内で作ったものを、他の場所やシチュエーションで使いまわしたい場合、プレファブ化を行い再利用することが可能です。

プレファブ化を行うメジャーな方法は、

  • シーン内のオブジェクトをドラッグアンドドロップでプロジェクトビューに持っていく

手順としてはこれだけでOK。ここでは、Fruitsオブジェクトをプレファブ化しましょう。アイコン表示時に、青いアイコンマークがプレファブの印です。

PrefabVariant

プレファブバリアントとは、いわゆるプログラムの継承のような機能です。今回のケースだと、フルーツプレファブを元にして、各フルーツのプレファブを作成します。この時、フルーツ全体になにか新しい機能をつかしたり設定を変更したいと思った時、個別のプレファブで作成したときはすべてに変更を加える必要があります。

ところがプレファブバリアントで生成されたものは元になるプレファブに変更を行うと、プレファブバリアント全体に影響が反映されます。

このあたりは実際に使いながら慣れていくのが一番わかり易いです。手始めにFruitsプレファブをベースにして、チェリーといちごを作りたいと思います。(いままでチェリープレファブにしなかったのはこのときのためですね)

  • Cherryプレファブ(バリアント)を作成
    • Fruitsプレファブを右クリック>Create>Prefab Variantを選択
    • 名前を01CherryPrefabに変更
  • Strawberryプレファブ(バリアント)を作成
    • Fruitsプレファブを右クリック>Create>Prefab Variantを選択
    • 前を02StrawberryPrefabに変更
  • Strawberryプレファブの更新
    • プレファブの更新を行う場合は対象のプレファブをダブルクリックしてプレファブエディタモードに切り替えます
      • SpriteRenderer
        • Sprite:fruits02-strawberry(いちごの画像)
      • CircleCollider2D
        • Radius:0.3(ここは大きさ合ってそうだと思うサイズにしてください)
        • 半径の大きさはチェリーより大きくなるものを設定すると良いと思います

プレファブ化が出来たらシーン内の入れ替えを行う&注意点

ここまでプレファブ化が出来たらシーン内のフルーツオブジェクトを削除します。また、チェリーといちごが縦に並ぶように配置してください。

  • シーン内のフルーツを削除
  • プレファブ化したフルーツを縦にならべる

縦に並べるのは自然落下でいずれぶつかる位置関係であればOK!で、動かすと異なるフルーツにも関わらず消えてしまうと思います。ということでこのあとフルーツの種類ごとの判定を追加したいと思います。

フルーツの種類を設定・同じフルーツとぶつかったときだけ消す

各フルーツのためのプレファブが準備出来ました。次は同じフルーツ同士だと消える、異なるフルーツだと消えない、これらの処理を実装したいと思います。

フルーツを識別するためのenum

フルーツを識別するためにenumというものを利用します。enumというのは自分で好きな名前の変数のようなものを作ることが出来ます。ここではフルーツの種類をenumで表します。普段は基本的に英字で作るのですが、今回は日本語でやってみましょう。

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

public enum FRUITS_TYPE
{
    さくらんぼ = 1,
    いちご,
    ぶどう,
    オレンジ,
    かき,
    りんご,
    なし,
    もも,
    パイナップル,
    メロン,
    すいか,
}

public class Fruits : MonoBehaviour
{
    public FRUITS_TYPE fruitsType;

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.TryGetComponent(out Fruits otherFruits))
        {
            Destroy(gameObject);
        }
    }
}

上記プログラムでは種類の定義追加と、メンバー変数に追加を行っています。スクリプトが保存できたらプレファブバリアント化している2種類のフルーツのインスペクターを御覧ください。

なんとプルダウンでフルーツの種類を設定することができるようになっています。これを現在作っている2つのフルーツに合わせてください(さくらんぼ・いちご)

識別する処理を追加する

では今回の締めとして、さくらんぼといちごがぶつかっても消えないようにしたいと思います。

public class Fruits : MonoBehaviour
{
    public FRUITS_TYPE fruitsType;

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.TryGetComponent(out Fruits otherFruits))
        {
            // 相手のフルーツタイプと自分のフルーツタイプが同じなら削除を行う
            if (otherFruits.fruitsType == fruitsType)
            {
                Destroy(gameObject);
            }
        }
    }
}

Destroyしていた処理に対して、ぶつかった相手側のFRUITS_TYPEが一致しているときだけ呼ぶように変更!

動かして確認

位置関係は先程と同じ。シーン内に配置しているオブジェクトを触らずにプレファブ側の設定を変更すると、シーン内のオブジェクトにも反映されているはずです。

以前は接触時に消えていたと思いますが、今度はちゃんと弾かれるような挙動を取ってくれます。

これでようやく同じフルーツだと消える、異なるフルーツは消えない、という基本部分が作成出来ました。

次回はいよいよ次のフルーツへの進化を行いましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次