サンプル

完成品

 適当な位置を基点にPrefab化したオブジェクトを大量生産させています。

Unity Web Player

« created with Unity »

Prefab作成

 メニュー GameObject > Create Other > 作成したいオブジェクト
 今回はCubeを作成。
 HierarchyからAssetsへドラッグ&ドロップ。

 下のようにAssetsに追加されます。

 以上でオブジェクトのPrefab化終了。
 Hierarchy 上の Cube は用済みなので削除。

 寂しいので Rigidbody を追加しました。パラメータはデフォルトのままです。落下します。

スクリプトからの利用 前準備

 スクリプトは GameObject に Component として追加しないと利用できない模様。
 先に作成した Prefab を生成する際の基準位置とスクリプトの母体として利用するオブジェクトを作成する。
 メニュー GameObject > Create Empty


 位置情報しか持たないGameObjectというのが作られる。
 このPosition座標がオブジェクトが生成される際の基準位置となる。

 適当な命名と基準にしたい座標のセットをしておく。今回は原点とした。

スクリプトの作成と適用

スクリプト作成

 メニュー Assets > Create > JavaScript でスクリプトファイルを新規作成、今回はMakeCubeと命名。
 Assetsで右クリック > Create > JavaScript の方が早かった。

スクリプト適用

 Hierarchy から MotherCube を選択。
1.メニュー Component > Scripts > MakeCube を選択。
2.Inspectorウィンドウ Add Component > Scripts > MakeCube を選択。
3.Assets から MakeCube を Hierarchy の MotherCube へドロップ。
4.Assets から MakeCube を Inspectorウィンドウへドロップ。
 一番簡単な方法で。

 MakeCube を MotherCube へ適用。

スクリプト記述

 Assets MakeCube をダブルクリックでEditor起動。

Prefabをスクリプトで利用できるようにする

 ソース記述。
#pragma strict

var cubeChild:GameObject;

function Start () {
...
 function Start(){ の前に変数の初期化を書く。
 左辺に変数名、: で区切って右辺に GameObject と記述。
 一度Unityに戻って、MotherCube を選択、Inspector の歯車 > Reset、Resetを押さなくても更新される場合あり。

正式な方法は知りません。偶然発見したのでこれを使っています。スクリプトにエラーがあると更新されません。


 Script の下に CubeChild None(GameObject)◎ 行が出現。
 先頭の小文字が大文字になっているけど問題ない。
 現在は GameObject が選択されていない状態。
 ◎をクリックして Assets から Cube をダブルクリック(またはシングルクリック&×)で選択。

 CubeChild Cube◎ となる。これでスクリプト内の cubeChile へ Cube の代入完了。

スクリプト

#pragma strict

var cubeChild:GameObject;
var timing:float;

function Start () {
  timing = 0.0;
}
function Update () {
  timing += Time.deltaTime;
  if (timing >= 0.01){
    var clone = Instantiate(
      cubeChild,
      transform.TransformPoint(Random.insideUnitSphere * 5),
      transform.rotation
    );
    Destroy(clone, 3);
    timing = 0.0;
  }
}
 PCスペックが異なると処理のタイミングがずれるらしいので Time.deltTime を使いタイミング調整。
 この方法ではずれがあるけれど精度重視ではないので無視。
 Instantiate()で Cube Prefab を追加。

 Destroy で壊さないと無限に増えてしまいます。