Maya 文件打开越来越慢、保存后体积异常膨胀,很多人第一反应是“模型面数太多、贴图太大”。但实际排查下来,真正压垮场景的往往是另一类东西:插件卸载后遗留的 unknown 节点、没有物体引用的空 ShadingEngine、被误操作保留在模型上的 construction history,以及从外部工具导入资产时生成的一堆无用 Group 和命名空间。这类内容就是比较典型的“Maya 垃圾节点”,也正好是“Maya 文件清理工具”要解决的问题。
这篇文章不会去介绍某个只有网盘链接、没有源码逻辑的“神秘清理神器”,而是给出一个可以直接在 Maya 脚本编辑器里跑的清理脚本方案。它一方面能扫描 unknown 节点和空材质组,另一方面也提供 dry-run 预览、安全黑名单、对象历史清理、场景批量处理等能力。整个思路不依赖 GPU,主要考验 CPU 和内存,也不要求高版本 Maya,常见的 Maya 2022 及以上版本都可以按本文流程操作。
如果你正在做动画、绑定、灯光或者资产入库环节,经常遇到“源文件只有 30MB,存一次变成 200MB”的情况,这篇文章建议收藏备用。下面我会先讲清楚垃圾节点的来源,再给出完整的工具脚本、功能测试方法、批量清理流程、资源占用观察方式,以及删除节点后导致的常见报错该怎么排查。
1. Maya 文件清理工具核心能力速览
先把这套清理方案的关键能力梳理清楚。下表只列核心项目,具体每项在后面的章节展开。
| 能力项 | 说明 |
|---|---|
| 工具类型 | Maya 文件/场景清理脚本集,适合作为资产入库前检查工具 |
| 核心功能 | unknown 节点扫描、空 ShadingEngine 清理、孤立场景节点删除、construction history 清理、命名空间收尾 |
| 启动方式 | Maya 脚本编辑器执行、Shelf 按钮、Maya Batch 命令行 |
| 是否支持 dry-run | 支持。可以先只打印不删除,确认结果后再执行 |
| GPU 依赖 | 无强依赖,基本不吃显存 |
| 资源考察重点 | CPU、内存、磁盘空间 |
| 支持平台 | 跟随 Maya 官方支持平台,代码使用跨平台路径写法 |
| 是否支持 API | 支持。脚本以 Python 函数方式提供,可嵌入现有TD流程 |
| 是否支持批量任务 | 支持。可以将整个文件夹的 .ma/.mb 文件按队列处理 |
| 适合场景 | 动画文件瘦身、绑定文件收尾、渲染场景清理、资产入库、外部工具导入后的脏场景整理 |
| 不适合场景 | 正在制作中的绑定文件、带有第三方插件实时计算节点的生产场景 |
需要注意一个关键态度:Maya 文件清理不是“删得越多越好”。这套工具更强调可控、可回退、可观察。第一次在新项目里使用,务必先跑 dry-run 模式生成报告,确认不会破坏需要保留的材质和绑定节点,再真正删除。
2. Maya 场景中哪些节点算垃圾节点
所谓“垃圾节点”,在 Maya 里不是一个官方单一类型,而是一类实际项目中确认无用、可以被安全移除的节点。扫场景时不能只盯着unknown一种,下面这几类都是清理工具应该覆盖的重点。
2.1 插件卸载后的 unknown 节点
这是最典型的垃圾节点来源。当一个第三方插件节点被卸载,或者当前场景引用的资产来自某个没有安装的插件时,Maya 通常无法解析原节点类型,会把它保留为unknown节点。例如某角色特效缓存插件被卸载后,场景里可能残留大量unknown类型的 cache 节点。这些节点在 UI 上不容易被看到,但会在文件保存时占用体积,也会在打开场景时触发额外的依赖检查。
判断方法很简单:
import maya.cmds as cmds unknown_nodes = cmds.ls(type="unknown", long=True) print(len(unknown_nodes), unknown_nodes[:20])但要注意,unknown不等于“一定能删”。如果节点来自一个仍然在用的插件,只是插件当前没有加载,强行删除可能丢失真实的缓存或模拟数据。稳妥做法是先加载插件,确认节点是否还有输入输出引用;如果确实无用了,再交给清理脚本。
2.2 不被任何物体引用的空 ShadingEngine
ShadingEngine 本质上是一个集合节点,负责把材质和模型表面关联起来。正常情况下一个 ShadingEngine 至少要被一个 Shader 连接,也要被一个模型 Shape 节点引用。但在反复复制、粘贴、合并场景之后,会出现很多没有分配任何模型成员、却依然残留在 Outliner 之外的空 ShadingEngine。它们不会直接在 Outliner 里显示,但在材质连接和保存体积上都会留下痕迹。
这一类节点在删除前要做两个判断:首先,它是否被引用文件引用;其次,它是否被默认的initialShadingGroup或initialParticleSE兜底。默认节点属于 Maya 启动环境的一部分,不能走普通删除逻辑。
2.3 历史记录与构造历史残留
模型上保留 construction history 并不总是错误。多边形建模阶段,历史记录可以帮助实时调整操作参数;但在动画和绑定阶段,模型已经定稿,历史记录往往只会在保存时增加节点数量。
比较常见的案例是:一个角色从建模软件一路做到绑定,中间经历过布尔运算、倒角、桥接、复制。只要历史没有被清理,场景里就会保留一堆中间运算节点。这些节点不仅拖慢视图刷新,还可能在批量清理时产生连锁连接。
2.4 外部工具导入产生的多余 Group 和命名空间
从 Blender、glTF/GLB、FBX 或 Game Engine 工具导入 Maya 时,通常会出现额外的 Root Group、命名空间前缀、材质转换节点和一堆辅助空物体。如果后续发布流程只需要最终模型,这些多余层级就属于文件垃圾。尤其从 glTF/GLB 导入时,有时甚至会生成没有实际作用的 UV 映射辅助节点或变换节点。
处理这类节点时,正确的做法不是直接在 Outliner 里手动删除 Group,而是先检查这个 Group 下面是否只有无用的空层级。如果有动画、约束或父子关系引用,删除前需要先解除这些引用。
2.5 无输入动画曲线、空表达式与孤立网络节点
Maya 场景中还会存在一些没有任何驱动目标的多余动画曲线、被残留的表达式节点、孤立存在的network节点。这些东西在动画文件反复另存为或复制之后非常容易出现。它们不像 unknown 节点那样显眼,但会占额外场景节点数。
对这种节点,清理工具通常采用“寻找无连接、非引用、无成员”的策略。如果一个节点不被任何其他节点引用,也没有向外输出给任何节点,基本可以认定为孤立节点,属于需要重点清理的对象。
3. 清理工具的适用范围与使用边界
任何清理工具都必须明确“哪些能做、哪些不能做”。这一点在 Maya 文件清理场景里尤其重要,因为删除节点后很难像普通文件操作那样一键找回。
3.1 适合使用的项目阶段
清理工具在下面几种场景里收益最明显。
第一,资产入库前。模型、材质、绑定文件准备交付之前,做一次文件瘦身,可以避免下游拿到一个带着多年编辑历史的巨型文件。
第二,项目归档时。项目结束或者镜头收尾后,把带大量缓存的场景清理成只保留当前结果的版本,对存储和复用都有帮助。
第三,外部导入后。从其他软件导入 glTF/GLB、FBX 或 OBJ 文件后,一键扫描多余节点和命名空间,能减少后续手动删除出错的可能。
第四,异常体积排查。一个场景正常只有几十 MB,突然变成几百 MB,先用扫描函数查看节点数量分布,定位是建模历史还是插件残留,再决定是否清理。
3.2 不建议自动清理的节点范围
第一类是仍处在修改期的绑定文件。绑定文件里可能存在大量自定义属性、表达式、驱动关键帧,某个节点看起来“无用”,实际上可能是约束系统或反向动力学系统的组成部分。全自动清理很容易把绑定结构删掉。
第二类是带有第三方插件数据的缓存节点。如果场景还需要回到原插件继续制作,删除 unknown 节点前先检查插件是否安装、节点是否仍被引用。把插件缓存当垃圾删掉是最常见的事故之一。
第三类是被 reference 外部引用的节点。很多 TD 场景里,文件体积大是因为外部 reference 本身加载了,而不是场景内有多余节点。此时应该检查 Reference Editor,而不是在场景内部强行删除被引用节点。
3.3 安全边界与项目合规提示
无论使用哪个脚本或工具,都必须在清理前保存一份独立备份,并且不要直接修改正在协作的原始文件。可以在原文件旁边生成_clean.ma,等确认结果无误后,再由项目负责人决定是否替换原始资产。如果处理的是客户文件、外包文件或其他团队交付资产,需要先确认项目规范和授权边界,不要在没有授权的情况下批量清理、改写他人文件。
4. Maya 文件清理环境准备与前置条件
这套清理脚本不是独立的高性能软件,而是运行在 Maya 内部的 Python 工具集,所以环境准备主要是围绕 Maya、Python 和文件目录管理来展开。
4.1 软件版本与脚本语言
Maya 2022 及以上版本默认使用 Python 3,脚本里可以直接使用标准库os、json、re和maya.cmds。如果你的 Maya 版本还停留在使用 Python 2 的非常规环境,需要把脚本里的print()函数语法和部分异常写法改成兼容格式。从 Maya 2022 开始,官方主要运行时已经是 Python 3,不建议继续维护 Python 2 专用版本。
代码不需要安装额外第三方库。所有 Maya 操作都通过maya.cmds完成,文件读写通过标准库完成。
4.2 硬件要求
Maya 文件清理不依赖 GPU,不需要“显存越大越好”,重点变量是内存和磁盘。
清理大场景时,Maya 需要在内存中完整打开场景文件,因此机器的物理内存越高越保险。一般模型面数较大或材质节点较多的场景,建议内存不低于 16GB。具体需要多少内存和场景复杂度直接相关,没有统一经验值,可以在执行前观察任务管理器里的内存占用,若系统已经接近内存上限,不要继续开批处理。
4.3 目录与权限
建议所有待清理文件放在一个独立工作目录下,不要直接在素材库原目录运行。准备两个目录:
input/:存放原始 Maya 文件。output/:存放清理后的文件。logs/:存放运行日志和 JSON 报告。
这种目录划分可以避免误覆盖,也可以让批量任务出现问题时快速定位。
4.4 打开文件前注意工程路径
如果场景里包含外部贴图、引用或缓存路径,最好先通过File > Set Project把当前工程指向原项目目录。否则 Maya 打开文件时可能因为纹理路径丢失导致加载异常,这也会干扰“是否为垃圾节点”的判断。
5. Maya 清理工具脚本安装与启动方式
下面直接给出一套可以运行的清理脚本。先把脚本保存为maya_file_cleaner.py,放到任一 Maya 可以读取的脚本目录,比如:
C:/Users/<用户名>/Documents/maya/scripts/如果使用公司统一插件目录,也可以放到插件根目录下的 Python 脚本目录。脚本目录不固定,关键是导入时通过sys.path能访问到它。
5.1 目录结构
推荐组织方式如下:
maya_file_cleaner/ |-- maya_file_cleaner.py |-- test_scene/ |-- output/ `-- logs/不需要复杂的依赖结构,只有一个主文件和一个输出目录即可。
5.2 从脚本编辑器启动
在 Maya 的脚本编辑器中打开 Python Tab,输入:
import sys sys.path.append(r"C:/Users/<用户名>/Documents/maya/scripts") import maya_file_cleaner as mfc mfc.scan_junk()执行scan_junk()只会扫描,不会删除节点。这样即使第一次使用不熟悉脚本,也不会破坏文件。
5.3 添加到 Shelf
更推荐将工具加到 Maya Shelf 上,方便其他 TD 或动画师使用。在 Shelf Editor 中新建一个按钮,然后添加 Python 命令:
import maya_file_cleaner as mfc mfc.show_report(mfc.scan_junk())添加后,每次打开一个可疑场景时,直接点击 Shelf 按钮即可生成垃圾节点报告,不需要反复打开脚本编辑器。
5.4 无界面批处理启动
如果要一次性处理多个 Maya 文件,可以脱离 Maya GUI 使用mayabatch或mayapy运行。这个模式对文件和资源的隔离要求更高,后面第 8 章会专门给批量任务模板。
6. Maya 垃圾节点清理功能测试与效果验证
直接把这套脚本用于正式项目文件风险较高。建议先建立一个小型测试场景,人为构造一些垃圾节点,验证清理工具是否正常工作。
6.1 测试思路
测试目的不是构造一个完美模型,而是验证清理工具是否能做到三点:
- 能列出 unknown 节点。
- 能跳过被引用节点。
- 能清理空 ShadingEngine 且不影响正常材质指定。
测试场景不需要复杂,可以打开一个空场景,创建一个简单的 Polygon 球,然后创建几个孤立节点和一个空 ShadingEngine。
创建测试空 ShadingEngine 的参考命令:
import maya.cmds as cmds cmds.polySphere(name="test_sphere") cmds.shadingNode("blinn", name="testMat", asShader=True) cmds.sets(renderable=True, noSurfaceShader=True, empty=True, name="testEmptySE")上面命令只是创建一个空 ShadingEngine。不要把正常物体的材质连接移除,否则无法观察到误删问题。
6.2 dry-run 扫描测试
先执行 dry-run 模式,确认脚本能发现测试节点:
import maya_file_cleaner as mfc report = mfc.scan_junk() print(report)如果脚本正常完成,报告中会看到空 ShadingEngine 被标记出来。normal test sphere 的材质组不会被标记。如果你的 Maya 环境里安装了某些第三方渲染器,场景中难免会出现插件自带节点,它们会以插件类型列出而不是unknown,因此通常不会出现在 unknown 列表里。
6.3 清理效果验证
执行扫描确认没有异常后,再执行一次真正的删除:
result = mfc.remove_unknown_nodes(dry_run=False, only_disconnected=True) print(result)运行结束后,在 Outliner 中检查正常模型是否仍然存在,材质是否仍然正确显示。如果正常物体上的材质丢失,说明脚本的黑名单过滤存在漏洞,需要检查默认材质组是否有排查遗漏。
6.4 保存体积变化测试
验证清理效果还有一个直观指标:保存前后的文件体积。
清理前执行一次File > Save Scene As保存一个before.ma;清理后再另存为after.ma,对比两个文件的大小。注意 .ma 是 ASCII 格式,文件体积容易观察。很多测试场景在节点清理前和清理后体积差别并不大,因为如果场景本身不复杂,没有太多历史节点,就不会有明显的体积下降。
并不是“清理后文件一定能变小”,体积变化取决于垃圾节点数量和连接数量。如果场景里真有几百个 unknown 节点,效果会比较明显。
6.5 回退与 Undo
清理脚本在删除节点时,Maya 默认命令会生成 Undo 记录。如果执行完删除后发现场景异常,可以立即通过Edit > Undo回退。但如果脚本内部拆成了多个步骤,Undo 可能只能回退部分操作,因此最可靠的方式是运行前保存独立副本。
7. Maya 文件清理脚本函数与通用清理命令
下面给出可以在实际项目中按需调用的核心清理函数。所有函数都被封装成独立的 Python 方法,方便后续接入自动化系统或其他工具。
7.1 扫描节点函数
扫描功能不会做删除,只输出一个 JSON 风格的结构化报告:
import maya.cmds as cmds DEFAULT_SKIP = { "initialShadingGroup", "initialParticleSE", "lambert1", "shaderGlow1", } def scan_junk(): report = { "unknown": [], "empty_shading_engine": [], } for node in cmds.ls(type="unknown", long=True) or []: report["unknown"].append({ "node": node, "referenced": bool(cmds.referenceQuery(node, isNodeReferenced=True)), "connections": len(cmds.listConnections(node) or []), }) for se in cmds.ls(type="shadingEngine", long=True) or []: short_name = se.split("|")[-1] if short_name in DEFAULT_SKIP: continue if cmds.referenceQuery(se, isNodeReferenced=True): continue members = cmds.sets(se, query=True) or [] if not members: report["empty_shading_engine"].append({ "node": se, "connections": len(cmds.listConnections(se) or []), }) return reportscan_junk()函数会返回两个列表:unknown节点和空ShadingEngine。它不会删除任何内容,作为一个只读检查工具非常安全。
7.2 删除孤立 unknown 节点
unknown 节点删除必须谨慎。默认只删除“非引用、无连接”的孤立 unknown 节点:
def remove_unknown_nodes(dry_run=True, skip_patterns=None, only_disconnected=True): result = {"deleted": [], "skipped": [], "failed": []} skip_patterns = skip_patterns or ["uiConfig", "delayEvaluatorCache"] for node in cmds.ls(type="unknown", long=True) or []: try: if cmds.referenceQuery(node, isNodeReferenced=True): result["skipped"].append({"node": node, "reason": "referenced"}) continue short_name = node.split("|")[-1] if any(pattern in short_name for pattern in skip_patterns): result["skipped"].append({"node": node, "reason": "in_skip_pattern"}) continue connections = cmds.listConnections(node) or [] if connections and only_disconnected: result["skipped"].append({"node": node, "reason": "has_connections"}) continue cmds.lockNode(node, lock=False) if not dry_run: cmds.delete(node) result["deleted"].append(node) except RuntimeError as exc: result["failed"].append({"node": node, "error": str(exc)}) return result如果你确实需要清理一个“有连接但仍然无用”的 unknown 节点,可以临时把only_disconnected=False传入函数。此时脚本不会检查连接,删除失败时会在failed列表里记录报错原因。
7.3 清理空 ShadingEngine
这个函数需要在默认节点默认安全区之外运行:
def clean_empty_shading_engines(dry_run=True): result = {"deleted": [], "skipped": [], "failed": []} for se in cmds.ls(type="shadingEngine", long=True) or []: short_name = se.split("|")[-1] if short_name in DEFAULT_SKIP: result["skipped"].append({"node": se, "reason": "default_shading_engine"}) continue if cmds.referenceQuery(se, isNodeReferenced=True): result["skipped"].append({"node": se, "reason": "referenced"}) continue members = cmds.sets(se, query=True) or [] if members: continue try: if not dry_run: cmds.lockNode(se, lock=False) cmds.delete(se) result["deleted"].append(se) except RuntimeError as exc: result["failed"].append({"node": se, "error": str(exc)}) return result默认initialShadingGroup、initialParticleSE会被跳过。如果删除后出现材质丢失,请优先检查这些默认节点是否被误伤。
7.4 清理选中对象的构造历史
这个函数不要放进全自动批处理。它针对当前选中的物体,删除其 construction history。
def clean_selected_history(): selection = cmds.ls(selection=True, long=True) or [] if not selection: print("No object selected") return for obj in selection: try: # 删除构造历史 cmds.delete(obj, constructionHistory=True) print("Cleared history:", obj) except RuntimeError as exc: print("Failed:", obj, str(exc))在清理历史前,要确认当前选择的是模型、曲线等可控对象,而不是绑定控制器。
7.5 组合使用示例
一次常规的清理流程可以这样组合:
import maya_file_cleaner as mfc report = mfc.scan_junk() print("扫描结果:", report) mfc.remove_unknown_nodes(dry_run=True, only_disconnected=True) mfc.clean_empty_shading_engines(dry_run=True)先全部 dry-run,只看报告,确认没有异常后再把dry_run=False传入正式执行。
8. 批量清理 Maya 文件与任务日志
实际项目中很少只清理一个场景。动画部门几千个镜头文件、资产库几百个角色文件,都需要批量任务方式处理。本节提供一个安全的批量清理思路。
8.1 批量任务设计
批量任务不要直接遍历源目录并修改原文件。建议目录结构如下:
batch_root/ |-- input/ |-- output/ `-- logs/脚本只从input目录读取文件,清理完成后写到output目录。这样即使某个文件清理失败,也不会污染原始文件。
8.2 Maya 环境中的批量循环模板
该模板适合在 Maya 运行时作为任务脚本运行,但需要保证当前 Maya 没有编辑未保存场景:
import os import json import maya.cmds as cmds import maya_file_cleaner as mfc def batch_clean(input_dir, output_dir, log_dir, dry_run=True): os.makedirs(output_dir, exist_ok=True) os.makedirs(log_dir, exist_ok=True) ext_list = (".ma", ".mb") maya_files = [ os.path.join(input_dir, f) for f in os.listdir(input_dir) if f.endswith(ext_list) ] all_reports = [] for maya_file in maya_files: print("Processing:", maya_file) cmds.file(new=True, force=True) cmds.file(maya_file, open=True, force=True) report = {} report["source"] = maya_file report["unknown_result"] = mfc.remove_unknown_nodes( dry_run=dry_run, only_disconnected=True ) report["shading_result"] = mfc.clean_empty_shading_engines( dry_run=dry_run ) all_reports.append(report) if not dry_run: out_path = os.path.join( output_dir, os.path.basename(maya_file).replace(".ma", "_clean.ma") ) cmds.file(rename=out_path) cmds.file(save=True, type="mayaAscii") report_path = os.path.join(log_dir, "clean_report.json") with open(report_path, "w", encoding="utf-8") as f: json.dump(all_reports, f, ensure_ascii=False, indent=2) print("Saved report:", report_path)这个模板并不复杂,核心是一次只处理一个文件。如果某个文件因为场景损坏、插件缺失导致cmds.file(open=True)失败,脚本会直接抛错中断。在生产环境里,建议在每个文件外层加异常处理并记录失败文件列表。
8.3 失败重试建议
批量任务可能因为三种原因失败:
- 单个文件被 reference 锁定。
- 文件中包含 Maya 无法加载的插件依赖。
- 文件路径本身包含非法字符。
更稳妥的做法是把失败文件单独输出到一个failed.txt中,而不是让整个批处理中断。可以在循环内使用try/except捕获异常,并将异常信息写入日志:
try: cmds.file(maya_file, open=True, force=True) except RuntimeError as exc: with open(os.path.join(log_dir, "failed.txt"), "a", encoding="utf-8") as f: f.write(f"{maya_file}\t{exc}\n") continue9. Maya 文件清理资源占用与性能观察方法
因为没有智能卡,很多人会误以为“文件清理工具应该很轻量”。实际上,文件清理过程中最消耗资源的是“打开场景”和“清除模型历史”这两个操作。
9.1 打开场景时的资源占用
当 Maya 打开一个大型场景时,CPU 要解析节点连接、材质网络、动画曲线和引用文件;内存则要存放整个场景的节点数据。如果场景文件本身接近几个 GB,内存不足时会出现长时间无响应甚至崩溃。此时不要继续执行批量清理,先在单场景模式下打开一次,观察任务管理器里 Maya 进程的内存占用。
Windows 下可以在任务管理器里找到maya.exe,Linux 下可以使用:
top -p $(pgrep -d',' -f Maya)如果系统内存占用持续超过物理内存的 80%,建议关闭不必要的软件再清理,或者把文件拆分成独立 reference 单独处理。
9.2 扫描阶段和删除阶段的差异
只做扫描时,内存占用几乎不会增加多少,因为脚本只是读取节点列表。
真正的大头在删除阶段。当一个节点被删除时,Maya 需要检查并断开所有连接。如果这个节点连接复杂的着色网络或绑定结构,删除操作可能让 CPU 占用瞬时升高。这里建议不要在干其他镜头的过程中执行全场景清理,最好利用渲染间隙或下班后的空闲时段运行批处理。
9.3 如何降低清理时的资源压力
先清理未使用缓存,再清理 unknown 节点,最后清理空 ShadingEngine,这样会比一次性全选删除更平稳。
如果场景大而且没有足够内存,可以先用File > Optimize Scene Size执行一次 Maya 自带的场景优化,再用本文脚本做无法被自带优化覆盖的 unknown 节点清理。不要把两个操作同时执行。
9.4 判断清理是否有效的可量化指标
节点数量是比文件体积更稳定的观察指标。执行文件清理前后,可以统计场景总节点数:
import maya.cmds as cmds before = len(cmds.ls(long=True)) # 执行清理操作... after = len(cmds.ls(long=True)) print("before:", before, "after:", after, "delta:", before - after)如果 after 数量没有明显减少,说明场景里的垃圾节点数量并不多,文件体积膨胀可能来自贴图、缓存或其他外部资源。不要强行走删除流程。
10. Maya 清理工具常见问题与排查方法
把实际运行中最容易遇到的问题整理成下表,方便大家对应排查。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| unknown 节点删不掉 | 节点被引用或锁定 | 查看节点的isNodeReferenced和lockNode状态 | 先cmds.lockNode(node, lock=False),再删除;被引用节点从 Reference Editor 处理 |
| 清理后材质丢失 | 空 ShadingEngine 判断不准确,误删了有间接连接的材质组 | 检查initialShadingGroup、材质出图连接 | 用备份文件重新恢复,需要把“默认 ShadingEngine”拉黑,不要删除 |
| 删除节点时报 RuntimeError | 节点仍处于锁定状态或上游连接被引用 | 查看 Script Editor 的报错行 | 用cmds.lockNode(node, lock=False)解锁;或者先断开连接 |
| 执行扫描卡死 | 场景太大,内存不足 | 观察任务管理器内存占用 | 先执行 Maya 自带 Optimize Scene Size,再执行扫描 |
| 脚本在 Maya 2022 中报语法错误 | 老脚本是 Python 2 时代写法 | 查看print是否缺少括号 | 把 print 语句改成 Python 3 函数语法 |
| 批量任务运行一半中断 | 某个文件有插件依赖或引用损坏 | 查看 Script Editor 和失败日志 | 在 Batch 脚本里加异常捕获,跳过失败文件继续执行 |
| 清理后文件体积没有变小 | 文件里没有足够的孤立节点,可能大体积来自贴图/缓存 | 检查文件引用的 |