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

お悩みさん
お悩みさん
  • GameObjectって何?
  • GameObjectの使い方を知りたい
  • GameObjectってUnityの基礎?
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Unityを始めるとまず登場するのは GameObject(ゲームオブジェクト)。Unityは 「GameObjectにコンポーネントを追加してゲームを開発していく」 といった説明よく目にしますよね。ただ、Unityを始めたばかりの人はそもそも「GameObject」も「コンポーネント」もどちらもよくわからないと思います。

    オオバもUnityを初めて11年。最初はまったくわかりませんでした。わからないなりにUnityを触り、仕事して慣れていきました。そういうやり方も間違ってはいないと思いますが、 事前知識を得た上で取り組む ほうが確実に「時短」したと断言できます。

    つまり GameObjectとコンポーネントの関係性を頭に入れた上でUnityを始める方が効率的 です。なんとなく始めても大丈夫なんですが、どうしても無駄な時間がかかってしまいます。

    そこで本記事は初心者向けに GameObjectを徹底解説 しました。もちろんGameObjectは「コンポーネントありきの機能」であるため、コンポーネントの話題なしに語ることはできません。GameObject、コンポーネントどちらも登場しますが、 GameObjectにフォーカス してお届けします。

    「コンポーネント」 についてはこちらの記事で詳しく解説していますのでぜひ読んでみてください。

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

    確実に言えること GameObjectとコンポーネントの理解なしに、Unityでのゲーム開発は不可能 だということです。GameObjectの意味や役割を踏まえつつ、基本的な使い方、注意点など 11年のUnity開発経験をふんだんに詰め込みました。

    この記事を読むだけでGameObjectについて 完璧に理解 できると思います。ぜひ最後まで読んでみてください。

    GameObjectとは十徳ナイフの持ち手

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

    GameObjectまとめ

    ①GameObjectとは十徳ナイフの持ち手

    ②GameObjectの動きを定義するのがコンポーネント

    ③GameObjectにはコンポーネントの管理機能を持っている

    例えるなら GameObjectは十徳ナイフの持ち手 です。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_0

    ※イメージ図

    ちなみにナイフやハサミ、栓抜きといった他機能は コンポーネント です。 コンポーネントはGameObjectの用途を定義 します。Unity内でも同じです。ライトやカメラといった機能はGameObjectではありません。これらはあくまでコンポーネント。 GameObjectにセットすることで機能 します。

    十徳ナイフの例の通り、1つのGameObjectに対していくつもコンポーネントを追加できます。つまり GameObjectにはさまざまな機能がいくつも追加できるということ です。ぜひ最初にこの概念を理解しておいてください。

    ここからはGameObjectの特徴、使い方について解説していきます。

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

    GameObjectの特徴4選

    まずはGameObjectの特徴を4つ紹介します。

    GameObjectの特徴

    ①GameObjectはどれも同じ

    ②GameObjectにはON/OFFがある

    ③GameObjectには必ずTransformコンポーネントがセット

    ④GameObjectは階層を作れる

    特徴①GameObjectはどれも同じ

    コンポーネントとの比較になってしまいますが、 「GameObject自体はどれも同じ」 です。逆にコンポーネントは無数に存在するということ。コンポーネントとは「ゲームの機能」。自作もできるため種類は無限大なのです。

    一方GameObjectは1種類しか存在しません。そして、 GameObjectに拡張性はありません。 _GameObject自体をカスタマイズして機能拡張できないということです。機能を拡張するのはコンポーネントの役割です。 _GameObjectはあくまでコンポーネントを受け入れる箱 なのです。

    特徴②GameObjectにはON/OFFがある

    GameObjectにはON/OFFが存在します。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_2

    Inspectorウィンドウのチェックボックスを切り替えることでON/OFFが切り替わります。

    このON/OFFによって コンポーネントの挙動 に影響を与えます。コンポーネントの挙動がどのように変化するか解説していきます。

    GameObjectがOFFになるとコンポーネントも止まる

    コンポーネントには イベント関数 と呼ばれる特殊な関数が用意されています。それらは特定のタイミングでUnity側から自動的に実行されます。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_3

    GameObjectがOFF(非アクティブ)になると、 イベント関数はすべて停止

    例えば毎フレーム実行するイベント関数Updateはどうでしょうか。30FPSなら1秒間に30回実行されます。GameObjectがOFFになると、 Updateも止まる ということです。このように GameObjectはコンポーネントの元栓 の役割も担うのです。

    特徴③GameObjectには必ずTransformコンポーネントがセット

    重要な特徴の1つは、GameObjectには必ず Transformコンポーネント がセットされることです。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_4

    Transformとは位置、回転、拡大縮小を管理する重要なコンポーネント です。つまり、GameObjectは最初から座標や角度を操作する機能を持っている ということです。間違いやすいのは、あくまで Transformコンポーネントの機能 でありGameObject自体の機能ではないということです。

    通常コンポーネントは Destroy または Remove Component で削除できるのですが、 Transformコンポーネントは特別仕様、削除することはできません。

    GameObjectとTransformは密接な関係です。セットで学ぶことでより効率的にUnityを使えるようになります。次の記事は Transformを徹底的に解説 しました。ぜひ本記事とあわせて読んでみてください。

    特徴④GameObjectは階層を作れる

    Transformコンポーネントを常に持つGameObjectは階層を作れます。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_5

    上図がGameObjectの階層化です。

    特徴③GameObjectには必ずTransformコンポーネントがセットで解説した、座標調整の機能と同様、 階層化もTransformコンポーネントの機能 なのです。階層化のメリットはグループ化 。 複数のパーツを一括で動かせます。

    GameObjectグループ化の例

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_6

    例えば画面上UIパーツです。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_7

    複数のGameObjectを グループ化してまとめて動かしたい 場面はよく発生します。とても良く使うテクニックなのでぜひ覚えておきましょう。

    ところでGameObjectをアニメーションさせてゲーム開発します。このアニメーションはどのように作ったら良いでしょうか。Unityが提供する 「AnimationClip」 を使うと初心者でも簡単にアニメーションを作ることができるのです。次の記事ではAnimationClipの始め方を初心者向けに分かりやすく解説しました。本記事とあわせてぜひ読んでみてください。

    GameObjectの基本的な使い方6選

    GameObjectの特徴をつかんだところで、 基本的な使い方 を解説します。

    GameObjectの基本的な使い方6選

    ①GameObjectの取得

    ②コンポーネントの追加と取得

    ③GameObjectのPrefab化

    ④SetActiveでGameObjectのON/OFF切り替え

    ⑤GameObjectの生成

    ⑥GameObjectの削除

    使い方①GameObjectの取得

    Unityを始めて分かりづらい点は GameObjectの取得方法 です。結論から話すとGameObjectは コンポーネントを経由して「GameObjectを取得」 するのです。GameObjectを取得するための手順は3つ。

    1. 自作コンポーネントの作成
    2. 自作コンポーネントをGameObjectに追加
    3. 自作コンポーネント内からGameObjectにアクセス

    取得手順①自作コンポーネントの作成

    自作コンポーネントと聞くと難しく感じるかもしれませんが、Unity開発では日常茶飯事に登場します。ゲームを作る際、Unityプロジェクト内は自作コンポーネントだらけとなるでしょう。

    自作コンポーネントとは自分がGameObjectに追加する独自の機能です。

    あらゆるゲームの機能は自作コンポーネントです。自作コンポーネントの作成は簡単。 MonoBehaviourクラスを継承するだけ です。では一緒にとても簡単な自作コンポーネント(SimpleScript)を作ってみましょう。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_8

    メニューAssets > Create > C# Script からC#スクリプトを作ります。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_9

    ProjectウィンドウにC#スクリプトファイルが作られるため、SimpleScript と名前をつけてVisual Studioなどのエディタで開きます。

    Visual Studioのインストール方法はこちら→【2022年版】Visual StudioをインストールしてUnityで使う方法

    💻ソースコード : SimpleScript.cs
    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
    }
    

    上記のソースコードをコピーします。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_10

    上の動画を参考に 既存コードを削除 してSimpleScript.csを書き換えます。「これだけ?」と思うかもしれませんが、以上で自作コンポーネントは完成です。

    取得手順②自作コンポーネントをGameObjectに追加

    次に先ほど作成した自作コンポーネント「SimpleScript」をGameObjectに追加します。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_11

    上の動画のようにSimpleScriptをGameObjectに追加します。

    取得手順③自作コンポーネント内からGameObjectにアクセス

    自作コンポーネント内からGameObjectを取得するためにソースコードを一部変更します。

    💻ソースコード : SimpleScript.cs
    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
        // 追加箇所  
        void Awake()  
        {
            Debug.Log(gameObject);  
        }
    }
    

    以上のようにソースコードを変更したらUnityを再生しましょう。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_12

    すると Consoleウィンドウ にログが出力されます。

    GameObject (UnityEngine.GameObject)  
    UnityEngine.Debug:Log (object)  
    

    このログの意味は、 自作コンポーネントからGameObjectが取得できている ということです。

    👉 初心者が覚えておくべき11のUnityエディタ機能【Unityの使い方】

    自作コンポーネント内で gameObject と記述することでGameObjectを取得できます。
    ここがUnityの分かりづらい点でもあるのです。

    GameObjectが起点で他のオブジェクトに働きかけると思いがちですが、それは全く逆。
    Unityではコンポーネントが起点となりGameObjectを動かします。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_13

    ソースコード内に登場したAwakeはイベント関数と呼ばれる特殊な関数です。
    自作コンポーネントを作成するとUnityから自動で呼ばれます。

    使い方②コンポーネントの追加と取得

    コンポーネントの追加と取得はコンポーネント側の機能な気がしますが、 実はGameObjectが提供する機能 です。 GameObjectが提供する機能をコンポーネントが使う と説明した方がわかりやすいかもしれません。あくまで コンポーネントの追加と取得はGameObjectの機能 なのです。

    コンポーネントの追加「AddComponent」

    コンポーネントの追加は、 AddComponent を使います。

    using UnityEngine;  
    public class Test : MonoBehaviour  
    {
        // 追加箇所  
        void Awake()  
        {
            // GameObjectにBoxColliderコンポーネントを追加する  
            gameObject.AddComponent<BoxCollider>();  
        }
    }
    

    上のソースコードはBoxColliderコンポーネントをGameObjectに追加するサンプルです。

    AddComponent<コンポーネント名>()  
    

    文法は上の通り。

    ところで「コンポーネントの追加と取得はGameObjectの機能」と解説しました。

    gameObject.AddComponent<コンポーネント名>()  
    

    コンポーネントの追加はGameObjectの機能
    だから gameObject.AddComponent このようにGameObjectに対して実行しているわけです。

    また AddComponentの戻り値は追加したコンポーネントインスタンス

    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
        private void Awake()  
        {
            // AddComponentの戻り値は追加したコンポーネントインスタンス  
            BoxCollider collider = gameObject.AddComponent<BoxCollider>();  
    
            // 追加コンポーネントに処理を加える  
            collider.center = new Vector3(1f, 1f, 0 );  
        }
    }
    

    上のコードは追加したBoxColliderを受け取って center プロパティを編集するサンプルです。コンポーネントは追加して終了することは少なく、追加後コンポーネントの処理を実行したり値を書き換えたりします。ぜひ覚えておきましょう。

    コンポーネントの取得「GetComponent」

    GetComponent メソッドで指定のコンポーネントを取得します。

    using UnityEngine;  
    public class Test : MonoBehaviour  
    {
        // 追加箇所  
        void Awake()  
        {
            // GameObjectに追加されているBoxColliderの取得  
            BoxCollider collider = gameObject.GetComponent<BoxCollider>();  
        }
    }
    

    上のソースコードはBoxColliderコンポーネントを取得するサンプルです。

    GetComponent<コンポーネント名>()  
    

    文法は上の通りです。

    コンポーネントの取得はGameObjectの機能のため、GameObjectに対して実行してもよいのですが、GameObjectを記述するのが面倒くさいですよね。

    // どちらも同じ  
    gameObject.GetComponent<BoxCollider>();  
    GetComponent<BoxCollider>();  
    

    上の通り、GetComponentに関しては gameObject. を省略して GetComponent と記述しても大丈夫です。

    ※内部的には「gameObject.GetComponent」が実行されています。

    子オブジェクトや親オブジェクトの取得

    実は「GetComponent」は 同じ階層のコンポーネント のみ取得可能 です。しかし、特徴④GameObjectは階層を作れるでGameObjectは階層を持つと解説しましたよね。

    Unityでは 子階層親階層 に追加されたコンポーネントも取得する機能も提供されています。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_14

    そのために2つのメソッドが用意されています。

    詳しくはコンポーネント徹底解説記事で解説していますので、ぜひ読んでみてください。

    使い方③GameObjectのPrefab化

    GameObjectを語る上でPrefabを忘れてはいけません。 Prefab とはGameObjectを再利用できる状態にしたもの。つまり PrefabとはGameObjectのこと です。GameObjectとPrefabがごっちゃになりますが、あくまで「再利用できるGameObject」と覚えておいてください。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_15

    上の動画のとおり、PrefabはGameObjectをHierarchyウィンドウからProjectウィンドウにドラッグ・アンド・ドロップすると作成できます。Prefabを生成する方法はPrefabをInstantiateで生成で解説していますので参考にどうぞ。

    また PrefabはUnity開発で必須スキル。 ぜひ覚えておきたいテクニックです。こちらの記事で詳しく解説していますので、参考にしてみてください。

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

    GameObjectは SetActive メソッドでONとOFFを切り替えます。特徴②GameObjectにはON/OFFがあるで解説したとおり、GameObjectにはONとOFFがあります。実際のゲーム開発ではGameObjectの切り替えを実装することは多いです。

    次のコードは 1秒経過したらGameObjectをOFF にするサンプル。

    using UnityEngine;  
    using System.Collections;  
    public class Test : MonoBehaviour  
    {
        IEnumerator Start()  
        {
            gameObject.SetActive(true);  
            // 1秒待機  
            yield return new WaitForSeconds(1f);  
            // GameObjectをOFF  
            gameObject.SetActive(false);  
        }
    }
    

    このプログラムを実行するとInspectorウィンドウのチェックボックスが切り替わります。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_16

    SetActiveの挙動自体は理解できたと思います。ところでGameObjectのONとOFFはどのような影響を与えるのでしょうか。

    大きく2つの影響があります。

    1. イベント関数の実行制御
    2. コルーチンの実行制御

    影響1.イベント関数の実行制御

    コンポーネント内のAwakeやStart、Updateといった関数は「イベント関数」と呼ばれ、Unityから自動的に実行されます。

    GameObjectがOFFの状態ではこれらのイベント関数は一切呼ばれません。
    つまり GameObjectがOFFということは所属するコンポーネントの動作も止まる ということです。

    GaemObjectには SetActive 、コンポーネントには enabled というON/OFFを切り替える似たような機能が実装されています。 一見似ていますが内部的には全く違います。 両者の違いを正しく理解しておかないと 「止まってほしい機能が止まらない」 「無駄に負荷だけ増える」 といったトラブルが起きます。詳しく解説した記事はこちらです。ぜひ読んでみてください。

    影響2.コルーチンの実行制御

    GameObjectのON/OFFで コルーチンの動作が制御 されます。 ONだったら動作 しますし、 OFFは停止

    コルーチンとは非同期処理と呼ばれる関数です。さきほど1秒待機してSetActiveを切り替えました。この「待機」処理にコルーチンは使われています。

    GameObjectのON/OFFはコルーチンの動作に影響を与える ということを覚えておきましょう。

    コルーチンについてはこちらの記事で詳しく解説しています。非同期処理はゲーム開発で必須知識です。ぜひ読んでみてください。

    使い方⑤GameObjectの生成

    新しくGameObjectを作ることはです。この章ではGameObjectの生成方法を紹介します。

    1. Hierarchyウィンドウから生成
    2. InstantiateメソッドでGameObjectを生成

    以上の2つの方法があります。

    生成方法①Hierarchyウィンドウから生成

    Hierarchyウィンドウの +ボタン > Create Empty をクリックします。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_17

    するとGameObjectが生成されます。

    ショートカットキーは以下。

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

    生成方法②「new」キーワードで生成

    スクリプトから生成する方法は2種類あり、1つ目は newキーワード を使います。文法はこちら new GameObject(名前)

    using UnityEngine;  
    public class Test : MonoBehaviour  
    {
        void Awake()  
        {
            // newキーワードで生成  
            GameObject go = new GameObject("shibuya24.info");  
        }
    }
    

    このサンプルコードを実行すると、Hierarchyウィンドウは以下のような挙動になります。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_18

    shibuya24.info の名前を持つ GameObjectが生成 されるのです。

    生成方法③InstantiateメソッドでGameObjectを生成

    スクリプトから生成する2つ目の方法は Instantiate 。引数に渡したGameObjectのインスタンスを複製するメソッドです。

    シーン内のオブジェクトを複製して生成

    シーン内に配置されたGameObjectを複製して生成するサンプルです。

    using UnityEngine;  
    public class Test : MonoBehaviour  
    {
        [SerializeField] GameObject _original;  
    
        void Awake()  
        {
            // Instantiateメソッドで生成  
            GameObject go = Instantiate(_original);  
        }
    }
    

    手順は以下の動画のとおり。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_19

    パラーメータも複製されます。

    PrefabをInstantiateで生成

    PrefabからGameObjectを生成する方法の紹介です。

    基本的にシーン内のGameObjectを複製する方法とPrefabを生成するコードは同じです。複製する元のGameObjectが シーン内か、Projectウィンドウかの違いだけ

    ソースコードはこちら。

    using UnityEngine;  
    public class Test : MonoBehaviour  
    {
        // Prefabをセットする変数  
        [SerializeField] GameObject _prefab;  
    
        void Awake()  
        {
            // Instantiateメソッドで生成  
            GameObject go = Instantiate(_prefab);  
        }
    }
    

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_20

    上の動画のとおり生成するオブジェクトをPrefabにします。Prefabを生成する処理はよく使うので覚えておくと良いでしょう。

    こちらの記事でPrefabの生成方法を解説しました。ぜひ参考にしてみてください。

    使い方⑥GameObjectの削除

    最後は GameObjectの削除方法 の紹介です。Hierarchyウィンドウからの削除、スクリプトから削除する2つの方法があります。

    削除方法①Hierarchyウィンドウから削除

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_21

    削除したいGameObjectを選んで 右クリック > Delete

    よく不要なGameObjectが残って開発効率を下げる時があります。使わなくなったら積極的にGameObjectを整理すると良いでしょう。

    削除方法②スクリプトで削除「Destroy」

    次にスクリプトからGameObjectを削除する方法です。

    Destroy(GameObjectインスタンス);  
    

    Destroyメソッドの引数にGameObjectインスタンスを渡すことで削除します。


    ここまでに何度もGameObjectとコンポーネントの関係性が登場してきました。改めて違いを表にまとめましたので、参考にしてみてください。

    項目GameObjectコンポーネント
    種類1種類無限大
    拡張性なしあり
    単体配置可能不可能
    ON/OFF切り替えありあり

    GameObjectを使いこなすテクニック

    GameObjectをさらに使いこなすテクニックを紹介します。

    GameObjectを使いこなすテクニック

    ①GameObjectに名前をつける

    ②Layer指定でカメラごとの描画分類

    ③tagでGameObjectを分類

    テク①GameObjectに名前をつける

    GameObjectにはそれぞれ名前をつけることができます。というか、ぜひ名前をつけましょう。 おすすめの命名は自作コンポーネントと同名 です。例えばPlayerコンポーネントを作ったら、GameObject名も「Player」とします。

    ごちゃついたHierarchyウィンドウ

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_22

    Hierarchyウィンドウを一覧したとき、コンポーネントを探すのは容易ではありません。そこで自作コンポーネントと同名にすることで 一覧性をアップ させます。

    繰り返しになりますがGameObjectは複数のコンポーネントをセットできる 十徳ナイフの持ち手 。複数のコンポーネントを持ったGameObjectはどっちの名前を採用すればよいかわからなくなります。 つまりGameObjectの名前をコンポーネント名にするというシンプルな解決ができないことも多いです。

    そんなときは、そのGameObjectが ゲーム内でどのような役割 を担っているかを考えましょう。プレーヤーを管理しているのであれば、「PlayerController」、玉を発射するのであれば「BallEmitter」など。

    将来の自分や一緒に働く仲間がGameObjectの名前を見たとき 混乱しない名前をつけることが大事 です。

    テク②Layer指定でカメラごとの描画を分類

    GameObjectは Layer という情報を保持しています。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_23

    Layerはカメラに映る映らないを管理する機能です。 「カリング」 とも呼ばれます。CameraコンポーネントのLayer名とGameObjectのLayer名が一致することで初めてカメラの描画対象になります。

    Cameraコンポーネント側ののLayer設定は Culling Mask(カリングマスク) から指定します。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_24

    なぜLayerでカメラに映る映らないを制御するのかというと、理由の1つはカメラは 複数存在する可能性がある からです。例えば3D背景やキャラクターを表示する 「3D描画用カメラ」 とUIを表示する 「UI描画用カメラ」 を分けることがあります。UIのGameObjectには「UIレイヤー」を指定、3D描画には「3Dレイヤー」を指定するといった感じです。

    その他にも描画のタイミングを遅らせるためにLayerを分けることもあります。ここでは、GameObjectにはLayer設定があるということを覚えておきましょう。

    テク③tagでGameObjectを分類

    GameObjectは「tag(タグ)」という情報を保持しています。tagを使うとGameObjectを簡単に分類できます。tagの設定はとても簡単。Inspepectorウィンドウからプルダウンで選択するだけです。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_25

    tagの追加はプルダウンの一番下「Add Tag」から可能です。「新しいtagの追加方法」で解説しています。

    tagによるオブジェクト分類例

    例えばアクションゲームを作ったとします。以下のようなオブジェクトをtagで分類できるのです。

    大量のオブジェクトを扱う際に活躍する

    tagの活用ケースは 大量のオブジェクトを扱う場合 です。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_26

    敵が味方にぶつかったら色が赤くなるサンプルです。味方のソースコードを抜粋して紹介します。

    // 当たり判定イベント関数  
    void OnTriggerEnter(Collider collider)  
    {
        if (collider.gameObject.CompareWithTag("Enemy")) {  
            // 敵とぶつかった  
            // 赤くする  
        }
    }
    

    当たり判定のイベント関数 OnTriggerEnter を使うとオブジェクトと衝突したときに呼ばれます。引数に衝突したオブジェクトが取得できるため、 tagを比較して処理を分岐させる のです。

    ※当たり判定イベント関数はOnTriggerEnter以外もあります

    タグの比較は CompareWithTag メソッドを使いましょう。

    // パフォーマンス悪い  
    collider.gameObject.tag == "Enemy"  
    

    // パフォーマンス良い  
    collider.gameObject.CompareWithTag("Enemy")  
    

    「CompareWithTag」を使う理由はパフォーマンスが良くなるからです。

    新しいtagの追加方法

    最後に新しいtagの追加方法です。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_27

    上の動画のとおりtagのタブから Add Tag を選択してTagを追加します。

    【注意点】GameObject.Findは使わないほうがいい

    GameObjectを使用する上での注意点を共有します。 GameObject.Find メソッドはできるだけ使用しない方がよいです。GameObject.FindとはGameObject名ででシーン全体から検索する機能です。

    【Unity基礎】GameObjectの使い方(生成や削除など)全て解説_28

    GameObject.Find は上図のようなイメージです。

    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
        private void Awake()  
        {
            // シーン内のGameObject名で検索  
            GameObject hoge = GameObject.Find("Hoge");  
        }
    }
    

    上記のコードでシーン内のすべてのGameObjectから名前で検索します。一見便利そうな機能ですが、おすすめしない理由は2点あります。

    1点目は「パフォーマンス」です。シーン内のファイル数が増えると 検索負荷 が高くなります。それに伴ってゲームのパフォーマンスが低下。カクつきの原因になるのです。 カクつきが気にならないようなタイミング(ロード中や初期化など)であれば検討 しても良いでしょう。基本的には使用しない方針で大丈夫です。

    2点目は「検索の安全性」です。GameObjectの名前は気軽に変更できますし、変更します。つまり、変わりやすい名前を検索するのは事故の元なのです。以前は動いていた処理も、突然動かなくなる。実は GameObject名を変更 したから。といったトラブルが相次ぎます。チーム開発ならなおさらです。

    以上の理由からGameObject.Findの使用は避けたほうがよいです。ちなみにUnityを11年使ってきましたが、実際の業務で採用したことはありません。使わなくてもなんとかなるものなのです。

    UnityのGameObjectまとめ

    UnityのGameObjectについて解説してきました。GameObjectは基本的な機能ではありますが、その概念は初心者には分かりづらいものです。

    GameObjectのまとめ
    • GameObjectは単体では存在するだけで動作しない
    • 追加したコンポーネントがGameObjectを動かす
    • GameObjectはコンポーネントの動作を制御する(元栓の役割)

    感覚的に理解しづらいですよね。そこで簡単に理解するために 「十徳ナイフ」 と例えました。

    このベースの概念を理解した上で、「基本的な使い方」や「使いこなすテクニック」などを紹介してきました。

    繰り返しになりますが、 GameObjectはUnityの基本機能 。Unityがどのような仕組みで動いているかを知ることは開発をする上で非常に重要です。ぜひこの記事を何度も読み直してGameObjectについて理解を深めてください。またセットでコンポーネントについても勉強しましょう。両者は切っても切り離せない関係です。

    コンポーネントについてはこちらの記事で詳しく解説しています。本記事とあわせて読んでもらうとより一層理解が深まると思います。

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

    この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。

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

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

    オススメ記事
    検証環境