ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Unity】Prefabsにあるオブジェクトをスクリプトから生成する方法

 Oculus Goのアプリを作りたくてUnityをいじっています。
 数年前に一度やってはいたのですが、やり方を思い出すので時間がかかったので備忘録として記録しておきます。

1:Resourcesフォルダ内にPrefabsフォルダを作成する
 前提条件としてAssetsフォルダ配下に「Resources」フォルダを作成し「Prefabs」フォルダを作成します。
f:id:rikoubou:20180607225325p:plain

 この「Resources」フォルダは「Resources.Load({パス})」という記述で配下にあるファイルを読むことができます。
 それを利用してその中に「Prefabs」フォルダを作成することにより、Prefabsに登録されたオブジェクトを生成します。


2:Prefabsにあるオブジェクトを生成するプログラム
 結論からいうと以下の関数でできます。

/// <summary>
/// プレハブを作成する(pos, Quaternion有)
/// </summary>
/// <returns>GameObject</returns>
/// <param name="path">プレハブのパス</param>
/// <param name="pos">Position.</param>
/// <param name="q">Quaternion.</param>
public GameObject createPrefab(string path, Vector3 pos, Quaternion q) {
	GameObject prefabObj = (GameObject)Resources.Load (path);
	GameObject prefab = (GameObject)Instantiate (prefabObj, pos, q);
	return prefab;
}

 上記の関数は以下のように使います。

// 対象のプレハブのパス
string prefabsPath= "Prefabs/PrefabsObj";

// 表示座標
Vector3 pos = new Vector3(1f, 1f, 1f); 

// スケール
Vector3 scale = new Vector3 (0.5f, 0.5f, 0.5f);

// プレハブオブジェクトを作成
GameObject obj = createPrefab(prefabsPath, pos, this.gameObject.transform.rotation);
obj.transform.localScale = scale;

 このような記述をEmptyのオブジェクトなどにアタッチさせておくことで生成することができます。


3:使い方例
 例として以下のように角度をつけて大きさをデフォルトの2倍にした「CubeA」を「Resource」配下の「Prefabs」に登録しました。
f:id:rikoubou:20180607225919p:plain
 
 「Scripts」フォルダを作成してその中に「CreatePrefabs」スクリプトを作成します。スクリプトの中身は以下のようにします。

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

public class CreatePrefabs : MonoBehaviour {

	// Use this for initialization
	void Start () {
		string prefabsPath = "Prefabs/CubeA";
		Vector3 pos = new Vector3 (6f, 0f, 0f);
		Vector3 scale = new Vector3 (0.5f, 0.5f, 0.5f);
		GameObject obj = createPrefab(prefabsPath, pos, this.gameObject.transform.rotation);
		obj.transform.localScale = scale;
	}

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

	}

	/// <summary>
	/// プレハブを作成する(pos, Quaternion有)
	/// </summary>
	/// <returns>GameObject</returns>
	/// <param name="path">プレハブのパス</param>
	/// <param name="pos">Position.</param>
	/// <param name="q">Quaternion.</param>
	public GameObject createPrefab(string path, Vector3 pos, Quaternion q) {
		GameObject prefabObj = (GameObject)Resources.Load (path);
		GameObject prefab = (GameObject)Instantiate (prefabObj, pos, q);
		return prefab;
	}
}

 次に空のGameObjectを作成して名前を「CreatePrefabs」に変更したものに「CreatePrefabs」スクリプトをドラッグ&ドロップでアタッチします。この時の空のGameObjectの座標は「全て0」にしておくと色々楽です。
f:id:rikoubou:20180607230731p:plain
f:id:rikoubou:20180607230911p:plain

 この状態で実行すると、スクリプトで指定した位置と大きさでCubeAが作成されます。
f:id:rikoubou:20180607231336p:plain


・参考資料