【初心者Unity】Instantiateを具体例付きで解説
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
Instantiate()とは
Instatiate()の「Instantiate」とは日本語に翻訳すると「インスタンス化」という意味です。インスタンス化とは「実体化」と訳されることもあるように、要するにこのメソッドを使うと、ゲームプレイ中に新たなオブジェクトを出現させることができます。
新たにオブジェクトを出現させていったいどうするのか。。。
例えば、画面をタップするとキャラクターが手裏剣を投げたり、キャラクターが通過すると床から針が飛び出してきたりといった、何かしらのイベントをトリガーとして出てくるギミックを出現させることができるのです。
インスタンス化とは(ちょいむず・飛ばしておっけー)
インスタンス化とは、設計図(クラス)を基に実体(インスタンス)を生成することです。Unityにおいていえば、「x軸方向に一定速度で走る」というスクリプト(設計図・クラス)をオブジェクト(CubeやSphere)にアタッチする(貼り付ける)ことで、そのオブジェクトは「x軸方向に一定速度で走るオブジェクト」としてインスタンス化されます。
実際に使ってみる
まあ中々イメージはしにくいと思うので、実際にスクリプトを書いて解説していきます。
まず今回の例では登場人物が2人います。1人目は生成される基になるオブジェクトです。2人目は1人目を基に生成されるオブジェクトです。要するに、あるイベントをトリガーにして基にされるオブジェクトのクローンがパッと生成されるスクリプトを書くというわけです。今回はstartメソッドに記述することで、トリガーを「ゲームが始まったこと」にしましょう(つまりプレイヤーからすると実質最初からクローンが存在していることになる)。
1人目のオブジェクトはもう何でもいいです。CubeでもSphereでもお好きなのにしちゃってください。今回私の方では「CubeOriginal」と名付けたCubeにしておきます。こちらのオブジェクトはクローンの基になるというだけで、特にこれ以上いじる必要はありません。今回は生成しておしまいです。
次に2人目のオブジェクトですが、こちらが若干ややこしいです。通常のオブジェクトではなく、「空(から)のオブジェクト」を生成します。生成の仕方は、「Hierarchyタブ」→右クリック→「Create Empty」で生成することができます。こちらの2人目ですが、「空のオブジェクト」というだけあって、コンポーネントはTransformのみ、Scene View、Game View共に実体が映らない、要するに実体のない、まるで幽霊の様なオブジェクトとなっています。
このオブジェクトに「CubeOriginalを基に実体化する!」というスクリプトをアタッチすることで、ゲーム開始時にこの空のオブジェクトは「CubeOriginal」のクローンとして実体化することができます。
以下のスクリプトにおいては6行目に記述されています。
2行目で基となるゲームオブジェクトを「target」として指定しています。そして6行目の第1引数で「target」を基にオブジェクトをインスタンス化しています。このInstantiateメソッドがstartメソッド内に記述してあることでゲーム開始をトリガーにしてクローンがインスタンス化されます。
また、Instantiateメソッドでは、第2、第3引数でクローンのTransformの初期値を指定することができます。第2引数ではVector3型でPositionを、第3引数ではQuaternion型でRotationをそれぞれ指定することができます。今回は第2引数を「Vector3(-1.5f, 0.7f, 0.0f)」としており、xの値のみ基のインスタンスからずらすことで、クローンの位置を基のオブジェクトのすぐ横に指定しています。また、第3引数を「Quaternion.identity」としており、基のオブジェクトと同様に無回転であることを指定しています。
//取得したオブジェクトを格納する変数を定義 public GameObject target; void Start() { //オブジェクト「target」を基にクローンを生成する(TransformのPositionとRotationも指定) Instantiate(target, new Vector3(-1.5f, 0.7f, 0.0f), Quaternion.identity); }
スクリプト完成後は必ず「空のオブジェクト」にアタッチしてください。
これで完成!かと思いきや、このままでは動きません。
最後に、「空のオブジェクト」のInspectorにあるtargetにCubeOriginalを適用して完成です。
これを
こう
上記全てが完成し、再生すると以下の様になります。
ゲーム開始前
ゲーム開始後
おまけ
因みに、今回のスクリプトでは、変数targetの修飾子をpublicとしたことで、変数の値をInspector上で操作する必要がありました。しかし変数の値をスクリプトで完結させることもできます。そこで使うのが前回の記事で書かせていただいた「GameObject.Find()」です。
以下のスクリプトにおいては7行目に記述されています。
まず2行目の変数宣言ですが、先ほどまでの例では修飾子がpublicであったのに対し、今回は記述していません。これはtargetの値はスクリプト上で完結し、Inspector上で操作する必要がなくなったからです。その代わりにFindメソッドでtargetの値を指定しています。また、FindメソッドをStartメソッドではなくAwakeメソッド内に入れている理由としてはStartメソッドでクローンが生成される前に、基となるオブジェクトを指定する必要があるためです。AwakeメソッドはStartメソッドより早く呼び出されます。
//取得したオブジェクトを格納する変数を定義 public GameObject target; //Startメソッドより早く呼び出されるAwakeメソッド private void Awake() { //targetの値をFindメソッドによって取得している target = GameObject.Find("CubeOriginal"); } void Start() { //オブジェクト「target」を基にクローンを生成する(TransformのPositionとRotationも指定) Instantiate(target, new Vector3(-1.5f, 0.7f, 0.0f), Quaternion.identity); }