UnityEditorのオブジェクト管理
Unityでは、ゲームオブジェクト・コンポーネント・素材のファイルなど、個別のデータがありますが、これをどのように管理しているかで、内部の構造を考えてみましょう
サンプルプロジェクト
エディター画面
管理IDを確認するために、インスペクターの表示をDebug表示にします
デバッグ表示
実行結果
SampleScene.unityファイル
yamlというフォーマットで記述されたシーンの管理ファイルになります。
このゲームオブジェクトには、2つのOutletTestスクリプト(コンポーネント)がアタッチされています。
次のコードは、管理ファイルの一部でその2つのコンポーネントを抜き出したものになります。
識別子が912011094と912011095であること、
guidがc5691edcde4db4dcbb3d903de2d0299fとc5691edcde4db4dcbb3d903de2d0299fであることがわかります。
// 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フィールドの値はシーンファイルに保存されていることがわかります。ファイルなので読み書きできます。(シリアル化されているといいます)
この仕組みで、スクリプトファイルは全く同じ(変更しない)でも、初期代入値を変えることができるため、違う結果を得ることができるのです。
ディスカッション
コメント一覧
まだ、コメントがありません