Unity Prefabの内部構造とサンプルコード解説

この資料では、UnityのPrefabファイルがどのように構成され、どのようにシリアライズされているのかを解説します。また、サンプルコードを通して実際のPrefabファイルの内容を具体的にご紹介します。


1. はじめに

UnityにおけるPrefabは、あらかじめ構成されたゲームオブジェクトやコンポーネントのテンプレートとして、シーン内で何度も再利用できる重要な要素です。Prefabを利用することで、開発効率の向上や一貫性のあるオブジェクト管理が実現できます。


2. Prefabファイルの概要

ファイル形式とシリアライズ

  • YAML形式:
    UnityではPrefabは主にYAML形式で保存されます。これにより、ファイルの内容がテキストとして人間に読みやすく、バージョン管理システム(Gitなど)での差分比較が容易になります。
  • メタデータ:
    各Prefabファイルには、Unity内部で使用される識別子(fileID)やシリアライズバージョン、オブジェクトの状態を示すフラグなどのメタデータが含まれます。

3. Prefabファイルの内部構造

Prefabファイルは、以下のような主要要素から構成されます。

3.1 ルートオブジェクト

  • GameObjectエントリ:
    Prefabの最上位にはGameObjectが定義され、その名前(m_Name)、レイヤー、タグ、アイコンなどの基本プロパティが記述されます。
  • コンポーネントのリスト:
    ルートオブジェクトに紐付けられる各コンポーネント(Transform、レンダラー、カスタムスクリプトなど)が、fileIDを用いてリスト化されています。

3.2 各種コンポーネント

  • Transformコンポーネント:
    すべてのGameObjectには必ず存在し、位置(m_LocalPosition)、回転(m_LocalRotation)、スケール(m_LocalScale)の情報や親子関係を管理します。
  • MonoBehaviourなどのその他コンポーネント:
    例えば、MonoBehaviourはスクリプトの参照(m_Script)など、特有のプロパティを持ちます。各コンポーネントは、ルートGameObjectとの関連をfileIDで管理しています。

3.3 内部参照と依存関係

  • fileIDによる参照:
    Prefab内の各要素は一意のfileIDで参照され、GameObjectとそのコンポーネント間の関係が明確に定義されています。
  • 外部アセットとのリンク:
    Prefabは、スクリプト、マテリアル、テクスチャなどの外部アセットへの参照も含む場合があり、これらは別ファイルとして管理されます。

4. サンプルコードの解説

以下は、UnityのPrefabファイルの内部構造を示す簡略化したYAML形式のサンプルコードです。

%YAML 1.1
--- !u!1 &100100
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 100200}
  - component: {fileID: 100300}
  m_Layer: 0
  m_Name: "MyPrefab"
  m_TagString: "Untagged"
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!4 &100200
Transform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 100100}
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 0, y: 0, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
--- !u!114 &100300
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 100100}
  m_Enabled: 1
  m_Script: {fileID: 11500000, guid: d41d8cd98f00b204e9800998ecf8427e, type: 3}
  m_Name: ""
  m_EditorHideFlags: 0

サンプルコードのポイント

  1. ヘッダーと識別子
    • %YAML 1.1 はYAMLのバージョンを示し、--- !u!1 &100100 はUnity独自の識別子です。ここではGameObjectの定義が始まっていることを示しています。
  2. GameObjectの定義
    • GameObjectエントリでは、Prefabの名前(m_Name: “MyPrefab")やレイヤー、タグなどの基本情報が設定されています。
    • m_Component リストには、このGameObjectに関連付けられるコンポーネントのfileID(TransformとMonoBehaviour)が含まれています。
  3. Transformコンポーネント
    • Transformでは、位置(m_LocalPosition)、回転(m_LocalRotation)、スケール(m_LocalScale)の情報が設定され、どのGameObjectに属しているかがm_GameObjectフィールドで指定されています。
  4. MonoBehaviourコンポーネント
    • MonoBehaviourコンポーネントでは、参照するスクリプトの情報(m_Script)や有効状態(m_Enabled)などが定義されています。実際のプロジェクトでは、ここにユーザーが作成したスクリプトが紐付けられます。

5. まとめ

Prefabファイルは、Unityプロジェクトにおける再利用性と一貫性を実現するための重要な要素です。YAML形式でシリアライズされることにより、開発中の差分管理や変更の追跡が容易になり、GameObjectとそのコンポーネントの階層的な管理が可能となります。今回のサンプルコードと解説を通じて、Prefabファイルの内部構造とその役割について理解を深めていただければ幸いです。


Unity

Posted by hidepon