【初心者Unity】Instantiateでオブジェクトをクローンする方法(応用編)
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
Instantiateの使い方-応用編-
Instantiateはオリジナルのゲームオブジェクトからクローンを生成するメソッドです。
本記事ではInstantiateのいろいろな使い方を紹介します。
Instantiateの基本的なお話は下記の記事を参考にしてください。
(参考)
Instantiateを具体例付きで解説
基本形(オブジェクトと位置と回転を指定)
・第1引数にオリジナルのゲームオブジェクト
・第2引数にクローンが生成される座標
・第3引数にクローンの回転量
public GameObject original; void Start() { Instantiate(original, new Vector3(2, 0, 0), Quaternion.identity); }
使用頻度の高いInstantiateの基本形です。座標と回転を指定してクローンを生成します。
座標はVector3型、回転はQuaternion型です。
Quaternion.identityは「回転なし」という指定です。具体的な値を指定して回転を変えることもできます。
クローンされたオブジェクトのTransform(スクリプトで指定された座標と回転)
こちらの形式では、クローンはヒエラルキーのトップ(ルート階層)に配置されます。
オブジェクトだけ指定
・第1引数にオリジナルのゲームオブジェクト
public GameObject original; void Start() { Instantiate(original); }
オリジナルのゲームオブジェクト以外、何も指定しない方法です。
この場合、クローンの位置と回転はオリジナルと同じ値となります。
オリジナルのTransform
↓
クローンのTransform
オブジェクトと親を指定
・第1引数にオリジナルのゲームオブジェクト
・第2引数に親にしたいゲームオブジェクトのトランスフォームコンポーネント
public GameObject original; public Transform parent; void Start() { Instantiate(original, parent); }
第2引数に指定したオブジェクトの子要素としてクローンを生成します。
今回は「Directional Light」を親に指定しています。
オリジナルが持っていた座標や回転の情報は、クローンでは親オブジェクトからの相対値として反映されます。
そのためTransformの値は同じですが、ワールド座標系での位置は全く異なります。(親オブジェクトの座標が0,0,0の場合を除く)
オリジナルのTransform
↓
クローンのTransform(値は同じですがワールド座標での位置は全然違います。)
なお、第2引数をnullにした場合、前項の「オブジェクトだけ指定」と同じく、ルート階層であるヒエラルキー直下にクローンされます。
オブジェクトと親を指定しつつ、ワールド座標を維持する
・第1引数にオリジナルのゲームオブジェクト
・第2引数に親にしたいゲームオブジェクトのトランスフォームコンポーネント
・第3引数にワールド座標を維持するかどうかのbool値(true指定で維持)
public GameObject original; public Transform parent; void Start() { Instantiate(original, parent, true); }
親に指定したオブジェクトの子要素として生成しますが、生成される座標と回転はオリジナルのワールド座標が維持されます。
オリジナルのTransform
↓
クローンのTransform(値は全然違いますが、ワールド座標での位置は同じです。)
なお、第3引数にfalseを指定すると前項の「オブジェクトと親を指定」と同じ結果になります。
オブジェクトと位置と回転と親を指定
使用頻度の高いInstantiateの基本形です。
・第1引数にオリジナルのゲームオブジェクト
・第2引数にクローンが生成される座標
・第3引数にクローンの回転量
・第4引数に親にしたいゲームオブジェクトのトランスフォームコンポーネント
public GameObject prefab; public Transform parent; void Start() { Instantiate(original, new Vector3(2, 0, 0), Quaternion.identity, parent); }
基本形に加えて親も指定する形式です。
引数で指定された位置と回転はワールド座標系のものですが、その位置と回転は子要素になった後も維持されます。
親オブジェクトを基準とした値のため、Transformの値はスクリプトで指定したものとは全く異なりますが、ワールド座標での位置は(2, 0, 0)、回転は(0,0,0)です。
まとめ
以上Instantiateメソッドのいろいろなパターンを紹介しました。
座標や親要素を指定する場面では使い分けが重要になりますので、パターンだけでも把握しておくと良いでしょう。
ちなみに、Unityで使用されるC#などのオブジェクト指向型プログラミング言語では、このように同じ名前のメソッドに複数の引数パターンが用意されることを「オーバーロード」といいます。Unityでは様々なメソッドがオーバーロードされています。ぜひ意識してみてください。