こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • Unityのコンポーネントって何?
  • コンポーネントの使い方が知りたい
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    コンポーネントとはGameObjectに追加する機能

    はじめに結論を簡単にまとめます。

    コンポーネントとはGameObjectに追加する機能

    ①コンポーネントはGameObjectに追加できる機能

    ②コンポーネントは追加、削除可能

    ③コンポーネントはいくつでもGameObjectに追加可能

    ④GameObjectにアタッチされたコンポーネント一覧を取得可能

    Unityのコンポーネントとは GameObjectに追加する機能のこと ですが、
    もっと分かりやすく例えると、十徳ナイフの「ナイフ」です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_0

    ※イメージ図

    GameObjectに対していくつも機能を追加できます。

    ゲーム開発では独自の機能をGameObjectに追加することになりますが、
    その 「独自機能」もコンポーネント なのです。

    つまりコンポーネントの理解はゲーム開発においてかなり重要。
    本記事では コンポーネントの基本的な使い方から使いこなすテクニック、使用上の注意点まで網羅しています。
    これを読むだけでコンポーネントについては完璧に理解できると思います。

    ぜひ最後まで読んでみてください。


    コンポーネントはGameObjectと切っても切れない関係 です。
    GameObjectについてはこちらの記事で詳しく解説しています。
    ぜひあわせて読んでみてください。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    コンポーネントとは?

    「コンポーネント」とはGameObjectに追加する機能 のこと。
    具体的には以下です。

    など。

    普段「カメラ」や「ライト」と言っている機能たちはすべて 「コンポーネント」 です。

    最初にGameObjectとコンポーネントを十徳ナイフに例えました。
    コンポーネントは「ナイフ」部分にあたります。
    GameObject1つに対してコンポーネントはいくつも追加可能

    「カメラを機能をもったライト」も作れますし、
    「ボタン機能を持ったキャラクター」も作れます。

    UnityはコンポーネントをGameObjectに追加することで、
    ゲームの機能を自由に作ることができる のです。

    コンポーネント3つの特徴

    コンポーネントのことがなんとなくわかってきましたね。
    この章ではコンポーネントの特徴を紹介します。

    コンポーネントの特徴

    ①コンポーネントはGameObjectに追加することができる

    ②自作のコンポーネントにはMonoBehaviourが必要

    ③同じコンポーネントを複数追加可能

    特徴①コンポーネントはGameObjectに追加することができる

    コンポーネントの最大の特徴はGameObjectに追加することができること です。

    裏を返せば、コンポーネントは単体では何もできません。
    GameObjectに追加することで初めて機能します

    大事なことなのでもう一度言います。

    「コンポーネントはGameObjectに追加して初めて機能します」
    コンポーネントだけを配置することはできない のです。

    この感覚を最初に身に着けておくとUnity開発が楽になります。

    特徴②自作のコンポーネントにはMonoBehaviourが必要

    コンポーネントは開発者自身も作れます。
    キャラクターの制御やゲームロジックなど。
    いわゆるゲームの機能開発です。

    このような自作コンポーネントには MonoBehaviour を使います。
    MonoBehaviourクラスを継承することで自作コンポーネントをGameObjectに追加できる のです。

    MonoBehaviourはUnityの根幹機能
    MonoBehaviourの理解なしにゲーム開発はできません。
    詳しくはこちらの記事で徹底解説しています。
    ぜひ読んでみてください。

    特徴③同じコンポーネントを複数追加可能

    1つのGameObjectに同じコンポーネントをいくつも追加可能です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_1

    上の動画のとおりいくつも同じコンポーネントを追加できます。

    同じコンポーネントでもそれぞれ独立 しています。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_2

    コンポーネントごとに 別々の値 を持つことができるのです。

    1コンポーネントに対して、1つGameObjectを作ってしまいがちですが、
    複数同じコンポーネントをつけられることを覚えておきましょう。

    また、 「コンポーネントを1つだけしかつけたくない」 場合もありますよね。
    後述する 「テク②DisallowMultipleComponentでコンポーネントの重複を禁止」 で実現可能ですので安心してください。

    コンポーネントの基本的な使い方4選

    コンポーネントの基本的な使い方を4つ解説します。

    コンポーネントの基本的な使い方4選

    ①コンポーネントの追加

    ②コンポーネントの削除

    ③GetComponentでコンポーネントの取得

    ④enabledでON/OFFの切り替え

    使い方①コンポーネントの追加4つの方法

    最初に覚えておきたい使い方はGameObjectにコンポーネントを追加する方法です。
    実はコンポーネントを追加する方法は4つあります。

    方法①InspectorウィンドウのAddComponentボタン

    InspectorウィンドウからAddComponentボタンで追加可能です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_3

    インスペクタから直接指定できるため分かりやすくよく使います。

    方法②メニューComponentから追加

    メニュー Component からコンポーネントを追加する方法。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_4

    追加したいGameObjectを事前に選択しておく必要があります。

    方法③Projectウィンドウからドラッグアンドドロップ

    Projectウィンドウからドラッグアンドドロップ する方法

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_5

    独自コンポーネントを追加する際はとても感覚的で便利。
    個人的によく使います。

    方法④スクリプトで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ウィンドウから削除する方法です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_6

    上の動画のように削除したいコンポーネントのメニューから
    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で動かすと以下のような動きになります。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_7

    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を取得しています。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_8

    上図のように MyComponent と同じGameObjectに BoxCollider がアタッチされている場合に取得可能です。

    GetComponetしてもコンポーネントが取得できない場合

    GameObjectにコンポーネントがあらかじめアタッチされていない場合もあります。
    その場合は、GetComponentの戻り値はnullです。

    nullの場合は新たにコンポーネントをアタッチしたい がときありますよね。
    以下のサンプルで解決できます。

    // コンポーネント(BoxCollider)の取得  
    BoxCollider collider = GetComponent<BoxCollider>();  
    
    // 存在しない場合は新たに生成する  
    if (collider == null) {  
        collider = gameObject.AddComponent<BoxCollider>();  
    }
    

    BoxColliderが存在しなかった場合は新たにAddComponent しています。

    よく使う手法なので覚えておきましょう。

    複数同じコンポーネントを取得する場合はGetComponents

    さきほどの解説はあくまでコンポーネントが1つしか存在しない場合の話でした。
    「コンポーネントの特徴」で解説したとおり、同じコンポーネントを複数アタッチすることが可能です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_9

    これらの同じコンポーネントを1度にすべて取得する方法を紹介します。

    結論 GetComponents メソッドです。
    GetComponentと似ていますが、最後に「s」が付いているに注意。

    💻ソースコード : GetComponentsで複数コンポーネント取得
    using UnityEngine;  
    
    public class MyComponent : MonoBehaviour  
    {
        void Awake()  
        {
            // コンポーネントを配列で取得  
            MyComponent[] components = GetComponents<MyComponent>();  
        }
    }
    

    上のソースコードのとおり、 GetComponents を使ってコンポーネントを配列で取得できました。

    取得方法②GetComponentInChildren

    GameObjectは以下の図のとおり 階層 を持てます。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_10

    先ほど紹介した GetComponent は1階層分のコンポーネントしか取得できません。
    これから紹介する GetComponentInChildren を使うと 子階層のコンポーネントも取得可能

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_11

    子階層にBoxColliderを配置した構成です

    最下層のBoxColliderを最上位のMyComponentから取得するサンプルはこちら。

    using UnityEngine;  
    public class MyComponent : MonoBehaviour  
    {
        void Awake()  
        {
            // 子階層のBoxColliderを取得する  
            BoxCollider collider = GetComponentInChildren<BoxCollider>();  
        }
    }
    

    GetComponentInChildren メソッドを使うと簡単に取得できます。

    【注意点】GetComponentInChildrenは自分自身も対象

    GetComponentInChildrenは名前のとおり子階層のみを対象と思いがちですが、実は 自分自身も検索対象 です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_12

    上図の通り GetComponentInChildrenの検索範囲は自分自身を含む子階層 であることに注意してください。

    非アクティブなコンポーネントを検索から除外する方法

    GetComonentInChildrenを使って子階層のコンポーネントを取得しました。
    場合によっては 非アクティブなコンポーネントは除外したい こともあります。

    つまり以下の図のような感じです。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_13

    非アクティブなGameObjectのコンポーネントは検索対象から外すということです。

    やり方は簡単。
    GetComponentInChildrenの引数に true を代入します。

    // 引数にtrueを代入して非アクティブコンポーネントを除外  
    BoxCollider collider = GetComponentInChildren<BoxCollider>(true);  
    

    すると非アクティブGameObjectのBoxColliderは 検索対象から除外されます。

    注意点が1つ。検索対象から除外されるのは、あくまで「非アクティブなGameObject」です。
    コンポーネントだけが非アクティブな状態では検索対象から除外されません。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_14

    上図のとおりコンポーネントのチェックが外れているだけでは検索対象から除外されないので注意です。

    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>();  
        }
    }
    

    以下の図のように自分より親階層のコンポーネントを取得します。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_15

    GetComponentInParentも他のメソッドと同様、
    「GetComponentsInParent」 を使うことで複数コンポーネントを取得できます。

    使い方④enabledでON/OFFの切り替え

    コンポーネントにはON/OFFが存在します。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_16

    ↑動画のようにInspectorウィンドウでのコンポーネント名のチェックボックスのON/OFFです。

    このON/OFFが何に影響をあたえているのかというと、
    StartやUpdateといった特定のイベント関数 です。

    チェックを外すとこれらのイベント関数が実行されなくなるのです。
    この辺り、もう少し詳しく解説します。

    コンポーネントのチェックボックスには表示条件がある

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_17

    特定のイベント関数を記述していないとチェックボックスは表示されません。

    特定のイベント関数は全部で7つ。

    これらの関数を記述しているとチェックボックスが表示されるのです。

    前述のとおりチェックボックスはenabledプロパティで制御されます。
    このenabledプロパティが制御する範囲は、
    先に紹介した7つのイベント関数。

    チェックを外すとUnityから自動で実行されることはなくなります。

    コンポーネントを使いこなす6つのテクニック

    コンポーネントの基本的な使い方を押さえたところで、
    さらに使いこなす6つのテクニックを紹介します。

    コンポーネントを使いこなす6つのテクニック

    ①RequireComponentで必ずアタッチするコンポーネントを指定

    ②DisallowMultipleComponentでコンポーネントの重複を禁止

    ③AddComponentMenuでコンポーネントを整理

    ④存在するかわからないコンポーネントはTryGetComponentの選択肢

    ⑤複数のGameObjectに一括でコンポーネントを追加・削除する方法

    テク①RequireComponentで必ずアタッチするコンポーネントを指定

    必ずセットで追加したいコンポーネントはRequireComponentを使うと便利 です。

    AddComponentしたときに必ずセットで追加されるコンポーネントってありますよね。
    例えば Imageコンポーネント です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_18

    上の動画のとおり Imageコンポーネントを追加すると同時にCanvasRendererコンポーネントも追加 されます。

    セットで追加される機能は RequireComponent を使うと開発者自身も簡単に実現できるのです。
    手順は簡単。

    クラス定義部分に [RequireComponent(typeof(コンポーネント名))] と記述するだけ。

    サンプルとしてAddComponentしたら「BoxCollider」がセットされる自作コンポーネントを作ってみます。
    ソースコードは以下。たったの4行です。

    using UnityEngine;  
    [RequireComponent(typeof(BoxCollider))]  
    public class Test : MonoBehaviour  
    {
    }
    

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_19

    すると、このようにTestをAddComponentするとBoxColliderがセットされます。

    もちろんBoxColliderのようなUnityが用意したコンポーネントだけではなく、
    自作のコンポーネントもRequireComponent可能です。

    using UnityEngine;  
    [RequireComponent(typeof(MyButton))]  
    public class Test : MonoBehaviour {  
    }
    

    ↑自作のMyButtonコンポーネントをRequireComponentした例です。

    RequireComponentで指定したコンポーネントは削除できない

    RequireComponent で指定したコンポーネントは Remove Component で削除できません。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_20

    ↑動画のようにアラートダイアログが表示されます。

    RequireComponentで指定したコンポーネントを削除したい場合は、次の2つの方法で対処できます。

    このようにRequireComponentを使うとコンポーネントのつけ忘れを回避できるためおすすめ。
    ぜひ覚えておきたいコンポーネントテクニックです。

    テク②DisallowMultipleComponentでコンポーネントの重複を禁止

    1つのGameObjectに複数同じコンポーネントをアタッチしたくないケースがあります。
    DisallowMultipleComponent を使うことで実現可能です。

    using UnityEngine;  
    [DisallowMultipleComponent]  
    public class Test : MonoBehaviour  
    {
    }
    

    上のコードのようにクラスの手前に [DisallowMultipleComponent] を記述します。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_21

    ↑動画の通り同時に複数の同じコンポーネントのアタッチを禁止します。

    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 を追加するだけです。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_22

    例えば上図のメニューを追加する場合は以下のコードになります。

    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に一気に追加したくなるときありませんか。
    実は可能です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_23

    追加したいGameObjectをHierarchyウィンドウで選択状態にして、コンポーネントを追加。
    すると一括で追加できて作業の時短が可能です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_24

    また、削除も同様。
    同じコンポーネントを追加している場合は、
    複数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ウィンドウ上で作業が必要です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_25

    上の動画のようにBoxColliderをTestに渡します。
    事前に参照をセットすることでコード量が減少、再生時のGetComponent処理負荷もなくなります。

    もちろんこのテクニックは事前に参照をセットできるケースに限ります。
    動的にゲーム中からコンポーネントを取得したい場合には使えません。

    しかし今までのUnity開発11年の経験上、コンポーネントの大半は事前に取得可能です。
    今回登場した [SerializeField] をぜひ使ってみてください。

    テク⑥シーン全体検索FindObjectOfType

    GetComponent系メソッドのほか、シーン全体を検索する FindObjectOfType というメソッドも存在します。

    「使い方③コンポーネントの取得3つの方法」 で紹介した方法は、自分自身、親階層、子階層といった 親族系のGameObjectに限定 されていました。

    まったく赤の他人のGameObjectからコンポーネントを検索するためには FindObjectOfType を使います。

    下図のとおり FindObjectOfTypeの検索対象はシーン全体 です。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_26

    サンプルコードはこちら。

    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選

    コンポーネントの基本的な使い方から、使いこなすテクニックを学んだところで最後にコンポーネントの 注意点 を共有します。

    コンポーネントの注意点4選

    ①コンポーネントのnewは禁止

    ②GetComponentInChildren、GetComponentInParentは最初に見つかったものを取得

    ③FindObjectOfTypeはできるだけ使わない

    ④イベント関数のアクセス修飾子は無効

    注意点①コンポーネントのnewは禁止

    コンポーネントをスクリプトで生成する際に new を使ってはいけません。
    必ず AddComponent を使いましょう。

    もしnewを使っていたら、以下のような警告がConsoleウィンドウに表示されます。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_27

    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から検索 します。

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_28

    【保存版】Unityのコンポーネント徹底解説【Unity基礎】_29

    上図のように実行オブジェう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のコンポーネントについて徹底解説しました。

    記事の内容を簡単にまとめます。

    Unityコンポーネントまとめ

    ①コンポーネントとはGameObjectに追加できる機能

    ②コンポーネントがないとUnity開発は不可能

    ③コンポーネントの基本的な使い方は追加、削除、取得、ON/OFF

    ④コンポーネントをさらに使いこなす6つのテクニックを紹介

    ⑤コンポーネントの使用上の注意点4つを紹介

    こんな感じです。

    UnityのコンポーネントはUnityで開発する上で最重要です。
    コンポーネントを正しく理解することでゲーム開発より効率よく進みます。

    この記事はUnity開発で重要なコンポーネントを網羅的に解説しました。
    一度読んだだけではすべてを理解できなかったかもしれません。

    ぜひ何度も読み返して、コンポーネントの理解を深めてください。そして、同時に手を動かしましょう。GetComponentInChildrenやFindObjectOfTypeなど、実際にどういう挙動するのか体感するのが一番です。

    この記事を片手にUnityエディタを動かすのが最短の勉強方法だと思います。

    また、冒頭の通り コンポーネントはGameObjectと切っても切れない関係 です。
    本記事とあわせてGameObjectについて学ぶとより一層コンポーネントの理解が深まります。
    こちらの記事でGameObjectを徹底解説しています。ぜひ読んでみてください。

    本ブログでは今後も初心者向けの記事を書いていきますので、注目しておいてください。
    この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。

    「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
    ぜひチャンネル登録をお願いします!

    最後まで読んでいただきありがとうございました!
    すばらしいUnityライフをお過ごしください。

    オススメ記事
    検証環境