公開日:2023/05/25  更新日:2023/05/25

UnityのC#のインスタンス

 UnityのC#のインスタンスとは実体である。
 例えば、スクリプトのクラス内にメソッドや変数の計算などを書いただけでは何の意味も持たない。スクリプトをゲームオブジェクトにアタッチすることでコンポーネントとしてインスタンス化(実体化)させることができ、ゲームオブジェクトの動作などが可能となる。
  C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子

 また、Unityの基礎知識や操作などがわからない場合は先に以下の記事を確認してほしい。
Unityの基礎まとめ

 この記事ではインスタンスの扱い方について詳しく解説していく。

Unityのインスタンス目次

インスタンスの取得
別ゲームオブジェクトのインスタンスの取得
構造体のインスタンス化
目次にもどる

インスタンスの取得

 ゲームオブジェクトにはアタッチしたスクリプトを含め様々なコンポーネントがある。コンポーネントのインスタンスを取得することが可能である。
 ゲームオブジェクトのSphereを作成してみよう。Sphereのコンポーネントの中にはSphere colliderがあるので、これをとってこようと思う。
 コンポーネントのインスタンスの取得にはGetComponentを用いる。GetComponentはMonoBehaviour(あらかじめUnity上で定義されているクラス)を継承しているため使うことができる。
 具体的にSphere colliderのインスタンスを取得する方法は以下の通り。

SphereCollider a = null;
Debug.Log(a);
a = GetComponent <SphereCollider>();
Debug.Log(a);

 SphereColliderの周りにあるのは本当は<>なので注意。記事上で<>を使ってしまうと中の文字が消えるため<>を使っている。

 まず、SphereCollider a = null;でaに空値を入れている(nullには何もないという意味がある)。この後のログを出しておりスクリプトをSphereにアタッチ後に再生すればNullと表示される。

  a = GetComponent <SphereCollider>();でSphereColliderのコンポーネントのインスタンスを取得してaに入れている。<>で囲まれた部分はとってくるコンポーネントの種類によって異なる。コンポーネントの名前とほぼ同じとなっていることが多く覚えるのにそれほど苦労はしない。
 インスタンス取得後のログはSphere (UnityeEngine SphereCollider)となっている。


 同じコンポーネントがいくつもついている状態だとどのコンポーネントをとってくるかわからないので注意。
目次にもどる

別ゲームオブジェクトのインスタンスの取得

 先ほど説明した方法で、スクリプトをアタッチしたゲームオブジェクトのコンポーネントのインスタンスは取得できる。
 他のゲームオブジェクトのコンポーネントのインスタンスをとってくるには、まず、ターゲットとなるゲームオブジェクトのインスタンスをとる必要がある(コンポーネントだけでなくゲームオブジェクト自体にもインスタンス(実体)はある)。
 ゲームオブジェクトのインスタンスはGameObject.Findで手に入れられる。その例として最初からあるDirectional Lightのゲームオブジェクトのインスタンスを手に入れ、Lightのコンポーネントの取得する方法を紹介する。

GameObject a = null;
Debug.Log(a);
a = GameObject.Find("Directional Light");
Debug.Log(a);
a.GetComponent<Light>();

 Lightの周りにあるのは本当は<>なので注意。記事上で<>を使ってしまうと中の文字が消えるため<>を使っている。

 まず、GameObject a = null;でaに空値を入れている。

  a = GameObject.Find("Directional Light");でDirectional Lightのインスタンスを取得してaに入れている。
 インスタンス取得後のログは以下のようになっている。


 最後のa.GetComponent<Light>();により、Directional Lightのインスタンスが入ったaのコンポーネントのLightを取得している。
目次にもどる

構造体のインスタンス化

 インスタンスはnewを使うことで自分で作ることも可能だ。
 以下のように記述してみてほしい。

Vector3 a = new Vector3();
Debug.Log(a);

 Vector3は構造体と呼ばれるものの一つだ。
 構造体はある対象に関連している項目をまとめて1つのかたまりとしたものだ(詳しくは別記事で紹介する)。
 Vector3の場合は三次元ベクトルを表現するためのもので、xの値、yの値、zの値をまとめて持つことができる。
 Vector3は構造体でありコンポーネントではないため、ゲームオブジェクトにアタッチしてインスタンス化することはできない。
 よって、Vector3 a = new Vector3();としてインスタンス化した。newを使うことで構造体でもインスタンス化することができる。
UnityのC#の基礎まとめへ戻る

page top