タイトル: コンポーネント
SEOタイトル: Unity Component 完全ガイド — GameObject 構成の中核
| この記事の要点 |
|
Component とは
Unity の根幹的な設計思想は Entity-Component(実体・部品)パターンです。シーンの全オブジェクトは GameObject という空の入れ物で、そこに様々な Component をアタッチすることで機能を付与します。
たとえば「重力で落ちる箱」は次の組合せ:
- Transform: 位置(必ず付く)
- MeshFilter + MeshRenderer: 立方体の見た目
- BoxCollider: 当たり判定
- Rigidbody: 物理挙動(重力)
継承ではなく合成(コンポジション)で機能を作るため、再利用性と柔軟性が高いのが特徴です。
標準コンポーネント一覧
| カテゴリ | 主なコンポーネント | 役割 |
|---|---|---|
| 必須 | Transform | 位置・回転・スケール(全 GameObject に付与、削除不可) |
| 描画 | MeshFilter / MeshRenderer / SkinnedMeshRenderer / SpriteRenderer / LineRenderer | メッシュ・スプライト・線の描画 |
| 物理 3D | Rigidbody / BoxCollider / SphereCollider / MeshCollider / CharacterController | 剛体運動・当たり判定 |
| 物理 2D | Rigidbody2D / BoxCollider2D / CircleCollider2D / PolygonCollider2D | 2D 物理 |
| 音 | AudioSource / AudioListener | 音再生・リスナー |
| カメラ | Camera / Cinemachine 系 | 視点・追従 |
| UI | Canvas / Image / Text / Button / RectTransform | UGUI |
| ライト | Light / LightProbeGroup / ReflectionProbe | 光源・プローブ |
| スクリプト | MonoBehaviour 派生クラス | 自作の挙動 |
Add Component で追加
もっとも基本的な操作。GameObject を選択し、Inspector 最下部の Add Component ボタンから:
- Inspector の Add Component をクリック
- 検索ボックスに名前(例:
Rigidbody)を入力 - サジェストから選択 → 追加
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
パフォーマンス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 に保存。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。
