江上宿六です。
前回は結局Prefabを作れなかったという情けない感じでしたけども今回こそです。
では早速作りましょう。 実はPrefabを作るのは簡単で、オブジェクトを
ヒエラルキーからプロジェクトビューにドラッグするだけです。
→
こんな感じでプロジェクトビューに追加されました、これがPrefabです。
名前がこのままだと何かアレといいますか微妙なのでSphereGeneratorにします。
名前変更と同時にヒエラルキーのSphereも名前が変わりました。 この2つは
連動したオブジェクトだということですね。 ですがこのヒエラルキーの方の
SphereGenerator(改名後)は要らないのでDeleteしてしまってください。
さて、ではいかにしてこのSphereGeneratorを使うかです。 ここでもまた
スクリプトの出番となります。 C#Scriptを追加し、こちらもSphereGeneratorと
名付けます。 ちょっと融通が利いてない感じでアレですが、記述します。
6行目でGameObject型のspherePrefabをpublicで宣言しています、これは
後ほど説明するので今はスルーします。 Update内ではキー入力を取得してます。
見ての通り左クリックをすると中が実行されるようになっています。
その中身が大切なんですね。 まずGameObjectのsphereを宣言し、それに
Instantiate(spherePrefab)を代入しています。 これはspherePrefabを複製した
ようなものをsphereに代入して、シーンに生成しているというわけなんです。
謎の学校例えをしてみますが、
・テストの問題を作る←オブジェクトを作る
・それを印刷できる状態にする←Prefabにする
・印刷する←Prefabを指定してInstantiateする
伝わったかどうかはアレですけど、Prefabというのはオブジェクトの設計図で
その設計図を元にオブジェクトを生成するのがInstantiateという事です。
as GameObjectというのはキャストです。 Instantiateで得られるのは確か
Object型なので、強制的にGameObject型にしています。 問題は無いようです。
その後のsphere.transform.positionは、その生成されたオブジェクトの位置を
(0,5,0)に設定しています。
それではCreateEmptyでヒエラルキーに空のオブジェクトを追加し、
スクリプトをアタッチしたら実行して画面をクリックしてみましょう。
はい、何も起きませんというか、何かエラーっぽいのが出ます。 ここで実行して
完成という下書きを書いてしまったため、戒めの為にこんな書き方にしました。
本当に大事な事を忘れていました。
えー、それではスクリプトがアタッチされた空のオブジェクトを選択して
インスペクターを見てみましょう。
なんの変哲も無い、と思いきやなんか今までのとは雰囲気が違います。
Cubeをいじってた時にはなかったSpherePrefabという項目が増えています。
これは何かというと、SphereGeneratorの中身を振り返ってみましょう。
publicでsphereGeneratorというGameObjectを宣言しています。
このようにpublicで宣言を行う事で、インスペクターに表示されるようになり、
外部から数値を変更出来たり、オブジェクトを渡す事が出来るようになるのです。
これをアウトレット接続といいます。
じゃあ何を接続するかですが、変数名などからなんとなく分かると思います。
Prefabです、SphereGeneratorです。 アタッチするのと同様にPrefabを
インスペクターのSpherePrefabの所にドラッグ&ドロップしてやります。
↓
接続するとこんな感じになります。 では実行してクリックしてみましょう。
クリックしたらした分だけ指定の場所(0,5,0)にSphereが生成され、それぞれ
下に落ち、消えていくと思います。 連打しすぎるとSphere同士がぶつかって
変な挙動をするかもしれませんが、そこは単に愛嬌です。
このようにPrefabを作る事によって同じようなオブジェクトを大量に生成したり
色々な事が出来るわけなんです。 次回はPrefabを使って時限でオブジェクトを
生成したり、そういう事をやると思います。