オブジェクトの複製方法 プレハブについて


オブジェクトの複製 プレハブについて


この記事ではオブジェクトを複製する方法を記載します。
ゲームで複製する必要のあるオブジェクトといえばシューティングゲームの弾や敵キャラクターなどですかね。

Unityでは複製する必要のあるオブジェクトをプレハブという形で管理します。




マウスをクリックするとブロックが落下してきます。

準備


早速作って行きましょう。
まず、準備として落下してくるブロックを受け止めるCubeを作って拡大して床にして、
そのままでは暗いのでDirectionalLightを設置しておきましょう。

MainCameraの位置を床が見える位置に移動させて準備は完了です。

だいたいこんな感じ↓でオッケーです。
prefab1.jpg


プレハブの作成


次は複製するブロックを作ってプレハブにする作業です。

まず普通通りにGameObject→Cubeでブロックを作成します。
prefab2.jpg

今回は落下するブロックを生成するのでRigidbodyコンポーネントをCubeに設定してあげましょう。
prefab3.jpg


そして作成したCubeをプレハブにしてあげましょう。
プレハブの作成は作成したCubeをHierarchyパネルからProjectパネルにドラッグドロップしてください。
これだけでプレハブの作成は完了です。
prefab4.jpg

追記:
当記事で説明に使っている画像はUnity3.5のものです。
最新版のUnity4ではProjectパネルは以下の様に変更されました。
Unity4Alert.jpg
HierarchyパネルのオブジェクトをプレハブにするにはHierarchyパネルからフォルダの中身の部分までドラッグドロップしてください。



ProjectパネルにCubeという名前のプレハブが作成されました。
このプレハブをHierarchyパネルかSceneパネルにドラッグドロップするだけでプレハブと同じオブジェクトが複製されます。
prefab5.jpg


またプレハブのデータをいじると同じプレハブを元に複製したデータ全てに反映されます。
試しにプレハブに赤い色のMaterialを適用してみましょう。
すると先ほどプレハブから複製したオブエジェクト全ての色が変わったと思います。
prefab6.jpg

(ちなみにプレハブに保存されている全ての値が複製したオブジェクトに適用されるわけではありません。例えはTransformのPosition,Rotationなどの値は変更しても複製したオブジェクトには反映されません。これはマテリアルなどのデータはクラスに格納されていて、座標データなどの値は構造体に格納されているためなのですが説明が長くなるのでここでは割愛します。ゆくゆくの記事で解説をしていきます)


空のゲームオブジェクトの作成


空のゲームオブジェクトを作ります。
このゲームオブジェクトでマウスクリックを検知してブロックを発生させ、ブロックの発生する座標を決定します。

空のゲームオブジェクをつくるにはメニューよりGameObject->CreateEmptyを選択します。
GameObjectという名前のオブジェクトが作られると思いますので、名前をBlockSpawnという名前に変更しましょう。
prefab7.jpg
BlockSpawnを板の上の良い感じの場所に移動しておきましょう。

空のゲームオブジェクトの問題点としてSceneパネル上で見た時にどこに存在しているのかがよく分から無いという点があります。そこでアイコンを設定すると見やすくなります。
先ほど作成したBlockSpawnを選択しInspectorパネルの左上の立方体をクリックしましょう。するとSelectIconのポップアップが表示されますので、好きなIconを選択しましょう。
するとSceneパネル上でBlockSpawnのある位置に選択したIconが表示されます。
prefab8.jpg
このIconはSceneパネルのみで有効ですのでゲームを実行した際には表示されません、あくまで編集時に見やすくするアイコンだと思ってください。


マウスクリックで複製するスクリプトの作成


マウスクリックのタイミングでブロックを複製するスクリプトを作成します。

Projectパネルを右クリックしてJavaScriptを作成して、BlockSpawnという名前にしましょう。
prefab9.jpg

BlockSpawnをダブルクリックして編集しましょう。
スクリプトの中身は以下のようになります。

#pragma strict

var blockPrefab:GameObject;

function Start () {
}

function Update () {

if (Input.GetMouseButtonDown(0)) {
Instantiate(blockPrefab, transform.position, transform.rotation);
}
}


内容を解説しますとUpdateの中の一行目
if (Input.GetMouseButtonDown(0)) {

では左クリックが押された瞬間を検出します。

Instantiate(blockPrefab, transform.position, transform.rotation);

Instantiate()という関数はプレハブを複製するための命令です。
それぞれの引数は
 第一引数が複製するプレハブ
 第二引数が複製する座標
 第三引数が複製する角度
になっています。

blockPrefabの内容が設定されてないんじゃないかと思う方もいらっしゃるかと思いますが、そのとおりです。
追って説明するので待っていてくださいね。

次は、作成したスクリプトBlockSpawnを先ほど作成したゲームオブジェクトBlockSpawnに設定します。
ProjectパネルのBlockSpawnをHierarchyパネルのBlockSpawnにドラックドロップしてください。
prefab10.jpg
これでスクリプトが設定されました。

次にHierarchyパネルのBlockSpawnを選択してください。
すると先ほどのblockPrefabの変数が表示されていますね!
prefab11.jpg
そうUnity上で先ほど作成したスクリプトの変数の内容を設定すればいいのです!

ProjectパネルにあるCubeプレハブをドラッグしてBlockSpawnゲームオブジェクトの変数BlockPerfabへドロップしてください。
prefab12.jpg
これでBlockSpawnスクリプト内のBlockPrefab変数が設定できました。

完成


ここまでの操作が上手くできていれば完成です!再生してみましょう!

prefab13.jpg

マウス左クリックで赤いキューブが複製されるようになっていましたら完成です!

以上です。

<<他の記事を読む

[スポンサードリンク]


このエントリーをはてなブックマークに追加
posted by Unity3d at 2012年11月10日14:30 | Comment(4) | スクリプト | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
助かったぜ
Posted by at 2014年08月27日 18:10
このブロックは真上から落ちているはずなのになぜ崩れるのですか?
Posted by b at 2015年08月02日 21:06
そのままコードをコピーしたのですが、All compiler errors have to fixed before you can enter playmodeのエラー出た。

コードは今時のバージョンではだめなのかな?それともコードのエラーですか?
Posted by lily at 2016年08月24日 12:59
分かりやすくて助かります
Posted by at 2016年11月06日 16:39
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。