この解説は
Unityのサイトに昔からあるチュートリアルに、以下があります。
「はじめてのUnity」(旧)
http://tutorial.unity3d.jp/archive/my-first-unity/
これを独自にC#化したものをベースとしています。以下を
この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。現時点(20151026)では、新しい「はじめてのUnity」の玉転がしゲームが公開されています。本サイトのブロック崩しと併せて学習すると広がりがあり、初期の学習にはとても有効です。
- [超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(1)ステージ配置
- [超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(2)色を変える
- [超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(3)動くボール
- [[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(4)ラケットを動かす]
(http://qiita.com/JunShimura/items/5fac20966bba6b223427) - [超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(5)消えるブロック
- [超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(6)ブロックを手作業で並べる
ブロックをScriptで配置
ブロックをステージに並べるときに、エディタでDupulicateしながら並べる手法をとりました。この場合、ある程度縦横が揃っていると楽ですが、数が膨大だと不便だったり、少し変えたい場合に方法が見つからないなど、色々と考えさせられる面があります。こうした場合、Scriptによって並べる方法があります。
Prefabを使う
Unityの機能で、Prefab(プレハブ)というのがあります。Adobe製品だと、同様を「シンボル」としている場合が多いです。AssetにPrefabを置いて、それをScriptから生成することでステージに配置します。機能はやってみるとわかるので、先ずはPrefabにします。
BlockをPrefabにする
[Hierarchy]タブから、BlockをAssetにドラッグすると、Blockプレハブが出来上がります。

BlockPrefabを試す
Sceneに在ったブロックを全部消します。そして、AssetからBlockプレハブを[Hierarchy]タブへドラッグします。


そうすると、元あった場所にブロックが現れ、[Hierarchy]タブにも表示されますが、プレハブの場合は青字で表示されます。
また、[Inspector]タブを見ると、Prefabの部分が増えています。

ここの[Select]ボタンを押すと、配置されたGameObjectの元になっているプレハブをAssetから選択した状態になります。
一度、プレイしてプレハブから作られたGameObjectが同じ処理をするか確かめましょう。

同じ動きなのが判りました。
Prefabのメリットを確認する
従来のDuplicateで増やす方法と、この場合、何が違うか確認します。[Asset]タブからBlockプレハブを選択します。その状態で、[Inspector]タブでScale.xをスクラブしてみると、両方の大きさが変化します。

このように、複数の物体などで同じ形や属性を保持する場合、プレハブを用いる事で管理が容易になります。上記の2つのブロックを複製で創っている場合、変形させたいブロックを選択し変形させることになりますが、それぞれを選択しやすい配置や[Hierarchy]タブでの順番にしておかないと、まとめて選択がしにくくなるため、後から面倒になります。
PrefabからBlockのGameObjectを生成する
プレハブのメリットを活かすため、ScriptからGameObjectを生成します。
生成するためのScriptを配置する
ブロックが存在しない状態から、Scriptによってブロックを作り出します。
まず、現在のScene中のブロックを消します。ここで、「何もない」状態になるので、Scriptを呼び出すにはGameObjectが必要になりますが、それが在りません。
Emptyを使う
Sceneに何も持たないGameObjectを配置し、それにScriptコンポーネントを付ける形に作っていきます。
メニューの[GameObject]>[Create Empty]を選択すると、"GameObject"という名前で空のGameObjectがSceneに作られます。

[Inspector]タブを見ると、コンポーネントはTransformのみの状態であることが判ります。
他と区別しやすいように、名前をBlockControlにし、Transform.Positionを原点にします。

Scriptを作る
[Inspector]タブで下に在る[Add Component]ボタンから[New Script]を選んで、Scriptを作ります。

ファイル名をBlockControlにします。[Inspector]タブでScriptコンポーネントが追加されています。

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 () {
}
}
追加部分を説明します。
public GameObject blockPrefab;
このクラスからはblockプレハブはスコープの外に在るので見えません。そのため、外部参照の出来るPublic属性を与えることで、Unityエディタ側の[Inspector]タブで与えることが可能になります。
Instantiate(blockPrefab);
このInstantiate関数を呼ぶと、プレハブが出来上がります。
詳しくは以下を参照して下さい。
[Unity - スクリプトリファレンス:Object.Instantiate]
(http://docs.unity3d.com/ja/current/ScriptReference/Object.Instantiate.html)
このままの状態では、プレハブが何なのかScriptから分からないので、Unityエディタから[Inspector]タブでBlock Prefabの横のボタンを押して、Blockプレハブを選択します。

実行して、ブロックが生成されるかを確かめましょう、Sceneから消していたblockが現れます。現れる座標は、プレハブにしているBlockのTransformそのままになります。
実際にはこれを一回、呼び出すだけでは無駄があるので、Scriptを繰り返し実行するようにします。
次に続きます。
PrefabとInstantiateの基本(2)効率的にBlockを並べる:「はじめてのUnity」のブロック崩しを改造しながら学ぶ
まとめ
- 動的に配置したい
GameObjectはPrefabにしてInstantiate関数で配置する



