i-school - Instantiate(インスタンシエイト) メソッドを使ったメソッドの解説
 Instantiate(インスタンシエイト) メソッドは、たくさん利用する機会の多い処理です。
引数のオーバーロード機能もあるため、利用する際には、しっかりと機能を理解した上で活用していく必要があります。

参考サイト
Unity スクリプト・リファレンス
Object.Instantiate



メソッドの見分け方


 プログラム内においてですが、最初の文字が大文字で、最後に () がつくものはメソッドと呼ばれる、
特定の処理を、機能としてまとめてあるものです。

 Instantiate メソッドも

Instantiate();

 という書式ですので、Unity が用意している、プレハブのゲームオブジェクトの複製を、1つ生成する機能です。
そのほか、Input.GetMouseButtonDown のうち、GetMouseButtonDown() はメソッドです。

 最初のうちは、最初の文字が大文字で、最後に () がつくものはメソッドという機能を使っている、という風にプログラムを読み解いていくとよいと思います。


メソッドの引数とオーバーロード


 メソッドの最後には必ず () が付きます。
これは引数(ひきすう)と呼ばれる機能です。

 ここには各メソッドごとに設定があり、メソッドの機能を使う際に利用される情報を書いておく場所になります。
Start や Update のように、引数の設定がないものもあり、その場合であっても、メソッドであることを示すため、() がついています。



 Instantiate メソッドにおいては、この() の中に、複製したいゲームオブジェクトの
情報が代入されている変数を指定することによって、プレハブのゲームオブジェクトの複製を1つ、生成することが出来ます。

 サンプルコードを提示します。

public GameObject prefab;  // <- 変数名は任意です

void Start () {  //  <- 最初の文字が大文字で、最後に () がつくのでメソッドです。
    Instantiate(prefab);  
}

 Instantiate メソッドの () に、prefab 変数を指定しています。
この Instantiate メソッドが実行されると、prefab 変数に代入されているプレハブのゲームオブジェクトの複製が1つ、生成されます。

 よって、スクリプトと、プレハブを利用することにより、
ゲーム実行中に、動的にゲームオブジェクトを生成することができる、ということになります。



 また同じメソッドでありながら、引数の指定方法が複数用意されているメソッドがあります。
これを引数のオーバーロードといい、同じメソッドですが、引数の指定によって、プログラムが自動的にどの処理を行うかを判断します。

 Instantiate メソッドには、引数の指定方法が5種類用意されています。

 先ほどの記述の他にも、引数の指定方法を変えて書くことが出来ます。

void Start () {
    Instantiate(prefab, transform);  
}

 この記述では、第1引数だけではなく、第2引数に Transform 型を指定している書式です。



void Start () {
    Instantiate(prefab, transform.position, Quaternion.Identity);  
}

 こちらの記述では、第1引数から第3引数まであり、第2引数には Vector3 型、第3引数には Quaternion 型を指定しています。



 このようにメソッドには、同じメソッド名であっても引数の指定方法が複数用意されているメソッドが多く用意されています。
 
 この引数のオーバーロードについて理解した上で、どの書式で記述をすれば効果的な処理になるかを考えていくことになります。


Instantiate メソッドの役割と戻り値の活用


 先ほどのスクリプトですが、生成処理をおこなっていますが、その後の制御は出来ません。

 Instantiate メソッドはあくまでも生成だけです。

 そのため、生成されたゲームオブジェクトについては、スクリプトからは続けての制御をすることが出来ません。

 例えば

 ・敵を生成して、異なる武器を持たせる
 ・弾を生成して、発射する
 ・アイテムを生成して、異なる位置に置く

 こういった処理を作るためには、Instantiate メソッドによる生成処理だけでは、ここまで制御が出来ない、ということになります。

 ただし実際の所、多くのゲームを見てもお分かりの通り、なにかを作って終わっているような処理はありません。
大抵、上記のように、作ってから、さらに制御をすることで、ゲームの内容に適したものにしています。



 そこで、Instantiate メソッドの持つ戻り値の機能を活用するため、
Instantiate メソッドの処理に代入処理を併用します。

void Start () {
    Gameobject obj = Instantiate(prefab);  //  <- 代入処理
}

 Instantiate メソッドには戻り値という機能があり、生成したゲームオブジェクトの情報を、
イコールの左辺に用意した変数に代入してくれます。

 上記の処理を日本語で表すなら

// GameObject 型の obj 変数を新しく用意し、Instantiate メソッドを使って、prefab 変数に代入されているプレハブの複製を1つ生成し、
// 生成された GameObjcet 型の情報を obj 変数に代入する
Gameobject obj = Instantiate(prefab);

 このようになります。



 =(イコール) をつかった代入処理は、左辺と右辺の型が同じである必要があります。

 int 型を例とするなら、

   int x = 10;
   int y = 5;
   x = y;

 このように、左辺と右辺の型が同じでなければ代入処理は出来ず、エラーになります

  int x = 10;
   x = 20;

 この場合であっても、20は整数としてプログラムが識別するため、代入処理としては

 int = int; 

 という、同じ型同士の処理になっているので、代入処理が成立します。



 先ほどの Instantiate メソッドの場合の代入処理が、これと同じです。

 見た目は違って見えますが、Instantiate メソッドの場合も、代入処理する際には、GameObject の情報を戻り値として扱うことになっているため、

 Gameobject obj = Instantiate(prefab);

 この処理は、型で表すと

Gameobject = GameObject;

 このような処理になっています。
そのため、代入処理が成立し、生成されたゲームオブジェクトの情報が obj 変数に代入されます。

 変数に情報が代入されている、ということは、プログラムを通じてその変数を使った命令をおこなうことができる状態です。


変数を活用したゲームオブジェクトの制御


 スクリプトがゲームオブジェクトに対して命令を出して制御するためには、変数を使う必要があります。

・敵を生成して、異なる武器を持たせる
・弾を生成して、発射する
・アイテムを生成して、異なる位置に置く

 こういった処理を作るためには、

Instantiate(prefab);

 これだけではダメで、

Gameobject obj = Instantiate(prefab);

 このように、生成したゲームオブジェクトの情報を変数に代入しておかないと、命令することが出来ません。
 
 生成したゲームオブジェクトの情報を変数に代入しておいたので、この情報を使って命令が出せるなります。


プログラムを書く時の考え方


 プログラムを書いていくためには、「原因」⇒「結果」を論理的に考えていくことが大切です。
具体的にいうと「こういうことだから」⇒「こうなる」という形で、落とし込んでいくという意味になります。
 エラーの解決方法もまったく同じであるため、どれだけ論理的に考えていくかが大切です。



 また、疑問に感じたことや、学習した内容については、Google を利用して検索していただくと、色々な記事が出てきます。

 先ほどの Instantiate メソッドなども、

 Unity Instantiate 

 といった形で検索していただけると見つかると思いますので、
それらの記事の中から、自分が求めている情報を見つけて、探し出して学習していく、という力も大切です。

 「検索力」「問題解決力」といった力を養っていくことで、プログラムの力をレベルアップできますので、
是非、ご自分でもたくさん調べていただき、たくさん、スクリプトを復習して書いてみてください。

 同じスクリプトを繰り返し書いていくことで、どういった処理になっているのかが少しずつ見えてきますし、
プログラムを書く力もついていきます。とにかくたくさんプログラムを書くと良いです。

 また、新しいことを覚えるときには、ご自分の身近な物事や、知っているゲームなどの内容に置き換えて覚えていくと理解がしやすいです。