Instantiate メソッドには
戻り値があり、その型は Object 型です。(GameObject 型ではありません)
Object 型とは、すべてのクラスに自動的にサポートされるクラス(型)です。これは、C# プログラムにおける基本クラスとなっています。
MicroSoft
Object クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system...
そのため、Unity において作成されているクラス(型)ーGameObject 型、Transform 型、Rigidbody 型などーは、すべてこの Object クラスの情報を有しています。
利用頻度の高い ToString メソッドも、この Object 型によって提供されているメソッドになります。
Instantiate メソッドでは第1引数に指定した Object 型のクローンの生成を行うとともに、
生成を行った型を戻り値として左辺へ戻します。
そのため、
GameObject 型でクローンの生成を行うと、
GameObject 型が戻り値として戻されます。
GameObject 型は Object 型の情報を有しているため、このように Object 型以外の型でも指定出来るようになっています。
この機能は GameObject 型には限らないため、クローンの生成を行いたいゲームオブジェクトに、自作したスクリプト(クラス)がアタッチされている場合には
そのスクリプトを使って、クローンの生成を行うとともに、そのスクリプトの型を戻り値として戻すことが出来ます。
この場合、左辺に用意する型もスクリプトの型を用意することで戻り値を受けとることが可能です。
この場合も GameObject 型と同じで、自作したスクリプト(クラス)には Object 型の情報が含まれているので、Instantiate メソッドの第1引数として指定できるようになっています。
クラスによる生成、という単語で見るとイメージが沸きにくいかもしれませんが、どちらの場合であっても、ゲームオブジェクトが生成されます。
<GameObject型でのインスタンス処理>
// 宣言
[SerializeField]
private GameObject gridPrefab;
[SerializeField]
private GameObject [] grids;
// ループ文を利用した生成処理
for (int i = 0; i < grids.Length; i++) {
// GameObject 型でインスタンスするので、戻ってくる型も GameObject 型
grids[i] = Instantiate(gridPrefab, gridSetTran, false);
// GameObject にアタッチされている GridController スクリプトにアクセスして、SetUpGrid メソッドを実行する
// GameObject 型なので、GetComponent メソッドによる GridController スクリプトの取得が必要
grids[i].GetComponent<GridController>().SetUpGrid(i, this);
}
<自作クラスでのインスタンス処理>
[SerializeField]
private GridController gridPrefab;
[SerializeField]
private GridController [] grids;
// ループ文を利用した生成処理
for (int i = 0; i < grids.Length; i++) {
// GridController 型でインスタンスするので、戻ってくる型も GridController 型
grids[i] = Instantiate(gridPrefab, gridSetTran, false);
// GameObject にアタッチされている GridController スクリプトにアクセスして、SetUpGrid メソッドを実行する
// 戻り値になっている型が最初から GridController 型なので、GetComponent メソッドによる GridController スクリプトの取得が必要ない
// つまり、必要な情報が利用できる状態で提供される形式になる
grids[i].SetUpGrid(i, this);
}
違いとしては、
プレファブとして登録する際の型や、
インスタンス処理の際の左辺に用意する型が異なります。
そして最も大きな違いは、クラスの取得方法です。インスタンスされたゲームオブジェクトの持つクラスの情報を利用したい場合、
GameObject 型である場合には一度、
GetComponetメソッドを利用して、操作を行いたいクラスの情報を取得する必要があります。
ですが下のケースの場合、
クラスを利用してゲームオブジェクトが生成されるため、GameObject 型の場合に必要な GetComponentメソッドの処理が不要になります。
生成されるゲームオブジェクトに変わりはありません。
下の自作クラスでインスタンス処理をした場合にはゲームオブジェクトのクローンを生成する部分は同じですが、
戻り値として GridController スクリプトを受け取っているため、GetComponent メソッドを実行せずとも、そのスクリプトの情報を自動的に戻り値から取得出来ています。
このように GetComponent メソッド処理を省略する処理を書くことで、
処理的に重い GetComponent 処理の負荷を減らすことが出来ます。
もしも生成したゲームオブジェクトのクローンに対して、
何か処理を行いたいような場合には、
GameObject型だけではなく、自作クラスにて生成することも念頭に置いて設計しておきましょう。