【Unity】ピースをPrefabから生成する

2019/03/06更新

ピースを増やすにはオブジェクトを大量に複製しないといけないので、
結構大変になります。

そこで、今回はピースオブジェクトをPrefabにして、
必要な数をPrefabから生成してみたいと思います。


Unityと言えばPrefab って何かに書いてあったような…
折角Prefabの機能があるのに使えないのも勿体ないので、
勉強したいと思います。


Prefabのざっくりとした作り方なんですが、
PrefabTest1.jpg
Hierarchyで作成したオブジェクトをProjectのフォルダーに、
ドラッグするだけです。

簡単に書きすぎました。(;^_^A

Hierarchyで作成したオブジェクトをProjectにドラッグする事で、
オブジェクトに付けたコンポーネントを保存した状態でPrefab化されます。

Prefabを作成した後は、元になったオブジェクトを削除します。

状況に合わせてPrefabを元にクローンを作成します。
クローン作製はスクリプトから行う事ができます。

利点は同じ機能のオブジェクトを大量に生産できる所です。

例えば、
・落ち物ゲーのブロック
・シューティングの敵や弾

オブジェクトを大量に準備しないといけないゲームには、
無くてはならない機能ですね。


では、以前の記事で作成したジグソーパズルを使って
【Unity】ピースを増やしてパズルにする
このパズルにPrefabを導入してみます。

まず、Prefabの作成です。
どのピースでもいいのですが、ImagePiece0をProjectにドラッグします。
Prefabが出来たらImagePieceとリネームします。

続けて、Hierarchyの全ピースを削除します。
Prefabの準備はこれでOKです。


クローンを作成する為に空のオブジェクトとスクリプトを用意します。
PrefabTest3.jpg
追加したオブジェクトとスクリプトをGameManagerとリネームします。

作成したスクリプトをGameManagerオブジェクトにアタッチして、
スクリプトを編集します。

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

public class GameManager : MonoBehaviour {

public GameObject pieceparent; //ピースを入れる親オブジェクト取得

public GameObject prefab; //Prefabの取得


// Use this for initialization
void Start(){

//開始時にピースを作成する
for (int i = 0; i < 25; i++)
{
CreatePiece();
}
}

// Update is called once per frame
void Update () {

}


//ピースオブジェクトの生成
void CreatePiece()
{
GameObject Piece = (GameObject)Instantiate(prefab);
Piece.transform.SetParent(pieceparent.transform, false);
}
}

エディターに戻って
GameManagerの設定した変数にそれぞれのオブジェクトをアタッチします。

PrefabTest4.jpg

これでプレイするとピースが25個クローンされています。

これだけだとクローンの操作はできますが、
所定位置にきてもハマる動作が実行されません。

なので、クローンのPieceNoを書き替えます。

生成のループ数を通しナンバーとして、
PieceNoにループの数字を代入します。

この時、PieceNo=i;
だけだと25回ループした後に
クローンのPieceNoを確認すると全ピース25になってしまいます。

これでは通しナンバーにならないので、
Inspector上のPieceNoを書き替える必要があります。


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

public class GameManager : MonoBehaviour {


public GameObject pieceparent; //ピースを入れる親オブジェクト取得

public GameObject prefab; //Prefabの取得

// Use this for initialization
void Start(){

//開始時にピースを作成する
for (int i = 0; i < 25; i++)
{
CreatePiece(i);
}
}

// Update is called once per frame
void Update () {

}


//ピースオブジェクトの生成
void CreatePiece(int No)
{
GameObject Piece = (GameObject)Instantiate(prefab);
Piece.transform.SetParent(pieceparent.transform, false);
PeaceManager peaceManager = Piece.GetComponent<PeaceManager>();
peaceManager.PieceNo = No;
}
}

生成したクローンのPeaceManagerにアクセスして、
Inspector上のPieceNoを書き替えています。


これで座標の読み込みができるので、
ハマる動作も実行できるようになります。


最初クローンピースをどうやって判別するか悩みました。
通しナンバーを付ける方法を思いつかなかったからなんですが。

コンポーネントにアクセスできるなら直接書き替えもできるかも、
と思いついて試した所、上手くいって良かったです。

ただ、GetComponentを多用する事になったので、
リソースがどうなるかが問題です。

25ピースくらいなら問題ないでしょうが、
1000ピースくらい作るとスマホで動くのか検証できてません。

多分問題ないとは思うんですが…

どうなんでしょう
シロートの思いつきで作ったので、これくらいで勘弁して下さい。
(´`;)




この記事へのコメント