5.

Unity Component 完全ガイド — GameObject 構成の中核

編集
この記事の要点
  • Unity の Component は GameObject に機能(描画・物理・スクリプト等)を付与する単位。合成(コンポジション)で機能を組み合わせる設計
  • 標準コンポーネント: Transform(必須)/ MeshRenderer / Collider / Rigidbody / AudioSource
  • 自作スクリプトは MonoBehaviour を継承して書き、ファイル名 = クラス名で Assets/ 配下に置くと自動でアタッチ可能に
  • Inspector の Add Component ボタンから追加。または Drag & Drop / gameObject.AddComponent()
  • 取得は GetComponent() / GetComponents() / GetComponentInChildren()
  • 依存関係宣言は [RequireComponent(typeof(Rigidbody))]。Inspector でシリアライズは public または [SerializeField]

Component とは

Unity の根幹的な設計思想は Entity-Component(実体・部品)パターンです。シーンの全オブジェクトは GameObject という空の入れ物で、そこに様々な Component をアタッチすることで機能を付与します。

たとえば「重力で落ちる箱」は次の組合せ:

  • Transform: 位置(必ず付く)
  • MeshFilter + MeshRenderer: 立方体の見た目
  • BoxCollider: 当たり判定
  • Rigidbody: 物理挙動(重力)

継承ではなく合成(コンポジション)で機能を作るため、再利用性と柔軟性が高いのが特徴です。

標準コンポーネント一覧

カテゴリ主なコンポーネント役割
必須Transform位置・回転・スケール(全 GameObject に付与、削除不可)
描画MeshFilter / MeshRenderer / SkinnedMeshRenderer / SpriteRenderer / LineRendererメッシュ・スプライト・線の描画
物理 3DRigidbody / BoxCollider / SphereCollider / MeshCollider / CharacterController剛体運動・当たり判定
物理 2DRigidbody2D / BoxCollider2D / CircleCollider2D / PolygonCollider2D2D 物理
AudioSource / AudioListener音再生・リスナー
カメラCamera / Cinemachine 系視点・追従
UICanvas / Image / Text / Button / RectTransformUGUI
ライトLight / LightProbeGroup / ReflectionProbe光源・プローブ
スクリプトMonoBehaviour 派生クラス自作の挙動

Add Component で追加

もっとも基本的な操作。GameObject を選択し、Inspector 最下部の Add Component ボタンから:

  1. Inspector の Add Component をクリック
  2. 検索ボックスに名前(例: Rigidbody)を入力
  3. サジェストから選択 → 追加

Project ウィンドウからスクリプト .cs ファイルを Inspector の余白にドラッグしてもアタッチできます。

MonoBehaviour で自作コンポーネント

独自の挙動は MonoBehaviour を継承したクラスとして書きます:

using UnityEngine;

// ファイル名は PlayerController.cs(クラス名と一致)
public class PlayerController : MonoBehaviour
{
    // public 変数は Inspector でシリアライズされる
    public float moveSpeed = 5f;

    // private でも [SerializeField] でシリアライズ可
    [SerializeField] private float jumpPower = 8f;

    private Rigidbody rb;

    // GameObject 生成時に 1 度
    void Awake()
    {
        rb = GetComponent();
    }

    // 毎フレーム呼ばれる
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime);

        if (Input.GetButtonDown("Jump"))
            rb.AddForce(Vector3.up * jumpPower, ForceMode.Impulse);
    }
}

GetComponent でコンポーネント取得

同じ GameObject に付いた他コンポーネントを参照する基本パターン:

// 同 GameObject 上のコンポーネント取得
Rigidbody rb = GetComponent();

// 配列で全部取得
Collider[] cols = GetComponents();

// 子(自分含む)から探す
Animator anim = GetComponentInChildren();

// 親方向に探す
Canvas canvas = GetComponentInParent();

// 取得失敗を判定
if (rb != null)
{
    rb.AddForce(Vector3.up);
}

// TryGetComponent(取得失敗のチェックが綺麗、2019.2+)
if (TryGetComponent(out var rb2))
{
    rb2.AddForce(Vector3.up);
}

パフォーマンスTip: GetComponent は重いので、Update 内で毎回呼ぶのは避けて Awake / Start でキャッシュします。

RequireComponent 属性

「このスクリプトを動かすには、必ず Rigidbody も同 GameObject に必要」を宣言できます:

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(Collider))]
public class Bullet : MonoBehaviour
{
    private Rigidbody rb;
    void Awake() => rb = GetComponent();
}

このスクリプトをアタッチすると、Rigidbody と Collider が無ければ自動で追加されます。逆に手動で削除しようとすると警告が出ます。

有効・無効の切替

Inspector のコンポーネント名の左にあるチェックボックスで有効/無効を切替できます。スクリプトからは:

// コンポーネント単位で無効化
GetComponent().isKinematic = true;     // 物理停止
GetComponent().enabled = false;     // 描画停止
GetComponent().enabled = false;         // 当たり判定停止
GetComponent().enabled = false;           // スクリプトの Update を停止

// GameObject 全体を無効化(含まれる全コンポーネントが無効)
gameObject.SetActive(false);

AddComponent で動的追加

// 実行中にコンポーネントを追加
var rb = gameObject.AddComponent();
rb.mass = 5f;
rb.useGravity = true;

// 削除
Destroy(GetComponent());

Inspector でのシリアライズ

変数を Inspector に表示・編集可能にするにはシリアライズ可能な型である必要があります:

修飾子Inspector 表示外部アクセス
publicありあり
[SerializeField] privateありなし(推奨)
privateなしなし
public [HideInInspector]なしあり

シリアライズ可能型: 基本型 / Unity 型(Vector3, Color, Transform 等)/ 配列・List / [Serializable] 付き class・struct。

FAQ

Q: GameObject と Component の違いは?
A: GameObject はただの入れ物(名前と Transform)で、機能は全て Component が担う。「箱」と「中身」の関係。

Q: 同じコンポーネントを 2 つ付けたい
A: 一般に標準コンポーネント(Rigidbody / Camera 等)は 1 つだけ。スクリプトは複数可。設計を見直して 1 つにまとめる方が良いことが多いです。

Q: Inspector で変更しても再生時に反映されない
A: 再生中の変更は再生終了時に元に戻る Unity の仕様。再生前に変更、または ScriptableObject に保存。

編集
Post Share
子ページ
  1. メッシュ
同階層のページ
  1. Unityの導入方法
  2. エディタ(画面)の説明
  3. プロジェクトの作成と削除
  4. オブジェクト
  5. コンポーネント
  6. スクリプト
  7. アセットのインポート方法
  8. ゲームの実行/一時停止/コマ送り
  9. パッケージのインポート
  10. ゲームの公開(Build)方法
  11. 重力の変更
  12. 用語集
  13. エラー一覧
  14. おすすめアセット一覧