今回はprefabについて見ていきたいと思います。prefabを使って動的にオブジェクトを生成できるようになると、一気にできることの幅が広がります。
Unityを使い始めたら、ぜひ早い段階で覚えてしまいましょう!
- [基礎] prefabとは?
- [基礎] prefabを作ろう!
- [基礎] prefabを使おう!
- [応用] prefabをスクリプトから動的生成しよう!
今回はこのような内容で、順にprefabを見ていきましょう。
prefabとは?
prefabを一言で説明すると「プラモデルの金型」と言えるでしょう。金型が一つあれば、それを元にプラモデルを量産できますよね。prefabもこれ同じです。
prefabが一つあれば、それを元にGameObjectを量産できるんです。言葉だけでは実感がわかないと思いますので、実際に作ってみましょう。
prefabを作ろう!
それでは実際にprefabを作ってみましょう。作り方は非常にシンプルです。
元になるオブジェクトを作成しよう!
まずはprefabの元となるオブジェクトを作りましょう。今回はシンプルにCubeオブジェクトを作りましょうか。
Hierarchyウィンドウ上で右クリック→ 3D Object → Cube を押してCubeオブジェクトを作成します。
prefab化しよう!
先ほど作ったCubeオブジェクトをprefab化しましょう。
HierarchyウィンドウのCubeを、ドラッグ&ドロップで「Projectウィンドウ」に投げ込みます。
すると…
どうでしょう、簡単にprefabが作られましたね。あとはこのprefabを利用すれば、Cubeオブジェクトを簡単に量産できます!
prefabを使おう!
では先ほど作ったprefabを、エディタ上から使用してみましょう。
これも非常に簡単ですよ。
prefabの使い方
Projectウィンドウ上にある、Cubeプレハブを「Hierarchyウィンドウ」に投げ込んでみましょう!
すると…
Cubeプレハブを元に、元のCubeそっくりの「Cube(1)」が作られました!
※おそらく投げ入れただけではCubeオブジェクトと座標が重なっていると思います。画面ではわかりやすくするため、作った後少し横にずらしてあります。
また名前の(1)部分は、同名のCubeオブジェクトと名前がかぶるため数がカウントされ追加されます。
prefabをスクリプトから動的生成しよう!
先ほどまではエディタ上での使い方を見てきました。
しかしprefabの本領はプログラム上から、オブジェクトを量産できることです。それさえできれば、例えば「ボタンを押したらボールが生成されて発射される」なんてことが非常に簡単に実現できますよ!
それでは実際にプログラム上からオブエクトを作成してみましょう。
Resourcesフォルダの作成
今回はResources関数で取得して生成する方法を見ていきたいと思います。まずは以下のように、Hierarchyウィンドウ上を右クリック→Create→Folderでフォルダを作成します。
名前はResourcesに変えましょう。
次にそのフォルダの中に、先ほど作ったCubeプレハブを投げ込みましょう。
なぜこのフォルダを作ったかというと、後ほどResourcesフォルダの中のファイルを取得できる「Resources関数」を使用することになるからです。
生成
以下の画像は「空のGameObject」を作成し、同じく新しく作成した「PrefabTestスクリプト」を紐付けたものです。
このPrefabTestスクリプトの中で、Cubeプレハブを使ってCubeオブジェクトを生成する処理を行ってみましょう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PrefabTest : MonoBehaviour { // Use this for initialization void Start () { // CubeプレハブをGameObject型で取得 GameObject obj = (GameObject)Resources.Load ("Cube"); // Cubeプレハブを元に、インスタンスを生成、 Instantiate (obj, new Vector3(0.0f,2.0f,0.0f), Quaternion.identity); } }
このプログラムは非常に簡単です。
①Resources.Load関数で、Resourcesフォルダ内にある「Cubeオブジェクト」を取得。
②そのプレハブを元に、オブジェクトを新規に作成。その時の座標は、元のオブジェクトとかぶらないようにVector3(0.0f,2.0f,0.0f)としている。
やっていることとしてはこれだけです。このプログラムを実行すると以下のようになります。
プログラム上で、オブジェクトを生成できていることが確認できると思います。
オブジェクトの名前に(clone)とついていますが、これはprefabを元に生成されたクローンだからつくものです。名前を変更したい場合は、生成後に名前を変えてしまいましょう!
名前を変えるならInstantiateの戻り値を利用することになりますが、Instantiateについては以下の記事で細かくまとめています。可能なら目を通しておきましょう。
まとめ
今回はprefabについて見てきました。
基本的に投げ込んで作るだけという拍子抜けなぐらい簡単だったと思います。しかし簡単といえど重要な場所なのは間違いありません。
今回覚えたことを活用し、しっかり使いこなせるようになりましょう。