Unityのオブジェクトを生成する場合にはInstantiate関数を使います。
このInstantiate関数はいわゆるオーバーロード関数で様々なパラーメータ指定方法があります。※詳しくは本文で説明します。
Instantiateに限らずですが、複数のパラメータの存在が一件複雑に見える事があります。でも大丈夫!一度使い方を覚えれば簡単に使いこなす事ができます。実際に単純なオブジェクト生成だけではゲーム作成はできません。
という訳でパラメータの指定方法とともにInstantiate関数の使い方を紹介します。
Instantiateはゲームを作りこんでいく上で必須の関数になると思った方が良いです。
でもパラメータの意味と使い方が分かればすぐに使いこなせると思います!
ここで使い方をしっかりと覚えておきましょう!
今は個人でも本格的なゲーム開発を行える環境が整いつつあります! 特に世界中のゲームクリエイターが使用しているのが、ゲーム開発エンジンのUnity。個人開発を行っているほとんどのクリエイターが使用しているとも言われている超 …
コンテンツ
Instantiateの使い方(位置・回転度・親要素の指定など)
まずはInstantiate関数についての基本を身に付けましょう。
Instantiateはオーバーロード関数?
まずはこちらを見て下さい。
公式リファレンスのInstantiateに掲載されている内容です。
■Instantiate関数について
※参考:公式リファレンス
https://docs.unity3d.com/ja/current/ScriptReference/Object.Instantiate.html
関数は1つなのに、引数の型や数が違っています。
Instantiate関数は指定する引数に応じて最適な処理をしてくれます。
この様に、関数名は同じなのに引数の型や数が異なっている状態をオーバーロード(多重定義)と呼びます。また、この様な関数をオーバーロード関数と呼んだりもします。
オーバーロード関数を使いこなすためには、設定したいパラメータを何番目の引数で渡すべきかを事前に確認しておく必要があります。
ここからパラメータについて詳しく見ていきましょう。
Instantiateのパラメーターについて
公式リファレンスを読み進めると指定できるパラメータが一覧になっているので確認してみましょう。
■Instantiateのパラメータ
※公式リファレンスURL
https://docs.unity3d.com/ja/current/ScriptReference/Object.Instantiate.html
ただ、これだけではパラメータの詳細がちょっと分からないですね。英語だし。。。もう少し詳しくパラメータについて見ていきましょう。
■Instantiateのパラメータ(日本語で解説)
※verが異なる場合は対象verのリファレンスを参照してください。
パラメータ | 説明 |
original | 生成対象のオブジェクト(Prefabsなど) |
position | 生成したオブジェクトの位置(Vector3で指定) |
rotation | 生成したオブジェクトの回転値(Quaternionで指定)※向きや角度を指定 |
parent | 生成したオブジェクトの親要素を指定 |
instantiateInWorldSpace | グローバル座標orローカル座標の指定等で使う |
これらのパラメータの中から、オブジェクト生成時に指定したいパラメータを指定する事になります。そして、使用するパラメータに応じて第2引数、第3引数を何にするか?を考えて実装する必要があります。
説明だけだと分からないと思いますので、実際にInstantiate関数を使ってみましょう。
Instantiate関数を使ってみる
画面に何も無い状態からInstantiate関数を使ってオブジェクトを生成してみます。パラメータの指定方法によって、どの様に結果が変わるかを意識して確認してみて下さい。
ちなみに、C#スクリプトをオブジェクトにアタッチしたり、Prefabs素材を指定する方法は以下を参考にして下さい。
Unityを使っていると、制作過程で必ずオブジェクトに対して「生成、表示・非表示、破壊」といった命令をC#スクリプトで行う機会があると思いますので、今回はこれらの実装方法について解説をしていきたいと思います。 ちなみに、 …
オブジェクトの生成のみ
まずはオブジェクト生成のみ実施してみます。
引数は一つだけで、生成対象のオブジェクトを指定すればOKです。
オブジェクト生成前の画面が以下になります。ここにオブジェクトを生成してみましょう。
■生成前の実行画面
では、この画面上にオブジェクトを生成してみます。
引数は一つだけで対象のオブジェクトを指定すればOKです。
- 第一引数に生成対象のオブジェクトを指定
空っぽのオブジェクトを生成して、以下のスクリプトをアタッチして下さい。
■C#スクリプト ※ファイル名とクラス名は同じにして下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Instantiate_test : MonoBehaviour { public GameObject obj; void Start() { Instantiate (obj); } } |
■実行結果
オブジェクトの生成に「位置、回転値(向き・角度)」を指定
生成するオブジェクトの位置と回転値(向き・角度)を指定してみます。
各引数に以下を指定しましょう。
- 第一引数に生成対象のオブジェクトを指定
- 第二引数にposition(位置)を指定
- 第三引数にrotation(回転値)を指定
先ほども使用したC#スクリプトのクラスを以下の様に書き換えて実行してみましょう。
■C#スクリプト
1 2 3 4 5 6 7 8 9 10 |
public class Instantiate_test : MonoBehaviour { public GameObject obj; void Start() { Instantiate (obj); Instantiate (obj, new Vector3 (2.0f, 2.0f, -5.0f), Quaternion.Euler(90, 30, 0)); } } |
※ちなみに第三引数に「Quaternion.identity」を指定すると回転しない設定になります。
オブジェクト生成時に位置や回転値を指定しているので、Cubeのオブジェクトの位置や向きが変わっていますね。
オブジェクトの生成に「親子関係の指定(ローカル座標)」を指定
生成するオブジェクトと既に存在するオブジェクトとの親子関係を指定してみます。
事前準備としてゲーム画面上に親要素となるSphreオブジェクトを作成しておきます。
■親要素を作成
Sphreオブジェクトを親要素に指定するInstantiate関数を実行してみましょう。各引数に以下を指定します。
- 第一引数に生成対象のオブジェクトを指定
- 第二引数にparent(親要素)を指定
※第三引数を設定しないと子要素はローカル座標指定になります。
先ほどのC#スクリプトのクラスの中を以下の様に書き換えます。public変数として親要素オブジェクトを用意していますので、Unityのエディタで親要素のオブジェクトをアタッチするのを忘れない様にして下さい。
■C#スクリプト
1 2 3 4 5 6 7 8 9 10 |
public class Instantiate_test : MonoBehaviour { public GameObject obj; public GameObject parentObj; /* 親要素 */ void Start() { Instantiate (obj,parentObj.transform); } } |
■実行結果
親要素の位置を基準にして、オブジェクトが生成されています。
※上に乗っかる様な感じで生成されましたね。。。
これがローカル座標位置でオブジェクトを生成するケースになります。
オブジェクトの生成に「親子関係の指定(グローバル座標)」を指定
オブジェクト生成時の位置をグローバル座標で指定してみたいと思います。
各引数に以下を指定しましょう。
- 第一引数に生成対象のオブジェクトを指定
- 第二引数にparent(親要素)を指定
- 第三引数にinstantiateInWorldSpace(True)を指定
※Trueを指定するとグローバル座標で子要素が生成されます。
先ほど使用したC#スクリプトのInstantiate関数を以下の様に書き換えます。
■C#スクリプト
1 |
Instantiate (obj,parentObj.transform,true); |
■実行結果
グローバル座標でオブジェクトが生成されました。
ちなみに第一引数(オブジェクト事態)を指定した場合と同じ様に作成されていますが、Sphreオブジェクト(親要素)の子要素として生成されています。
親子関係の指定はUI生成時によく使う
今回紹介した内容の他に、親子関係の指定はUIを生成する際によく使用します。というのもUIはCanvasの子要素に指定しなければ画面上に表示されないからです。
Instantiateで生成すると共にCanvasを親要素に指定する必要があります。
まとめ
今回は、Instantiate関数の使い方についてご紹介しました。
パラメータの指定方法によって、生成時の位置、回転値、親要素、グローバル/ロカール座標も設定する事ができます。
オーバーロード関数である事を踏まえて各パラメータを指定する場合は引数の順番にも注意する様にしましょう。
Instantiate関数を使いこなせる様になれば、Unityでできる事がさらに多くなると思います。