Instantiate メソッドではクラスの情報を利用して生成することが出来るため、GameObject 型ではなく、生成するゲームオブジェクトにアタッチしているクラスの型で生成します。
そうすることにより、GetComponent メソッドを使わなくてもすぐにクラスのメソッドに命令を実行できます。
Instantiate メソッドには戻り値があり、クローンの生成を行うとともに、生成を行った型を戻り値として左辺へ戻します。
そのため、GameObject 型でクローンの生成を行うと、GameObject 型が戻り値として戻されます。
この機能は GameObject 型には限らないため、クローンの生成を行いたいゲームオブジェクトに、自作したスクリプトがアタッチされている場合には
そのスクリプトを使って、クローンの生成を行うとともに、そのスクリプトの型を戻り値として戻すことが出来ます。
この場合、左辺に用意する型もスクリプトの型を用意することで戻り値を受けとることが可能です。
<GameObject型でのインスタンス処理>
[SerializeField]
private GameObject playerCharaPrefab;
[SerializeField]
private Transform startTran;
// Player用のキャラの生成
GameObject playerChara = Instantiate(playerCharaPrefab, startTran.position, Quaternion.identity);
// PlayerController スクリプトを取得
PlayerController playerController = playerChara.GetComponent<PlayerController>();
// PlayerController の設定を行う
playerController.SetUpPlayer([設定したい情報を渡す]);
↓
<クラスでのインスタンス処理>
[SerializeField]
private PlayerController playerCharaPrefab; // GameObject 型ではなくクラスでアサインしておく
// Player用のキャラの生成
PlayerController playerChara = Instantiate(playerCharaPrefab, startTran.position, Quaternion.identity); // PlayerController 型でインスタンス化される
// PlayerController の設定を行う
playerController.SetUpPlayer([設定したい情報を渡す]); // GetComponent の処理が省略できる
違いとしては、
プレファブとして登録する際の型や、
インスタンス処理の際の左辺に用意する型が異なります。
そして最も大きな違いは、
GetComponentメソッドの処理がないが、
正常に動作するということです。
下の自作クラスでインスタンス処理をした場合にはゲームオブジェクトのクローンを生成する部分は同じですが、
戻り値として PlayerController クラスを受け取っているため、GetComponent メソッドを実行せずとも、そのスクリプトの情報を自動的に取得出来ています。
このように GetComponent メソッド処理を省略する処理を書くことで、処理的に重い GetComponent 処理の負荷を減らすことが出来ます。
もしも生成したゲームオブジェクトのクローンに対して、何か処理を行いたいような場合には、GameObject型だけではなく、自作クラスにて生成することも念頭に置いて設計しておきましょう。
この使い方は Unity のマニュアルにも記載されています。
読んでおくとよいでしょう。
参考サイト
Unity 公式マニュアル
Object.Instantiate