You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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)}个没用的材质槽~")

脚本怎么用?

  1. 打开Blender的「脚本编辑器」
  2. 新建个文本文件,把上面的代码粘进去
  3. 选中你要处理的那个网格对象
  4. 点一下运行按钮(就是那个播放图标)

脚本会在控制台输出所有未使用的材质名字,然后自动把对应的槽删掉。倒序删除是关键,不然删了前面的槽,后面的槽索引变了,容易删错。

额外提醒

  • 这个脚本只会删对象的材质槽,不会删材质本身——要是其他对象还在用这些材质,它们会保留着;要是想彻底删掉整个Blender文件里没人用的材质,可以再写个小脚本,遍历所有材质,看users属性是不是0,是的话就删掉。

内容的提问来源于stack exchange,提问作者Student

火山引擎 最新活动