こんにちは、Unityエンジニアのオオバです。
コンポーネントとはGameObjectに追加する機能
はじめに結論を簡単にまとめます。
①コンポーネントはGameObjectに追加できる機能
②コンポーネントは追加、削除可能
③コンポーネントはいくつでもGameObjectに追加可能
④GameObjectにアタッチされたコンポーネント一覧を取得可能
Unityのコンポーネントとは GameObjectに追加する機能のこと ですが、
もっと分かりやすく例えると、十徳ナイフの「ナイフ」です。
GameObjectに対していくつも機能を追加できます。
ゲーム開発では独自の機能をGameObjectに追加することになりますが、
その 「独自機能」もコンポーネント なのです。
つまりコンポーネントの理解はゲーム開発においてかなり重要。
本記事では コンポーネントの基本的な使い方から使いこなすテクニック、使用上の注意点まで網羅しています。
これを読むだけでコンポーネントについては完璧に理解できると思います。
ぜひ最後まで読んでみてください。
コンポーネントはGameObjectと切っても切れない関係 です。
GameObjectについてはこちらの記事で詳しく解説しています。
ぜひあわせて読んでみてください。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
- コンポーネントとは?
- コンポーネント3つの特徴
- コンポーネントの基本的な使い方4選
- コンポーネントを使いこなす6つのテクニック
- テク①RequireComponentで必ずアタッチするコンポーネントを指定
- テク②DisallowMultipleComponentでコンポーネントの重複を禁止
- テク③AddComponentMenuでコンポーネントを整理
- テク④存在するかわからないコンポーネントはTryGetComponentの選択肢
- テク⑤複数のGameObjectに一括でコンポーネントを追加・削除する方法
- テク⑤コンポーネントの参照は事前にシリアライズ
- テク⑥シーン全体検索FindObjectOfType
- コンポーネントの注意点4選
- 注意点①コンポーネントのnewは禁止
- 注意点②GetComponentInChildren、GetComponentInParentは最初に見つかったものを取得
- 注意点③FindObjectOfTypeはできるだけ使わない
- 注意点④イベント関数のアクセス修飾子は無効
- Unityコンポーネントまとめ
コンポーネントとは?
「コンポーネント」とはGameObjectに追加する機能 のこと。
具体的には以下です。
- カメラ・・・Lightコンポーネント
- ライト・・・Cameraコンポーネント
- 当たり判定・・・Colliderコンポーネント
- 画像の表示・・・SpriteRendererコンポーネント
- メッシュの表示・・・MeshRendererコンポーネント
- ボタン・・・Buttonコンポーネント
など。
普段「カメラ」や「ライト」と言っている機能たちはすべて 「コンポーネント」 です。
最初にGameObjectとコンポーネントを十徳ナイフに例えました。
コンポーネントは「ナイフ」部分にあたります。
GameObject1つに対してコンポーネントはいくつも追加可能 。
「カメラを機能をもったライト」も作れますし、
「ボタン機能を持ったキャラクター」も作れます。
UnityはコンポーネントをGameObjectに追加することで、
ゲームの機能を自由に作ることができる のです。
コンポーネント3つの特徴
コンポーネントのことがなんとなくわかってきましたね。
この章ではコンポーネントの特徴を紹介します。
①コンポーネントはGameObjectに追加することができる
②自作のコンポーネントにはMonoBehaviourが必要
③同じコンポーネントを複数追加可能
特徴①コンポーネントはGameObjectに追加することができる
コンポーネントの最大の特徴はGameObjectに追加することができること です。
裏を返せば、コンポーネントは単体では何もできません。
GameObjectに追加することで初めて機能します 。
大事なことなのでもう一度言います。
「コンポーネントはGameObjectに追加して初めて機能します」
コンポーネントだけを配置することはできない のです。
この感覚を最初に身に着けておくとUnity開発が楽になります。
特徴②自作のコンポーネントにはMonoBehaviourが必要
コンポーネントは開発者自身も作れます。
キャラクターの制御やゲームロジックなど。
いわゆるゲームの機能開発です。
このような自作コンポーネントには MonoBehaviour を使います。
MonoBehaviourクラスを継承することで自作コンポーネントをGameObjectに追加できる のです。
MonoBehaviourはUnityの根幹機能 。
MonoBehaviourの理解なしにゲーム開発はできません。
詳しくはこちらの記事で徹底解説しています。
ぜひ読んでみてください。
特徴③同じコンポーネントを複数追加可能
1つのGameObjectに同じコンポーネントをいくつも追加可能です。
上の動画のとおりいくつも同じコンポーネントを追加できます。
同じコンポーネントでもそれぞれ独立 しています。
コンポーネントごとに 別々の値 を持つことができるのです。
1コンポーネントに対して、1つGameObjectを作ってしまいがちですが、
複数同じコンポーネントをつけられることを覚えておきましょう。
また、 「コンポーネントを1つだけしかつけたくない」 場合もありますよね。
後述する 「テク②DisallowMultipleComponentでコンポーネントの重複を禁止」 で実現可能ですので安心してください。
コンポーネントの基本的な使い方4選
コンポーネントの基本的な使い方を4つ解説します。
①コンポーネントの追加
②コンポーネントの削除
③GetComponentでコンポーネントの取得
④enabledでON/OFFの切り替え
使い方①コンポーネントの追加4つの方法
最初に覚えておきたい使い方はGameObjectにコンポーネントを追加する方法です。
実はコンポーネントを追加する方法は4つあります。
方法①InspectorウィンドウのAddComponentボタン
InspectorウィンドウからAddComponentボタンで追加可能です。
インスペクタから直接指定できるため分かりやすくよく使います。
方法②メニューComponentから追加
メニュー Component からコンポーネントを追加する方法。
追加したいGameObjectを事前に選択しておく必要があります。
方法③Projectウィンドウからドラッグアンドドロップ
Projectウィンドウからドラッグアンドドロップ する方法
独自コンポーネントを追加する際はとても感覚的で便利。
個人的によく使います。
方法④スクリプトでAddComponent
方法①〜③はあくまでUnityエディタ上の操作でした。
最後にスクリプトでコンポーネントを追加する方法の紹介です。
結論、 AddComponent メソッドを使います。
AddComponent<コンポーネント名>();
↑このような文法です。
具体的なサンプルを見ていきましょう。
💻ソースコード : BoxColliderを追加するサンプル
using UnityEngine;
public class MyComponent : MonoBehaviour
{
void Start()
{
// BoxColliderを追加する
gameObject.AddComponent<BoxCollider>();
}
}
AddComponentはあくまでGameObjectの機能 。
GameObjectに対して AddComponent を実行するため、
gameObject.AddComponent
となるのです。
ゲームの途中でAddComponentする機会は多いです。
よく使うメソッドなので覚えておきましょう。
使い方②コンポーネントの削除2つの方法
コンポーネント基本的な使い方その②は 「コンポーネントの削除」 です。
2つの方法があります。
削除方法①InspectorウィンドウのRemove Component
Inspectorウィンドウから削除する方法です。
上の動画のように削除したいコンポーネントのメニューから
Remove Component をクリック。
すると削除されます。
削除方法②スクリプトはDestroyで削除
スクリプトでコンポーネントを削除する方法の紹介。
Destroy メソッドを使います。
Destroy(コンポーネントインスタンス)
文法は上のとおり。
Destroyメソッドの引数にコンポーネントインスタンスを渡します。
次のサンプルコードはBoxColliderを新規で追加して、1秒後に削除する例です。
1秒待機する処理は コルーチン という機能を使用しています。
using UnityEngine;
public class MyComponent : MonoBehaviour
{
IEnumerator Start()
{
// コンポーネント(BoxCollider)を追加
BoxCollider collider = gameObject.AddComponent<BoxCollider>();
// 1秒待機
yield return new WaitForSeconds(1f);
// コンポーネントを削除
Destroy(collider);
}
}
実際にUnityで動かすと以下のような動きになります。
BoxColliderが追加され、1秒後に削除されましたね。
Destroyはよく使うのでぜひ覚えておきましょう。
先の例ではコルーチンが登場しました。
コルーチンは 非同期処理 と呼ばれ、ゲーム開発ではよく使われます。
あまりコルーチンについて理解していないという方はこちらの記事がおすすめです。
使い方③コンポーネントの取得3つの方法
コンポーネントの基本的な使い方その③は 「コンポーネントの取得」 です。
本章で紹介する「コンポーネントの取得」とは、
GameObjectに追加されているコンポーネントの取得 を指します。
コンポーネントの取得方法は3種類。
それぞれ解説していきます。
取得方法①GetComponent
最初は GetComponent メソッドの紹介です。
1つのGameObjectにアタッチしているコンポーネントを取得します。
GetComponentの文法は↓こちら。
コンポーネント名 component = GetComponent<コンポーネント名>();
コンポーネント名を指定することで取得できます。
具体的なコードを見てみましょう。
using UnityEngine;
public class MyComponent : MonoBehaviour
{
void Awake()
{
// コンポーネント(BoxCollider)の取得
BoxCollider collider = GetComponent<BoxCollider>();
}
}
GetComponent
メソッドを使ってBoxColliderを取得しています。
上図のように
MyComponent
と同じGameObjectに BoxCollider がアタッチされている場合に取得可能です。 GetComponetしてもコンポーネントが取得できない場合
GameObjectにコンポーネントがあらかじめアタッチされていない場合もあります。
その場合は、GetComponentの戻り値はnullです。
nullの場合は新たにコンポーネントをアタッチしたい がときありますよね。
以下のサンプルで解決できます。
// コンポーネント(BoxCollider)の取得
BoxCollider collider = GetComponent<BoxCollider>();
// 存在しない場合は新たに生成する
if (collider == null) {
collider = gameObject.AddComponent<BoxCollider>();
}
BoxColliderが存在しなかった場合は新たにAddComponent しています。
よく使う手法なので覚えておきましょう。
複数同じコンポーネントを取得する場合はGetComponents
さきほどの解説はあくまでコンポーネントが1つしか存在しない場合の話でした。
「コンポーネントの特徴」で解説したとおり、同じコンポーネントを複数アタッチすることが可能です。
これらの同じコンポーネントを1度にすべて取得する方法を紹介します。
結論 GetComponents メソッドです。
GetComponentと似ていますが、最後に「s」が付いているに注意。
💻ソースコード : GetComponentsで複数コンポーネント取得
using UnityEngine;
public class MyComponent : MonoBehaviour
{
void Awake()
{
// コンポーネントを配列で取得
MyComponent[] components = GetComponents<MyComponent>();
}
}
上のソースコードのとおり、 GetComponents を使ってコンポーネントを配列で取得できました。
取得方法②GetComponentInChildren
GameObjectは以下の図のとおり 階層 を持てます。
先ほど紹介した GetComponent は1階層分のコンポーネントしか取得できません。
これから紹介する GetComponentInChildren を使うと 子階層のコンポーネントも取得可能 。
子階層にBoxColliderを配置した構成です
最下層のBoxColliderを最上位のMyComponentから取得するサンプルはこちら。
using UnityEngine;
public class MyComponent : MonoBehaviour
{
void Awake()
{
// 子階層のBoxColliderを取得する
BoxCollider collider = GetComponentInChildren<BoxCollider>();
}
}
GetComponentInChildren メソッドを使うと簡単に取得できます。
【注意点】GetComponentInChildrenは自分自身も対象
GetComponentInChildrenは名前のとおり子階層のみを対象と思いがちですが、実は 自分自身も検索対象 です。
上図の通り GetComponentInChildrenの検索範囲は自分自身を含む子階層 であることに注意してください。
非アクティブなコンポーネントを検索から除外する方法
GetComonentInChildrenを使って子階層のコンポーネントを取得しました。
場合によっては 非アクティブなコンポーネントは除外したい こともあります。
つまり以下の図のような感じです。
非アクティブなGameObjectのコンポーネントは検索対象から外すということです。
やり方は簡単。
GetComponentInChildrenの引数に true
を代入します。
// 引数にtrueを代入して非アクティブコンポーネントを除外
BoxCollider collider = GetComponentInChildren<BoxCollider>(true);
すると非アクティブGameObjectのBoxColliderは 検索対象から除外されます。
注意点が1つ。検索対象から除外されるのは、あくまで「非アクティブなGameObject」です。
コンポーネントだけが非アクティブな状態では検索対象から除外されません。
上図のとおりコンポーネントのチェックが外れているだけでは検索対象から除外されないので注意です。
GetComponentsInChildrenで子階層の複数コンポーネントを取得
GetComponentと同様にGetComponentInChildrenも複数取得する方法が提供されています。
結論 GetComponentsInChildren です。GetComponentと同様「s」が付いていますね。
サンプルコードはこちら。
using UnityEngine;
public class MyComponent : MonoBehaviour
{
void Awake()
{
BoxCollider[] colliders = GetComponentsInChildren<BoxCollider>();
}
}
子階層のBoxColliderをすべてを取得します。
// 引数にtrueを代入して非アクティブコンポーネントを除外
BoxCollider[] colliders = GetComponentInChildren<BoxCollider>(true);
GetComponentsInChildrenも引数にtrueをセットすると非アクティブコンポーネントを取得対象から除外します。
取得方法③GetComponentInParent
GetComponentInParentを使うことで親階層を検索 できます。
サンプルコードはこちら。
using UnityEngine;
public class MyComponent : MonoBehaviour
{
void Awake()
{
BoxCollider[] colliders = GetComponentInParent<BoxCollider>();
}
}
以下の図のように自分より親階層のコンポーネントを取得します。
GetComponentInParentも他のメソッドと同様、
「GetComponentsInParent」 を使うことで複数コンポーネントを取得できます。
使い方④enabledでON/OFFの切り替え
コンポーネントにはON/OFFが存在します。
↑動画のようにInspectorウィンドウでのコンポーネント名のチェックボックスのON/OFFです。
このON/OFFが何に影響をあたえているのかというと、
StartやUpdateといった特定のイベント関数 です。
チェックを外すとこれらのイベント関数が実行されなくなるのです。
この辺り、もう少し詳しく解説します。
コンポーネントのチェックボックスには表示条件がある
特定のイベント関数を記述していないとチェックボックスは表示されません。
特定のイベント関数は全部で7つ。
- Start()
- Update()
- FixedUpdate()
- LateUpdate()
- OnGUI()
- OnDisable()
- OnEnable()
これらの関数を記述しているとチェックボックスが表示されるのです。
前述のとおりチェックボックスはenabledプロパティで制御されます。
このenabledプロパティが制御する範囲は、
先に紹介した7つのイベント関数。
チェックを外すとUnityから自動で実行されることはなくなります。
コンポーネントを使いこなす6つのテクニック
コンポーネントの基本的な使い方を押さえたところで、
さらに使いこなす6つのテクニックを紹介します。
①RequireComponentで必ずアタッチするコンポーネントを指定
②DisallowMultipleComponentでコンポーネントの重複を禁止
③AddComponentMenuでコンポーネントを整理
④存在するかわからないコンポーネントはTryGetComponentの選択肢
⑤複数のGameObjectに一括でコンポーネントを追加・削除する方法
テク①RequireComponentで必ずアタッチするコンポーネントを指定
必ずセットで追加したいコンポーネントはRequireComponentを使うと便利 です。
AddComponentしたときに必ずセットで追加されるコンポーネントってありますよね。
例えば Imageコンポーネント です。
上の動画のとおり Imageコンポーネントを追加すると同時にCanvasRendererコンポーネントも追加 されます。
セットで追加される機能は RequireComponent を使うと開発者自身も簡単に実現できるのです。
手順は簡単。
クラス定義部分に [RequireComponent(typeof(コンポーネント名))]
と記述するだけ。
サンプルとしてAddComponentしたら「BoxCollider」がセットされる自作コンポーネントを作ってみます。
ソースコードは以下。たったの4行です。
using UnityEngine;
[RequireComponent(typeof(BoxCollider))]
public class Test : MonoBehaviour
{
}
すると、このようにTestをAddComponentするとBoxColliderがセットされます。
もちろんBoxColliderのようなUnityが用意したコンポーネントだけではなく、
自作のコンポーネントもRequireComponent可能です。
using UnityEngine;
[RequireComponent(typeof(MyButton))]
public class Test : MonoBehaviour {
}
↑自作のMyButtonコンポーネントをRequireComponentした例です。
RequireComponentで指定したコンポーネントは削除できない
RequireComponent で指定したコンポーネントは Remove Component で削除できません。
↑動画のようにアラートダイアログが表示されます。
RequireComponentで指定したコンポーネントを削除したい場合は、次の2つの方法で対処できます。
- RequireComponentをやめる
- RequireComponentを記述したコンポーネントから削除する
このようにRequireComponentを使うとコンポーネントのつけ忘れを回避できるためおすすめ。
ぜひ覚えておきたいコンポーネントテクニックです。
テク②DisallowMultipleComponentでコンポーネントの重複を禁止
1つのGameObjectに複数同じコンポーネントをアタッチしたくないケースがあります。
DisallowMultipleComponent を使うことで実現可能です。
using UnityEngine;
[DisallowMultipleComponent]
public class Test : MonoBehaviour
{
}
上のコードのようにクラスの手前に [DisallowMultipleComponent] を記述します。
↑動画の通り同時に複数の同じコンポーネントのアタッチを禁止します。
DisallowMultipleComponentはスクリプトからの追加も禁止する
DisallowMultipleComponent は一見Unityエディタ上だけの制限に感じますが、実はスクリプトからのAddComponentもブロックします。
Unity実行中に重複してAddComponentしようとする次のログが表示され、コンポーネントも追加されません。
Can't add 'Test' to GameObject because a 'Test' is already added to the game object!
UnityEngine.GameObject:AddComponent<Test> ()
上記はDisallowMultipleComponentを付与したTestコンポーネントをスクリプトから実行したときのログ。
DisallowMultipleComponentは絶対に1つしかコンポーネントをセットしたくないときに便利なのでぜひ覚えておきましょう。
テク③AddComponentMenuでコンポーネントを整理
「使い方①コンポーネントの追加4つの方法」 で紹介した 「方法②メニューComponentから追加」 の続き。
実はこのメニューに自作コンポーネントを追加できます。
やり方はとても簡単。
コンポーネントのクラスの手前に AddComponentMenu を追加するだけです。
例えば上図のメニューを追加する場合は以下のコードになります。
using UnityEngine;
[AddComponentMenu("MyScript/Test")]
public class Test : MonoBehaviour
{
}
[AddComponentMenu("MyScript/Test")]
と記述することでComponentメニューに追加されるのです。
自作コンポーネントが増えてきたときの整理に使えるテクニック です。
テク④存在するかわからないコンポーネントはTryGetComponentの選択肢
コンポーネント取得には GetComponent を使用する紹介をしました。
取得するタイミングで指定のコンポーネントが存在しない場合もありますよね。
そんなときは TryGetComponent の選択肢もあります。
TryGetComponentはコンポーネントの取得に 成功した場合はtrue を 失敗したらfalse を返すメソッドです。
if (TryGetComponent<BoxCollider>(out var collider))
{
// BoxColliderを取得できた
}
else
{
// BoxColliderを取得できなかった(そもそも存在しなかった)
}
↑のように処理を分岐できます。
もちろん前述の取得したコンポーネントのnullチェックでも同様の効果を得られます。
好きな方を選んでください。
どちらを選んでもパフォーマンスに影響はありません。
テク⑤複数のGameObjectに一括でコンポーネントを追加・削除する方法
コンポーネントを複数のGameObjectに一気に追加したくなるときありませんか。
実は可能です。
追加したいGameObjectをHierarchyウィンドウで選択状態にして、コンポーネントを追加。
すると一括で追加できて作業の時短が可能です。
また、削除も同様。
同じコンポーネントを追加している場合は、
複数GameObjectを選択して Remove Component をクリックするだけ。
よく使うテクニックではありませんが、 知っておくと作業時短できる便利なテクニック です。
テク⑤コンポーネントの参照は事前にシリアライズ
「使い方③コンポーネントの取得3つの方法」 で紹介したコンポーネント取得方法ですが、実は事前に取得できるものは取得しておいたほうが良いです。
何を言っているのか分かりづらいかもしれません。
詳しく解説します。
using UnityEngine;
public class Test : MonoBehaviour
{
private BoxCollider _collider;
void Awake()
{
// 自分自身のBoxColliderをUnity実行時に取得
_collider = GetComponent<BoxCollider>();
}
}
上記のコードは下のように置き換えられます。
using UnityEngine;
public class Test : MonoBehaviour
{
// [SerializeField]を記述
[SerializeField]
private BoxCollider _collider;
}
置き換えただけではBoxColliderを取得できたわけではありません。
次のInspectorウィンドウ上で作業が必要です。
上の動画のようにBoxColliderをTestに渡します。
事前に参照をセットすることでコード量が減少、再生時のGetComponent処理負荷もなくなります。
もちろんこのテクニックは事前に参照をセットできるケースに限ります。
動的にゲーム中からコンポーネントを取得したい場合には使えません。
しかし今までのUnity開発11年の経験上、コンポーネントの大半は事前に取得可能です。
今回登場した [SerializeField]
をぜひ使ってみてください。
テク⑥シーン全体検索FindObjectOfType
GetComponent系メソッドのほか、シーン全体を検索する FindObjectOfType というメソッドも存在します。
「使い方③コンポーネントの取得3つの方法」 で紹介した方法は、自分自身、親階層、子階層といった 親族系のGameObjectに限定 されていました。
まったく赤の他人のGameObjectからコンポーネントを検索するためには FindObjectOfType を使います。
下図のとおり FindObjectOfTypeの検索対象はシーン全体 です。
サンプルコードはこちら。
using UnityEngine;
public class Test : MonoBehaviour
{
void Awake()
{
// シーンのどこかに存在するBoxColliderを取得
BoxCollider collider = FindObjectOfType<BoxCollider>();
}
}
FindObjectOfTypeはシーンのどこかに存在するコンポーネントを取得するときに役立つメソッド です。
シーンに複数コンポーネントがある場合はFindObjectsOfType
GetComponent系メソッドと同様、FindObjectOfTypeにも複数コンポーネント取得に対応した 「FindObjectsOfType」 があります。
サンプルコードはこちら。
using UnityEngine;
public class Test : MonoBehaviour
{
void Awake()
{
// シーン内のすべてのBoxColliderを取得
BoxCollider[] colliders = FindObjectsOfType<BoxCollider>();
}
}
シーン内のすべてのBoxColliderを配列で取得できます。
非アクティブコンポーネントを検索除外可能
FindObjectsOfType、FindObjectsOfTypeともに検索対象から非アクティブコンポーネントを除外できます。これはGetComponentInChildrenと同じです。
// FindObjectsOfTypeの引数にtrueをセットすることで非アクティブオブジェクトを除外
BoxCollider[] colliders = FindObjectsOfType<BoxCollider>(true);
やり方は FindObjectOfType または FindObjectsOfType の引数に true
をせっとするだけです。
とても便利なFindObjectOfTypeなのですが注意点もあります。
あわせて記事後半の 「注意点③FindObjectOfTypeはできるだけ使わない」 を読んでみてください。
コンポーネントの注意点4選
コンポーネントの基本的な使い方から、使いこなすテクニックを学んだところで最後にコンポーネントの 注意点 を共有します。
①コンポーネントのnewは禁止
②GetComponentInChildren、GetComponentInParentは最初に見つかったものを取得
③FindObjectOfTypeはできるだけ使わない
④イベント関数のアクセス修飾子は無効
注意点①コンポーネントのnewは禁止
コンポーネントをスクリプトで生成する際に new
を使ってはいけません。
必ず AddComponent を使いましょう。
もしnewを使っていたら、以下のような警告がConsoleウィンドウに表示されます。
You are trying to create a MonoBehaviour using the 'new' keyword.
This is not allowed. MonoBehaviours can only be added using AddComponent().
Alternatively, your script can inherit from ScriptableObject or no base class at all
注意点②GetComponentInChildren、GetComponentInParentは最初に見つかったものを取得
GetComponentInChildrenは子階層、GetComponentInParentは親階層を検索すると解説しました。これらのメソッドは最初に見つかったものを取得します。
重要なのは検索する順番です。
両者ともに 自分自身を起点に近くのGameObjectから検索 します。
上図のように実行オブジェうkとの近くから検索していきます。
複数同じコンポーネントが存在する場合には注意しましょう。
注意点③FindObjectOfTypeはできるだけ使わない
「テク⑥シーン全体検索FindObjectOfType」 で紹介した FindObjectOfType はできるだけ使わない方がよいです。
理由は シーン全体を検索する負荷が高い ため。
シーンに大量のGameObjectがあると目に見えて処理の カクつき が目立ちます。
つまりなめらかに動かなくなり、ユーザーに不快感を与えるのです。
カクカク動くゲームはプレイしてても楽しくないですよね。
そんなゲームは作りたくないです。
そこで、FindObjectOfTypeは使い所を見極めましょう。
ゲームがカクついても問題のない初期化時 や ポーズ といった 画面に動きがないタイミング がよいでしょう。
FindObjectOfTypeは便利です。便利な半面リスクも大きい。
先の解説の通り使い所を見極めることが重要です。
FindObjectOfTypeの他、Find系メソッドの使用はパフォーマンス観点で注意が必要です。
次の記事の中でFind系メソッドの注意点を解説しています。その他Unity開発で注意すべき点をまとめています。ぜひ読んでみてください。
注意点④イベント関数のアクセス修飾子は無効
イベント関数のアクセス修飾子は何でも良いです。
アクセス修飾子とは、クラス、メソッド、変数に付与する publichやprivateといったキーワードです。
これらはクラス、メソッド、変数のアクセス範囲を指定します。
通常使用意図を考慮した上でアクセス修飾子を設定しますが、
イベント関数に関しては無視されます。
public だろうが private だろうが実行されます。
イベント関数を記述するだけで実行されるのです。
イベント関数をpublicメソッドにすると外から実行可能
少し余談ですがコンポーネントが無効(enabledがfalse)でも イベント関数を publicメソッド にして外から実行することは可能です。
// publicメソッドの場合は外から呼べる
public void Start()
{
}
上記のような、 Start メソッドをpublicにした状態です。
コンポーネントをOFFにしているからといって絶対に呼ばれないわけではないことに注意しましょう。
ところでオオバはXでほぼ毎日Unity情報を発信をしています。
コンポーネントのチェックボックス有無について ブログよりも先出しでツイート しました。
しかも 分かりやすく図解 まで用意。
Unity初心者向けに発信していますので、ぜひフォローして有益情報をキャッチしてください。
オオバの Xフォローはこちら。
Unityコンポーネントまとめ
Unityのコンポーネントについて徹底解説しました。
記事の内容を簡単にまとめます。
①コンポーネントとはGameObjectに追加できる機能
②コンポーネントがないとUnity開発は不可能
③コンポーネントの基本的な使い方は追加、削除、取得、ON/OFF
④コンポーネントをさらに使いこなす6つのテクニックを紹介
⑤コンポーネントの使用上の注意点4つを紹介
こんな感じです。
UnityのコンポーネントはUnityで開発する上で最重要です。
コンポーネントを正しく理解することでゲーム開発より効率よく進みます。
この記事はUnity開発で重要なコンポーネントを網羅的に解説しました。
一度読んだだけではすべてを理解できなかったかもしれません。
ぜひ何度も読み返して、コンポーネントの理解を深めてください。そして、同時に手を動かしましょう。GetComponentInChildrenやFindObjectOfTypeなど、実際にどういう挙動するのか体感するのが一番です。
この記事を片手にUnityエディタを動かすのが最短の勉強方法だと思います。
また、冒頭の通り コンポーネントはGameObjectと切っても切れない関係 です。
本記事とあわせてGameObjectについて学ぶとより一層コンポーネントの理解が深まります。
こちらの記事でGameObjectを徹底解説しています。ぜひ読んでみてください。
本ブログでは今後も初心者向けの記事を書いていきますので、注目しておいてください。
この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいUnityライフをお過ごしください。
- Unity2020.3.31f1