未使用Materialが消える理由と、Fake Userの存在意義
Blenderを使っていると、作ったはずのMaterialやActionが、保存後に消えてしまったように見えることがあります。私もblenderの使い始めから今日にいたるまで,よく理解できないまま1年半を過ごしてきました.
特にMaterialでは、次のような場面で混乱しやすくなります。
Materialを作った
↓
まだObjectに割り当てていない
↓
保存して開き直した
↓
Materialが見当たらない
これは、Blenderの Data-block管理 と関係しています。
Blenderでは、Material、Mesh、Image、Action、Node Groupなどが Data-block として管理されています。これらのData-blockには「実際に使われているかどうか」を示す Users という考え方があります。
公式マニュアルでは、実ユーザーを持たないData-blockは通常、blendファイル保存時にクリーンアップされるため、それを防ぐにはFake Userを付けると説明されています。つまりFake Userは、未使用Data-blockを保存対象として残すための仕組みです。

1. Fake Userを理解する前に:Data-blockとは
Blenderでは、画面上に見えるObjectだけでなく、MaterialやMesh、Image、Actionなども個別のデータとして管理されています。
例えば、1つのキャラクターObjectには、次のようなData-blockが関係します。
Object Data-block
Mesh Data-block
Material Data-block
Image Data-block
Action Data-block
MaterialもData-blockの一種です。
Skin_Mat
Shirt_Mat
Eye_Mat
これらは単なる表示名ではなく、Blenderファイル内で管理されるMaterial Data-blockです。
Blender開発者向けドキュメントでも、ID、つまりData-blockにUsersが0の場合はディスクに保存されず、未使用IDを保持するにはFake User相当のフラグが必要であると説明されています。
2. Usersとは何か
Usersとは、そのData-blockがどこから参照されているかを示す考え方です。
Materialで言えば、ObjectのMaterial SlotにMaterial Dataが入っていれば、そのMaterial DataにはUserがあります。
Object A
Material Slot 0 → Skin_Mat
Skin_Mat
Users = 1
同じMaterial Dataを複数Objectが使っている場合は、Usersが増えます。
Object A Slot 0 → Skin_Mat
Object B Slot 0 → Skin_Mat
Skin_Mat
Users = 2
一方、どのObjectのMaterial Slotにも入っていないMaterial Dataは、Users = 0になります。
Old_Mat
Users = 0
このUsers = 0のData-blockが、保存時やPurge時に問題になります。
3. Blenderでは未使用Data-blockが消えることがある
Blenderでは、Users = 0のData-blockは、通常は保存対象から外れます。
これは一見すると不親切に見えます。
しかし、Blenderでは作業中に多くのData-blockが増えます。
例えば、Materialを試作すると、
Material
Material.001
Material.002
Old_Mat
Test_Shader
のように、使わなくなったMaterialが残りやすくなります。
Mesh、Image、Action、Node Groupも同様です。
もし未使用Data-blockをすべて保存し続ける仕様にすると、.blendファイル内に不要データが蓄積しやすくなります。
そのためBlenderでは、
使われているData-blockは保存する
使われていないData-blockは保存対象から外す
という方向の設計になっています。
4. しかし、未使用でも残したいData-blockがある
問題は、Users = 0でも本当に不要とは限らないことです。
例えば、次のようなMaterialは残したい場合があります。
後で使う予定のMaterial
まだObjectに割り当てていないShader
作り込んだNode構成のMaterial
一時的にObjectから外しているMaterial
また、Actionでも同じです。
作成した歩行Animationや待機Animationが、現在どのObjectにも割り当てられていない場合、Users = 0になることがあります。
しかし、それは不要という意味ではありません。
このような「未使用だが残したいData-block」を守るために使うのが Fake User です。


コメントを残す