このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。
一分間Unity講座のまとめはこちらから。
前回までUIの活用方法についての記事が続きましたが、今回からプレハブの作成について数回にわたり記事を書いていきたいと思います。
下の動画は「ファイブボックス 一分間Unity講座 ランダムな座標へプレハブ生成」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。
Prefabの準備
Unityのプレハブ(Prefab)は、再利用可能なオブジェクトのテンプレートです。プレハブを作成すると、そのオブジェクトの設定や構成を保存して、他のシーンやプロジェクト内で簡単に複製できます。
例えば、キャラクターやアイテム、その他オブジェクトなどのプレハブを作成すると、各シーンで一貫した外観と動作を維持できます。また、プレハブを更新すると、シーン内のすべてのインスタンスにその変更が適用されるため、作業効率も向上します。
簡単に言えば、プレハブは「統一されたオブジェクトをどこでも使えるようにするための便利なツール」というわけですね。スクラッチのクローンとよく似ています。
まずは簡単なプレハブを1つ用意します。
ヒエラルキー上で右クリック、または左上の+ボタンから 3DObject ⇒ Cube を選択し、Cubeを作成します。
※サンプルではCubeを作りましたが、SphereでもCapsuleでも構いません。
作成したCubeの大きさを、x,y,z 全て0.5程度にしておきます。
また、任意の色のMaterialを用意しておき、Cubeにドラッグ&ドロップして色を付けておきます。Material は Assets 内で右クリック、Create ⇒ Material を選択し作成します。
作成した素材をプレハブにするには、Asset内の任意の場所にドラッグ&ドロップするだけです。
ヒエラルキー上のオブジェクトのアイコンの色が水色に変わると思います。
これは不要なので削除しておきましょう。
Instanceの生成
Prefabをもとに生成されたオブジェクトを「Instance(インスタンス)」と呼びます。
ここでは1秒間に1個の割合で、ランダムな場所に上で作成したCubeプレハブのインスタンスを作成します。
任意のスクリプトファイルを作成し、MainCameraにアタッチします。サンプルでは「PrefabMaker」というスクリプトファイル名にしました。
ここで使用する変数は以下の2つです
- cubePrefab – 作成したGameObject型のCubeのプレハブ、[SerializeField]を指定
- timer – 経過時間を管理する float型の変数
[SerializeField] GameObject cubePrefab; //cubeのプレハブ
float timer; //経過時間を管理する変数
Update関数内で行うことは次の2つです
- 変数:timer に時間を加算
- 1秒経過したら cubePrefab のインスタンスを生成し、timerをリセット
void Update()
{
timer += Time.deltaTime; //timerに経過時間を加算
if (timer > 1.0f) //timerが1秒を超えたら
{
//Vector3型の変数:pos を宣言、半径5の球体内のランダムな場所を指定
Vector3 pos = Random.insideUnitSphere * 5.0f;
//cubePrefabをposの座標に、回転無しで生成
Instantiate(cubePrefab, pos, Quaternion.identity);
timer = 0; //timerを0リセット
}
}
■ Instantiate()
Instantiate( 何を )
Instantiate( 何を , どこに, 向き)
PrefabからInstanceを生成する際には、Instanteate()メソッド
を使用します。Instantiate()メソッド内には引数を1つ、もしくは3つ指定することができます。
引数が1つの時は生成する元となるプレハブのオブジェクトを指定します。
引数が3つの時は、第一引数に生成する元となるプレハブオブジェクト、第二引数に生成する場所(Position)、第三引数に生成するオブジェクトの向き(Rotation)をそれぞれ指定します。向きに指定するQuaternion.identity
とは回転しない、つまり元のオブジェクトの向きをそのまま使用する、ということになります。
■ Random.insideUnitSphere
UnityのRandomクラス
にはランダムな値を生成するための様々なプロパティが用意されています。Random.insideUnitSphere
は、中心が Vector3(0, 0, 0)
で半径が1の球体内のランダムな点を返します。
Random.insideUnitSphere * 5.0f
と指定すると、ランダムな位置ベクトルが5倍され、中心が Vector3(0, 0, 0) で半径5の球体内のいずれかの場所が取得できます。
スクリプトファイルが完成したら、MainCameraにアタッチしたスクリプトファイル、変数:cubePrefab を[SerializeField]
で指定しているので、inspector からオブジェクトを指定できる状態になっているはずです。作成済みの CubeのプレハブをAssignして、起動してみましょう。
1秒間に1個ずつ、オブジェクトが生成さるようになったと思います。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。