1.运行效果
脚本处理前(389个材质)
脚本处理后(5个材质)
2.脚本代码
python
import bpy
# 获取当前选择的对象
selected_objects = bpy.context.selected_objects
# 如果没有选择任何对象,则打印警告并退出
if not selected_objects:
print("未选择任何对象")
exit()
# 遍历每个选中的对象
for obj in selected_objects:
if obj.type == 'MESH': # 仅处理网格对象
print(f"对象 '{obj.name}' 有 {len(obj.material_slots)} 个材质槽")
# 遍历对象的材质槽
material_slots_to_remove = []
for i, material_slot in enumerate(obj.material_slots):
# 获取材质槽绑定的材质
material = material_slot.material
if material:
# 检查是否有任何面使用了这个材质
material_used = False
# 遍历对象的所有面,查看是否有面使用了该材质
for poly in obj.data.polygons:
if poly.material_index == i: # 该面使用了该材质槽的材质
material_used = True
break
# 如果没有面使用该材质,标记该材质槽以待删除
if not material_used:
print(f"标记删除材质槽 {i}:材质 '{material.name}' 没有被任何面使用")
material_slots_to_remove.append(i)
# 进入对象模式(确保不是在编辑模式)
bpy.context.view_layer.objects.active = obj
bpy.ops.object.mode_set(mode='OBJECT') # 切换到对象模式
# 删除标记的未使用的材质槽
for index in reversed(material_slots_to_remove): # 从后往前删除,避免索引变化
# 设置当前活动的材质槽索引
obj.active_material_index = index
bpy.ops.object.material_slot_remove() # 使用 bpy.ops 删除材质槽
# 输出清理完成到控制台
print("已移除未使用的材质槽。")