如何用Python删除单个对象未使用材质及生成未使用材质列表
搞定对象未使用材质的删除问题
嘿,我明白你遇到的情况——合并分离后对象堆了一堆材质槽,一半都没被实际用到,手动删太麻烦对吧?下面分两种方法帮你解决,还有Python脚本批量处理的方案:
一、先搞懂怎么判断材质真的没被使用
每个材质槽对应着网格里用它的面数,要是某个槽的面数是0,那这个材质就是完全没被用到的,放心删就行。
二、手动处理(适合材质不多的情况)
- 选中目标对象,切到编辑模式
- 打开右侧属性面板的「材质」标签(那个球体图标)
- 挨个点材质槽,面板底部会显示「使用中的面数」:要是显示0,直接点槽右边的「X」删掉
- 也可以在物体模式下,右键点未使用的材质槽,选「删除」就行
三、Python脚本批量搞定(高效处理大量材质)
这个脚本会帮你自动生成未使用材质的列表,还能一键删除对应的槽:
import bpy # 拿当前选中的对象(记得只选你要处理的那个网格对象哦) obj = bpy.context.active_object if not obj or obj.type != 'MESH': print("先选中一个网格对象再运行脚本哈!") else: unused_materials = [] # 遍历所有材质槽,统计每个槽的使用面数 for slot in obj.material_slots: # 数清楚这个材质槽对应的面有多少 face_count = 0 for poly in obj.data.polygons: if poly.material_index == slot.index: face_count += 1 if face_count == 0: unused_materials.append(slot.material.name) # 打印未使用的材质列表 print("\n未使用的材质清单:") for mat_name in unused_materials: print(f"- {mat_name}") # 倒序删除未使用的槽(避免删前面的槽导致后面的索引乱掉) for i in reversed(range(len(obj.material_slots))): face_count = 0 for poly in obj.data.polygons: if poly.material_index == i: face_count += 1 if face_count == 0: obj.active_material_index = i bpy.ops.object.material_slot_remove() print(f"\n搞定啦!一共删了{len(unused_materials)}个没用的材质槽~")
脚本怎么用?
- 打开Blender的「脚本编辑器」
- 新建个文本文件,把上面的代码粘进去
- 选中你要处理的那个网格对象
- 点一下运行按钮(就是那个播放图标)
脚本会在控制台输出所有未使用的材质名字,然后自动把对应的槽删掉。倒序删除是关键,不然删了前面的槽,后面的槽索引变了,容易删错。
额外提醒
- 这个脚本只会删对象的材质槽,不会删材质本身——要是其他对象还在用这些材质,它们会保留着;要是想彻底删掉整个Blender文件里没人用的材质,可以再写个小脚本,遍历所有材质,看
users属性是不是0,是的话就删掉。
内容的提问来源于stack exchange,提问作者Student




