はじめに
Blenderで複数のオブジェクトを扱っていると、マテリアルが意図せず複製され、.001
.002
といった接尾辞付きのコピーが大量に生成されてしまうことがあります。
特に、オブジェクトを複製したりリンクを解除した際に、自動でマテリアルが複製されることはよくあります。
こうしたマテリアルのコピーがシーン全体に散らばってしまうと、手作業でひとつずつ元のマテリアルに戻すのは非常に手間がかかります。
そこで、Pythonスクリプトによって指定したマテリアル名に一括で置き換える方法を紹介します。
本記事では、完全一致でマテリアルを置き換える方法と、部分一致で置き換える方法の2種類のスクリプトを紹介します。用途に応じて使い分けてください。
このスクリプトを使う場面
このスクリプトは、以下のような状況で役立ちます:
- マテリアルのコピーが大量にあり、手動で置き換えて統一するのが困難なとき
- オブジェクトの複製やリンク解除によって
.001
,.002
付きのマテリアルがバラバラとしてしまったとき - 他人から受け取ったBlenderファイルを整理したいとき
- GLB/FBXなどで書き出す前に、マテリアル名を明示的に統一しておきたいとき
特にWebやゲームエンジン向けの出力においては、マテリアルの数が増えると管理が大変だったり、そのまま使用するとパフォーマンス負荷に影響が出ることがあります。
そうしたケースでは、不要なコピーを除去し、必要なマテリアルだけに統一することが推奨されます。
スクリプトの使い方
以下のどちらかのスクリプトをBlenderの「テキストエディタ」エリアに貼り付けて、「スクリプトを実行」するだけで動作します。
スクリプトの使い方について知りたい場合は以下の記事をご参照ください。

事前準備
スクリプト内の以下の変数を自分の環境に合わせて書き換えてください:
target_material_name
またはtarget_material_partial
:置き換え対象となるマテリアル名またはその一部replace_material_name
:差し替えたいマテリアル名
書き換え例:
- もし、”Red_Metal.001″ というマテリアルを “Red_Metal” に戻したい場合:
target_material_name = "Red_Metal.001" replace_material_name = "Red_Metal"
- 複数のコピー(”Red_Metal.001″, “Red_Metal.002” など)を一括置換したい場合:
target_material_partial = "Red_Metal." replace_material_name = "Red_Metal"
これで、スクリプトが該当するマテリアル名を検出して、指定した元のマテリアルに置き換えます。
完全一致で置き換える
マテリアル名が完全に一致しているものだけを置き換えたい場合には、以下のスクリプトを使用します。
import bpy
target_material_name = "Material.001"
replace_material_name = "Material"
target_mat = bpy.data.materials.get(target_material_name)
replace_mat = bpy.data.materials.get(replace_material_name)
if target_mat and replace_mat:
for obj in bpy.data.objects:
if obj.type == 'MESH':
for i, mat in enumerate(obj.data.materials):
if mat == target_mat:
obj.data.materials[i] = replace_mat
このスクリプトでは、マテリアルが完全に “Material.001” という名前である場合のみ、それを “Material” に置き換えます。
部分一致で置き換える(注意が必要)
マテリアル名が部分的に一致するもの(たとえば “Material.001” や “Material.002” など)を一括で置き換えたい場合は、以下のスクリプトを使用します。
import bpy
target_material_partial = "Material.00"
replace_material_name = "Material"
replace_mat = bpy.data.materials.get(replace_material_name)
if replace_mat:
for obj in bpy.data.objects:
if obj.type == 'MESH':
for i, mat in enumerate(obj.data.materials):
if mat and target_material_partial in mat.name:
obj.data.materials[i] = replace_mat
このスクリプトでは、すべてのオブジェクトのマテリアルスロットを検索し、”Material.00″ を名前に含むマテリアルを “Material” に置き換えます。
注意点: 部分一致は非常に強力ですが、意図しないマテリアルも含まれてしまう可能性があるため、慎重に利用してください。事前に対象マテリアルの名前パターンを確認することをおすすめします。
おわりに
Blenderでマテリアルのコピーが自動で増えてしまうのは、制作工程上よくある現象です。
しかし、適切に整理されていないマテリアルが多いと、後工程での出力やレンダリングに支障をきたすことがあります。
今回紹介したスクリプトを活用すれば、こうした煩雑なマテリアル管理を効率的に行うことができます。
特に大量のアセットを扱うプロジェクトや、他人のBlenderファイルを再利用する際などには、マテリアルの統一処理として非常に有用です。
ぜひ自身のプロジェクトに取り入れて、ベストなBlender環境を整えてみてください。