PrefabとInstantiateの基本（1）ブロックをScriptで配置：「はじめてのUnity」のブロック崩しを改造しながら学ぶ

#この解説は
Unityのサイトに昔からあるチュートリアルに、以下があります。
[「はじめてのUnity」(旧）
http://tutorial.unity3d.jp/archive/my-first-unity/](http://tutorial.unity3d.jp/archive/my-first-unity/)
これを独自にC#化したものをベースとしています。以下を
この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。現時点(20151026)では、[新しい「はじめてのUnity」の玉転がしゲーム](https://github.com/unity3d-jp/FirstTutorial/wiki)が公開されています。本サイトのブロック崩しと併せて学習すると広がりがあり、初期の学習にはとても有効です。


* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(1)ステージ配置](http://qiita.com/JunShimura/items/cbb0db8087a5cc75735e)
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(2)色を変える](http://qiita.com/JunShimura/items/1b2b4842e983022075de )
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(3)動くボール](http://qiita.com/JunShimura/items/dfb2bdbbc328869f62ec )
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(4)ラケットを動かす]
(http://qiita.com/JunShimura/items/5fac20966bba6b223427)
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(5)消えるブロック](http://qiita.com/JunShimura/items/867179092a2a564bc88c)
* [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(6)ブロックを手作業で並べる](http://qiita.com/JunShimura/items/1f39e52414171c67bc71)

#ブロックをScriptで配置
ブロックをステージに並べるときに、エディタでDupulicateしながら並べる手法をとりました。この場合、ある程度縦横が揃っていると楽ですが、数が膨大だと不便だったり、少し変えたい場合に方法が見つからないなど、色々と考えさせられる面があります。こうした場合、Scriptによって並べる方法があります。

##Prefabを使う
Unityの機能で、Prefab（プレハブ）というのがあります。Adobe製品だと、同様を「シンボル」としている場合が多いです。AssetにPrefabを置いて、それをScriptから生成することでステージに配置します。機能はやってみるとわかるので、先ずはPrefabにします。
###`Block`をPrefabにする
[Hierarchy]タブから、`Block`をAssetにドラッグすると、`Block`プレハブが出来上がります。
[![Gyazo](https://i.gyazo.com/a415a4e8852aca2503ca46f552491451.gif)](https://gyazo.com/a415a4e8852aca2503ca46f552491451)

[![Gyazo](https://i.gyazo.com/c7f2bced66b920b0dc1941c1cd70efca.png)](https://gyazo.com/c7f2bced66b920b0dc1941c1cd70efca)

###`Block`Prefabを試す
`Scene`に在ったブロックを全部消します。そして、Assetから`Block`プレハブを[Hierarchy]タブへドラッグします。
[![Gyazo](https://i.gyazo.com/013c6b25dfdf01dc58a1c4d20ae0788e.gif)](https://gyazo.com/013c6b25dfdf01dc58a1c4d20ae0788e)

[![Gyazo](https://i.gyazo.com/5b7850919c4d22d815a2dc5b3b1361e3.png)](https://gyazo.com/5b7850919c4d22d815a2dc5b3b1361e3)
そうすると、元あった場所にブロックが現れ、[Hierarchy]タブにも表示されますが、プレハブの場合は青字で表示されます。

また、[Inspector]タブを見ると、Prefabの部分が増えています。
[![Gyazo](https://i.gyazo.com/da009f25e2aa74d59a4ae2653e02e0f3.png)](https://gyazo.com/da009f25e2aa74d59a4ae2653e02e0f3)

ここの[Select]ボタンを押すと、配置された`GameObject`の元になっているプレハブをAssetから選択した状態になります。

もう一つ、ドラッグして配置しましょう。
[![Gyazo](https://i.gyazo.com/65fdd9b3524809eb5c4faf8dd443894f.png)](https://gyazo.com/65fdd9b3524809eb5c4faf8dd443894f)

座標を以下に設定します。
[![Gyazo](https://i.gyazo.com/769693f28ab31da140f057cdd9c49ea3.png)](https://gyazo.com/769693f28ab31da140f057cdd9c49ea3)

一度、プレイしてプレハブから作られた`GameObject`が同じ処理をするか確かめましょう。
[![Gyazo](https://i.gyazo.com/1a02f6e038019149c38ce0b06732770a.gif)](https://gyazo.com/1a02f6e038019149c38ce0b06732770a)

同じ動きなのが判りました。

###Prefabのメリットを確認する
従来のDuplicateで増やす方法と、この場合、何が違うか確認します。[Asset]タブから`Block`プレハブを選択します。その状態で、[Inspector]タブで`Scale.x`をスクラブしてみると、両方の大きさが変化します。
[![Gyazo](https://i.gyazo.com/6431ef923a75b08a103af0a61a9a1c9f.gif)](https://gyazo.com/6431ef923a75b08a103af0a61a9a1c9f)

このように、複数の物体などで同じ形や属性を保持する場合、プレハブを用いる事で管理が容易になります。上記の2つのブロックを複製で創っている場合、変形させたいブロックを選択し変形させることになりますが、それぞれを選択しやすい配置や[Hierarchy]タブでの順番にしておかないと、まとめて選択がしにくくなるため、後から面倒になります。

##Prefabから`Block`の`GameObject`を生成する
プレハブのメリットを活かすため、Scriptから`GameObject`を生成します。
###生成するためのScriptを配置する
ブロックが存在しない状態から、Scriptによってブロックを作り出します。
まず、現在の`Scene`中のブロックを消します。ここで、「何もない」状態になるので、Scriptを呼び出すには`GameObject`が必要になりますが、それが在りません。
####Emptyを使う
`Scene`に何も持たない`GameObject`を配置し、それにScriptコンポーネントを付ける形に作っていきます。
メニューの[GameObject]>[Create Empty]を選択すると、"GameObject"という名前で空の`GameObject`が`Scene`に作られます。
[![Gyazo](https://i.gyazo.com/8a10d2ec8189bf9b2b8a6d4c5fa848cd.gif)](https://gyazo.com/8a10d2ec8189bf9b2b8a6d4c5fa848cd)

[Inspector]タブを見ると、コンポーネントは`Transform`のみの状態であることが判ります。
他と区別しやすいように、名前を`BlockControl`にし、`Transform.Position`を原点にします。
[![Gyazo](https://i.gyazo.com/c8cc64e0188aadf9ddd3c675292b7a77.png)](https://gyazo.com/c8cc64e0188aadf9ddd3c675292b7a77)

####Scriptを作る
[Inspector]タブで下に在る[Add Component]ボタンから[New Script]を選んで、Scriptを作ります。
[![Gyazo](https://i.gyazo.com/49a56c552e42e22bce72fa21f33373be.gif)](https://gyazo.com/49a56c552e42e22bce72fa21f33373be)

ファイル名を`BlockControl`にします。[Inspector]タブでScriptコンポーネントが追加されています。
[![Gyazo](https://i.gyazo.com/043972a4b19d57f5f739a73e2a138d11.png)](https://gyazo.com/043972a4b19d57f5f739a73e2a138d11)

[Asset]タブでも追加されているのを確認して下さい。
[![Gyazo](https://i.gyazo.com/1d1dec3d3abd456131f40afa61e6cc30.png)](https://gyazo.com/1d1dec3d3abd456131f40afa61e6cc30)

`BlockControl.cs`をダブルクリックして、中身を編集し、保存します。

```csharp:BlockControl.cs
using UnityEngine;
using System.Collections;

public class BlockControl : MonoBehaviour {

    public GameObject blockPrefab;
    
    // Use this for initialization
	void Start () {
        Instantiate(blockPrefab);
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}
```

追加部分を説明します。

```csharp:BlockControl.cs（抜粋)
    public GameObject blockPrefab;
```
このクラスからは`block`プレハブはスコープの外に在るので見えません。そのため、外部参照の出来る`Public`属性を与えることで、Unityエディタ側の[Inspector]タブで与えることが可能になります。

```csharp:BlockControl.cs（抜粋)
        Instantiate(blockPrefab);
```
この`Instantiate`関数を呼ぶと、プレハブが出来上がります。
詳しくは以下を参照して下さい。
[Unity - スクリプトリファレンス：Object.Instantiate]
(http://docs.unity3d.com/ja/current/ScriptReference/Object.Instantiate.html)

このままの状態では、プレハブが何なのかScriptから分からないので、Unityエディタから[Inspector]タブで`Block Prefab`の横のボタンを押して、`Block`プレハブを選択します。
[![Gyazo](https://i.gyazo.com/1129e23209f5d2cdea691cc348b9a123.gif)](https://gyazo.com/1129e23209f5d2cdea691cc348b9a123)

実行して、ブロックが生成されるかを確かめましょう、`Scene`から消していた`block`が現れます。現れる座標は、プレハブにしている`Block`の`Transform`そのままになります。

実際にはこれを一回、呼び出すだけでは無駄があるので、Scriptを繰り返し実行するようにします。
次に続きます。
[PrefabとInstantiateの基本（2）効率的にBlockを並べる：「はじめてのUnity」のブロック崩しを改造しながら学ぶ](http://qiita.com/JunShimura/items/268d5a6ccce303999da8)

***
#まとめ
* 動的に配置したい`GameObject`はPrefabにして`Instantiate`関数で配置する