【Unity】はじめてのプレハブ2018-04-16【Unity】はじめてのプレハブこんにちは、冬以外の季節が大好きな東北産まれのプログラマgmatsuです。暖かくなってとても過ごしやすい季節になってきましたね。仕事では座ってばかりなので、運動不足を解消する為にも業務後や休日は近所をランニングしてます。冬の間に貯めまくった欲望の塊(ぜい肉)を取り除くために日々走ったり歩いたり。欲望の塊、中々手強いです。そんな訳で(どんな訳で)、今回はUnityのプレハブについて触れたいと思います。シューティング、アクションゲームを作ろうとした時、敵とか弾の管理って皆さんどうしてますか?クラス、構造体等、データを塊として管理する物を準備して、それを複数作成して...とかやりたいそこのアナタ!Unityではプレハブを使うらしいですよ。インスタンス化まとめプレハブとはUnityマニュアル:プレハブ公式の説明ではこういう物なんだそうです。必要な数分だけ生成という流れです。敵や弾のベースとなるプレハブを定義しておけばそれを必要な分だけ生成する事ができるので、10体でも100体でも敵が作り出せちゃうわけですね。生成後は1つ1つの実体の座標、画像を別々に管理出来ますから、敵を10体分作ったとしても全て同じ敵ではなく、敵A、敵Bのようにパターンの違う敵を管理する事が可能です。敵、弾を例に上げて解説はしましたが、RPGの村人、マップチップ等、同じタイプの物を複数作り出したのであれば、Unityではプレハブを使いましょう。Object>Sprite)を表示するこの画像を今回はプレハブで用意します。プレハブ化したいGameObjectの作成まずHierarchyにプレハブ化したいGameObjectを作成します。Object>SpriteでGameObjectを生成しましょう。Transform、SpriteRendererの2つのコンポーネントを持ったGameObjectが生成されました(今回は「chip」という名前にしています)。このようなGameObjectを何個も作成して、敵画像を100体分...とかやってられないので、このオブジェクトをベースとしてプレハブを作成します。プレハブの作成HierarchyのプレハブにしたいオブジェクトをProjectにドラッグ&ドロップします。これでプレハブは完成です。作れましたが、作るだけならこれで終わりです笑。プレハブ化したオブジェクトのInspectorを確認してみましょう。Transform等のSpriteに必要なコンポーネントを持ったプレハブを作ることが出来ています。プレハブが出来たら元になったHierarchy内のGameObjectはもう必要ありませんので削除しちゃいましょう。後はこいつを使って、複数の画像を表示してみましょう。※ちなみにプレハブは必ずResourcesフォルダに入れておきましょう。今回は「Assets/Resources/Prefabs」に入れています。インスタンス化プレハブを作っただけの状態では、プロジェクトを実行しても何も表示されません。用意するだけではインスタンス(実体)が準備されていないからです。Hierarchyにドラッグしてインスタンス化する事もできますが、やっぱり100個用意しろ...とか言われるとやってられません。そこでスクリプトからインスタンス化する事で10個でも100個でも楽にインスタンスを準備する事ができるようになります。今回はアプリが起動したらインスタンス化の処理が行われるようにしたいので、以下のようなスクリプトを用意しました。}}Chipを管理する為のマネージャとしてChipManagerを作成しました。init()を呼ぶことでチップの生成、つまりプレハブのインスタンス化を行ってくれるようにしています。Instantiate()にプレハブを渡すことでインスタンス化をしてくれています。プレハブはロードする必要がありますので、先程Assets/Resource/配下に置いたプレハブのパスを指定しましょう。ロードにはResources.Load()を使用しますが、このメソッドはResources/配下のファイルを読み込む為のものですので、Resources/以降のパスを指定すればOKです。ロードしたらGameObjectとして受け取り、Instantiate()に座標データと共に指定しましょう。すれば100個でも1000個でもオブジェクトの量産が可能になりますね。これだと100個なら100行近く書かないといけなくなるので、そこは配列やらファイル読み込みやらでよしなに修正して下さい。現状ではアプリが起動した時に上記処理を行ってくれませんので、次のようなマネージャも用意しました。}}あとはこのマネージャ達をAddComponentする為のGameObjectを次のようにHierarchyに用意します。HierarchyのGameManagerオブジェクトの生成と設定は以下の様に行っています。実行してみると...「chip(Clone)」が出来てる!この「(Clone)」って付いているオブジェクトこそがプレハブをインスタンス化したGameObjectになります。やったぜ!やっと表示され...何も表示されていません。記事も長くなってきたので、画像表示は次回にしたいと思います。まとめマネージャの解説も入ってしまったので、プレハブだけの解説をまとめてみます。・プレハブを使うメリット同じジャンルの大量のGameObjectを管理する事が出来る。1つ1つオブジェクトの生成、設定を手作業で行わなくともスクリプトから一気に出来るので便利。各オブジェクトの座標等の個々のデータは、ファイル等を利用してうまく活用しないと、結局は大量行のソースコードが必要になる。Instantiate()でインスタンス化する表示する画像の事をすっかり忘れていたので、こちら次回の記事で書きます笑。SpriteAtlasを使用して、画像の管理をしやすくしてみたいと思います。