🚀 Maya 批量导出神器升级!支持 FBX/OBJ/MA/MB 一键导出,效率提升 200%!
各位三维设计师和 Maya 用户注意啦!今天给大家带来一款超实用的 Maya 批量导出插件 重磅升级!由 AGX 团队开发的这款工具现已支持 FBX、OBJ、MA、MB 四种格式 的批量导出,再也不用一个个手动导出了!
🔥 插件亮点
四大格式支持
:FBX、OBJ、MA、MB 全搞定 - 智能命名
:自动使用模型名称作为文件名 - 批量处理
:一次性导出所有选中模型 - 中文友好
:全中文界面,操作直观 - 错误提示
:自动检测未选择模型等情况
🛠️ 使用教程(超简单!)
第一步:安装插件
复制全部代码 打开 Maya 脚本编辑器(Python 模式) 粘贴代码并全选 鼠标中键拖拽到工具架(防止中文乱码)
第二步:使用插件
选择要导出的模型(注意:不能有组层级关系) 点击工具架上的插件图标 选择导出格式(FBX/OBJ/MA/MB) 设置导出路径 点击"开始导出"按钮
第三步:坐等完成
插件会自动:
按选择顺序逐个导出 使用模型名称命名文件 显示导出进度和结果
💡 更新内容(v1.2)
- 新增 MA/MB 格式支持
:现在可以批量导出 Maya 原生格式了! - UI 优化
:界面更美观,操作更流畅 - 兼容性提升
:修复了 Maya 2018 的兼容性问题 - 错误处理增强
:导出失败会有明确提示
📝 使用注意事项
确保导出的模型没有组层级关系 导出前请先保存 Maya 文件 如果导出失败,会显示具体哪些模型有问题 建议先小批量测试,确认无误后再大批量操作 ⚠️ 兼容性说明 本插件已在 Maya 2018 版本上完成测试并稳定运行。对于更高版本的 Maya(如 2019-2025),由于 Python 环境和 API 可能存在差异,建议用户:
- 自行测试验证
在高版本 Maya 中的兼容性 - 注意观察
导出过程中是否出现异常 - 及时反馈
遇到的任何兼容性问题 
# -*- coding: utf-8 -*-'''开发者:AGX时间:2025.3.27版本:1.2更新说明:优化UI界面,修复Maya 2018兼容性问题,增加多导出格式选择(FBX, OBJ, MA, MB)使用说明: 先运行此插件。需要用户手动将此文件打开,将代码全部复制粘贴到MAYA的脚本编辑器python类里面。然后全选代码,然后鼠标中间拖拽到工具架上。(手动拖拽原因是因为,代码里面有中文字符,如果直接放进MAYA三维窗口,虽然能运行,但中文部分将会乱码显示)。然后需要将用户需要选中的模型(模型不能有组或者其他的层级关系)。然后选择好自己要导出的模型格式以及导出的模型的位置。然后点击导出按钮。插件将会按照前面选择的模型的先后顺序进行逐个导出。并且导出的每个文件名和当前文件的模型名字一致。如果用户未选择模型,将会弹出警告提示窗口。无需再手动操作逐个导出模型,并且重新根据模型名字进行文件命名。'''import osimport maya.cmds as cmdsclass BatchExportWindow(object):WINDOW_NAME = "BatchExportWindow"def __init__(self):if cmds.window(self.WINDOW_NAME, exists=True):cmds.deleteUI(self.WINDOW_NAME, window=True)self.failed_exports = []# 创建主窗口self.window = cmds.window(self.WINDOW_NAME,title=u"AGX_批量导出工具",widthHeight=(500, 250),sizeable=False)# 创建主布局self.main_form = cmds.formLayout()# 创建说明文本self.header_text = cmds.text(label=u"请选择需要导出的模型",align="center",font="boldLabelFont")# 创建框架布局self.frame = cmds.frameLayout(label=u"导出设置",marginHeight=5,marginWidth=5)# 创建列布局self.column = cmds.columnLayout(adjustableColumn=True,rowSpacing=5,columnAttach=('both', 5))# 添加分隔线cmds.separator(height=10, style='none')# 创建导出格式选择(用labelArray4支持4个标签)self.radio_button_group = cmds.radioButtonGrp(label=u'导出格式',labelArray4=['FBX', 'OBJ', 'MA', 'MB'], # 4个标签numberOfRadioButtons=4,columnWidth=[1, 60],columnAttach=[(1, 'left', 5), (2, 'left', 5), (3, 'left', 5), (4, 'left', 5)],select=1)# 添加间隔cmds.separator(height=10, style='none')# 创建路径选择区域self.directory_text_field = cmds.textFieldButtonGrp(label=u'导出路径',buttonLabel=u'浏览...',columnWidth=[1, 60],adjustableColumn=2,columnAttach=[(1, 'left', 5), (2, 'left', 5), (3, 'left', 5)],buttonCommand=self.select_directory)# 添加分隔线cmds.separator(height=15)# 创建导出状态文本self.status_text = cmds.text(label=u'准备就绪',align='center')# 添加间隔cmds.separator(height=10, style='none')# 创建“开始导出”按钮self.export_button = cmds.button(label=u"开始导出",command=self.export,height=35)# 设置布局cmds.formLayout(self.main_form,edit=True,attachForm=[(self.header_text, 'top', 5),(self.header_text, 'left', 5),(self.header_text, 'right', 5),(self.frame, 'left', 5),(self.frame, 'right', 5),(self.frame, 'bottom', 5)],attachControl=[(self.frame, 'top', 5, self.header_text)])# 显示窗口cmds.showWindow(self.window)def select_directory(self, *args):result = cmds.fileDialog2(fileMode=3,dialogStyle=2,caption=u"选择导出目录")if result:cmds.textFieldButtonGrp(self.directory_text_field,edit=True,text=result[0])def export(self, *args):selected_objects = cmds.ls(selection=True, long=True)if not selected_objects:cmds.confirmDialog(title=u'警告',message=u'请先选择要导出的模型!',button=[u'确定'],defaultButton=u'确定')returndirectory = cmds.textFieldButtonGrp(self.directory_text_field, query=True, text=True)if not directory:cmds.confirmDialog(title=u'警告',message=u'请选择导出路径!',button=[u'确定'],defaultButton=u'确定')return# 获取用户选择的导出格式索引(1-4)format_index = cmds.radioButtonGrp(self.radio_button_group, query=True, select=True)total = len(selected_objects)self.failed_exports = [] # 重置失败列表for i, obj in enumerate(selected_objects):try:# 更新状态文本cmds.text(self.status_text,edit=True,label=u'正在导出: {} ({}/{})'.format(obj.split("|")[-1], i+1, total))cmds.select(obj, replace=True)filename_base = obj.split("|")[-1]if format_index == 1:filename = '{}/{}.fbx'.format(directory, filename_base)cmds.file(filename,force=True,options="v=0;",typ="FBX export",pr=True,es=True)elif format_index == 2:filename = '{}/{}.obj'.format(directory, filename_base)cmds.file(filename,force=True,options="groups=0;ptgroups=0;materials=0;smoothing=1;normals=1",typ="OBJexport",pr=True,es=True)elif format_index == 3:filename = '{}/{}.ma'.format(directory, filename_base)cmds.file(filename,force=True,options="mo=1",typ="mayaAscii",pr=True,es=True)elif format_index == 4:filename = '{}/{}.mb'.format(directory, filename_base)cmds.file(filename,force=True,options="",typ="mayaBinary",pr=True,es=True)except Exception as e:self.failed_exports.append(obj)# 导出完成提示if self.failed_exports:cmds.text(self.status_text,edit=True,label=u'导出完成,但有{}个模型导出失败'.format(len(self.failed_exports)))cmds.confirmDialog(title=u'导出完成',message=u'以下模型导出失败:\n' + '\n'.join([obj.split("|")[-1] for obj in self.failed_exports]),button=[u'确定'])else:cmds.text(self.status_text,edit=True,label=u'导出完成!共导出{}个模型'.format(total))cmds.confirmDialog(title=u'完成',message=u'所有模型导出成功!',button=[u'确定'])# 运行插件BatchExportWindow()
夜雨聆风