UnityEditorのオブジェクト管理

Unityでは、ゲームオブジェクト・コンポーネント・素材のファイルなど、個別のデータがありますが、これをどのように管理しているかで、内部の構造を考えてみましょう

サンプルプロジェクト

エディター画面

管理IDを確認するために、インスペクターの表示をDebug表示にします

デバッグ表示

実行結果

SampleScene.unityファイル

yamlというフォーマットで記述されたシーンの管理ファイルになります。
このゲームオブジェクトには、2つのOutletTestスクリプト(コンポーネント)がアタッチされています。
次のコードは、管理ファイルの一部でその2つのコンポーネントを抜き出したものになります。
識別子が912011094912011095であること、
guidがc5691edcde4db4dcbb3d903de2d0299fc5691edcde4db4dcbb3d903de2d0299fであることがわかります。

// 114は、MonoBehaviourを表しています(参考を参照)
--- !u!114 &912011094
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 912011092}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: c5691edcde4db4dcbb3d903de2d0299f, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  hp: 20
--- !u!114 &912011095
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 912011092}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: c5691edcde4db4dcbb3d903de2d0299f, type: 3}
  m_Name: 
  m_EditorClassIdentifier: 
  hp: 100

スクリプト(OutletTest.cs)

using UnityEngine;

public class OutletTest : MonoBehaviour
{
    public int hp;

    void Start()
    {
        Debug.Log("私のHPは、" + hp);
    }
}

スクリプトのメタファイル(OutletTest.meta)

OutletTestは、c5691edcde4db4dcbb3d903de2d0299fですね。

fileFormatVersion: 2
guid: c5691edcde4db4dcbb3d903de2d0299f
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData: 
  assetBundleName: 
  assetBundleVariant: 

解説

guid

重ならないユニークな番号です。これを使うことでファイルを特定することができます

fileID

一つのアセット内での参照で使用されるドキュメントのID。ローカルの情報として利用されます。外部からアクセスする場合、giidとともに使われます。

hp: 20やhp: 100

インスペクターの情報が保存されています。これは、シーンファイルに保存されています。

インスペクターで管理されるデータ

ここでわかるように、今回 hpフィールドの値はシーンファイルに保存されていることがわかります。ファイルなので読み書きできます。(シリアル化されているといいます)
この仕組みで、スクリプトファイルは全く同じ(変更しない)でも、初期代入値を変えることができるため、違う結果を得ることができるのです。

参考

C#,Unity

Posted by hidepon