22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-09

#この解説は
Unityのサイトに昔からあるチュートリアルに、以下があります。
「はじめてのUnity」(旧)
http://tutorial.unity3d.jp/archive/my-first-unity/

これを独自にC#化したものをベースとしています。以下を
この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。現時点(20151026)では、新しい「はじめてのUnity」の玉転がしゲームが公開されています。本サイトのブロック崩しと併せて学習すると広がりがあり、初期の学習にはとても有効です。

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

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

Gyazo

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

Gyazo
そうすると、元あった場所にブロックが現れ、[Hierarchy]タブにも表示されますが、プレハブの場合は青字で表示されます。

また、[Inspector]タブを見ると、Prefabの部分が増えています。
Gyazo

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

もう一つ、ドラッグして配置しましょう。
Gyazo

座標を以下に設定します。
Gyazo

一度、プレイしてプレハブから作られたGameObjectが同じ処理をするか確かめましょう。
Gyazo

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

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

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

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

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

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

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

[Asset]タブでも追加されているのを確認して下さい。
Gyazo

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

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 () {
	
	}
}

追加部分を説明します。

BlockControl.cs(抜粋)
    public GameObject blockPrefab;

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

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

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

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


#まとめ

  • 動的に配置したいGameObjectはPrefabにしてInstantiate関数で配置する
22
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?