この解説は
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)ラケットを動かす
- [超初心者向け]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
プレハブが出来上がります。
Block
Prefabを試す
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
このままの状態では、プレハブが何なのかScriptから分からないので、Unityエディタから[Inspector]タブでBlock Prefab
の横のボタンを押して、Block
プレハブを選択します。
実行して、ブロックが生成されるかを確かめましょう、Scene
から消していたblock
が現れます。現れる座標は、プレハブにしているBlock
のTransform
そのままになります。
実際にはこれを一回、呼び出すだけでは無駄があるので、Scriptを繰り返し実行するようにします。
次に続きます。
PrefabとInstantiateの基本(2)効率的にBlockを並べる:「はじめてのUnity」のブロック崩しを改造しながら学ぶ
まとめ
- 動的に配置したい
GameObject
はPrefabにしてInstantiate
関数で配置する