前言

  最近综合别人写的插件,弄了一个自己的小插件 ———— CommandLauncher
  为了实现更好的安装体验,特意对 Maya 安装插件的各种方法逐一进行探讨归纳和总结

  在过去安装 Maya 脚本的体验大都比较难受,比如需要拷贝代码到 Maya脚本编辑器 然后执行代码
  这对于大多数没有编程经验的美术人员来说是个可怕的门槛。
  因此我这里探讨的安装方案都是永久安装,下次打开 插件 依然存在。

  Maya安装插件有如下几种方法

  • 生成工具架图标
  • ✪ 添加 Mod 文件调用插件
  • ✪ Autodesk ApplicationPlugins

  带 ✪ 的方法的核心思想都是利用 modules 处理,只是Maya比较灵活,可以通过不同方式实现
  因此 ✪ 安装的方法都可以称之为 模块安装
  最后再推荐一下 rj 大神的模块安装脚本 github


  看本文章之前建议先 预览一下 Maya 文档关于 Maya 自定义的内容 和 插件发布的内容 自定义设置 插件发布
  当然也可以看完文章再去看文档,总之文档很重要,希望大家学习的时候多看看官方文档的说明。

Maya 模块机制

  要做到持久化安装,很重要的一点就是需要将数据存储到本地,然后让 Maya 执行的时候可以调用到这些数据。
  为了规范化整个流程,Maya 推出了 模块化 插件的概念。
  这种方式的安装方法是 Maya 官方更加推崇的,更加值得使用的。

Maya官方文档 多文件模块

  根据文档,一个模块应当包含四个文件夹以 及 模块描述文件

icons     放置模块图标
plug-ins  放置 mll 插件
presets   放置预设参数
scripts   放置 mel & python 脚本

  模块描述文件的后缀为 mod 文件,可以定义 模块 的路径、Maya版本、不同平台等的不同不同行为。 文档
  通过模块描述文件就可以让模块的载入更加智能。
  文档里面有一个例子

+ MAYAVERSION:2016 PLATFORM:win64 LOCALE:ja_JP CustomModule 3.10.5 ..\CustomModule\Modules\win64
    Maya版本为2016  在windows平台下 Maya使用日语   模块的名称  版本号  模块的加载路径 (相对路径相对于mod文件的路径)

scripts: ..\..\CommonFiles\scripts
    定义 scripts 调用的目录

  指定的加载路径就需要有 上面所提的四个文件夹来处理模块中不同的部分。
  定义了不同的载入条件之后,就可以通过调整 Maya 环境变量的方式来添加设定了。
  你可以在 Maya 的安装目录下的 modules 找到官方插件的 mod 文件。

alt

1
2
3
4
+ LOCALE:en_US MASH 1.0 ../plug-ins/MASH
PATH+:=bin
MAYA_CONTENT_PATH+:=MASH Examples
[r] scripts: scripts

  上面的 mod 含义就是 当前 Maya 为 en_US 英文版
  环境变量 PATH 添加 当前目录的 bin 目录
  MAYA_CONTENT_PATH 添加 MASH Examples 目录
  [r] 标记是指递归遍历目录的意思,即 scripts 目录下的所有目录,只有含有 .前缀的文件夹会被隐藏 比如 .git .vscode
  := 表示添加模块的相对路径, += 表示添加数组元素而不是覆盖变量数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
getenv "MAYA_SCRIPT_PATH"

......
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/apiclient
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/flux
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/googleapiclient
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/httplib2
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/MASH
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/MASHAET
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/MayaToAE
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/oauth2client
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/uritemplate
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/flux/ae
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/flux/resources
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/flux/ui
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts/flux/resources/icons
D:/Program Files/Autodesk/Maya2018/plug-ins/MASH/scripts
......

  执行 getenv 命令可以获取到存入的 script 目录,可以看到添加 [r] 标记之后会遍历所有的目录添加到 MAYA_SCRIPT_PATH 环境变量中。

Maya 环境变量

Maya 环境变量 官方文档

  Maya 的环境变量类似于 系统的环境变量设置,只不过是针对 Maya 的环境设置的。
  可以通过 mel 语句的 getenvputenv 来设置 Maya 的环境变量
  也可以将环境变量设置到系统的环境变量当中(非常不推荐这个方案,只是Maya也会一并获取所有的系统变量到自己的环境变量中)
  最后还可以通过 Maya.env 文本文件来设置系统变量,Maya.env 在 drive:\Users\username\Documents\maya\version 即 我的文档的 maya 目录里面

  设置方式完全参考当前系统平台的方式,比如 windows 平台

1
2
3
MAYA_SCRIPT_PATH = %MAYA_APP_DIR%\scripts\test
MAYA_PLUG_IN_PATH = %MAYA_LOCATION%\devkit\plug-ins;%MAYA_LOCATION%\devkit\test
TMPDIR = D:\tempspace

  可以通过 %var% 来获取之前设置的环境变量赋值到其他变量中。
  路径分隔符也遵从系统平台的规范。
  变量名遵循命名规则,不得含有空格缩进以及特殊符号 / : * “ < > |

  在 env 里面设置的变量可以通过 mel 语句的 getenv 获取
  = 是赋值 | *= 自动添加一个新的元素


  通过设置环境变量可以对 Maya 很多东西进行自定义,比如说关闭联网登录的 参照我之前转载的文章 加速Maya开启与关闭的方法
  还可以开启 Maya 一些过时的功能,比如说打开 viewport 1.0


  另外需要注意环境变量是 PYTHONPATH ,这里添加的目录相当于python的 sys.path.append
  我不推荐在环境变量中添加 PYTHONPATH 这个变量设置,用 Python 处理添加会比较好一点,减少环境变量的混乱。

Maya 我的文档 目录

官方文档参考

  通过上面介绍的 Maya 模块机制,你会发现 Maya 我的文档 目录 存放了类似的目录也包含了其他的目录。

alt

  这个目录是 Maya 存放用户设置的地方
  因此网上有一招万能解决 Maya 启动问题的方法,删除这个文件夹。
  一旦Maya启动不了都可以使用这个方法解决问题。
  删除这个文件夹之后,Maya再次启动就会重新生成这个文件夹并且生成默认的设置,回到一开始安装的状态。
  当然这样的话自己弄的工具架、热键、自定义设置等等的配置全部就没了。
  因此删除需谨慎,建议使用改名大法。

官方文档参考


  Maya 目录之下会有不同 Maya 版本数字对应的文件夹,取决于电脑安装了的 Maya 版本
  打开数字文件夹如 2017 会有固定的目录层级结构

@ modules       模块文件存放路径
@ * plug-ins    放置 mll 插件
* presets       放置预设参数
* scripts       放置 mel & python 脚本
prefs           首选项设置存储
user.toolclips  自定义工具动画演示
~ zh_CN         其他语言的选项
Maya.env        Maya 环境变量

  如果 Maya 不是英文版的话,只有 Maya.env 和 ~语言文件夹存在
  因此需要切换英文版才能看到上面的目录
  带 * 号的文件夹和 模块定义的目录是重合的,这里其实也可以看做 Maya 的模块目录
  带 @ 号 默认是不存在,但是可以手动创建出来并且起作用。

  下面列举一些常用的文件夹

modules

  modules 目录就和 Maya 安装目录下的默认 modules 作用是一样的。
  Maya 会读取 modules 目录下的 mod 文件并且让它的设置生效。

plug-ins

  这个目录主要存放 mll 文件或者 使用 OpenMaya 编写的插件
  Maya会的插件管理器会找寻这些目录,并且生成复选框来勾选反选插件。

scripts

官方文档

  Maya 会将这个目录添加到 MAYA_SCRIPT_PATH 环境变量中
  如果该目录中含有 userSetup.py 或者 userSetup.mel 命名的文件,开启 Maya 就会自动执行这两种类型的文件。
  这就是模块安装的核心步骤,通过 userSetup 文件启动插件!

prefs

hotkeys             用户自定义的热键
icons               图标文件夹
markingMenus        标记菜单
scriptEditorTemp    脚本编辑器临时文件
shelves             工具架
workspaces          工作区
scripts             
mainWindowStates

  首选项文件存放的目录
  里面的 icons 和模块文件夹 icons 一致,添加的图标可以再工具架的图标上直接输入名称获取图标。
  其他东西都是用户自定义相关的,如果删除相关文件夹,用户自定义的属性就没了。(比如时候删除 hotkeys 文件夹,那用户自定义的 hotkeys 就没了)
  大部分存储的都是 mel 语句,可以查询相关的 mel 命令进行修改。


工具架图标安装

  使用这种方案最具标志性的插件就是 AdvanceSkeleton5 简称 ADV, 有兴趣的同学可以研究一下 ADV 安装脚本 install.mel
  安装方法非常简单,将 install.mel 拖到 Maya 的视窗, Maya 就会执行 mel 脚本,通过 mel 脚本在当前工具架上添加了 ADV 的启动图标。
  点击启动图标就可以读取到 ADV 安装时的目录,然后调用 ADV 里面的 mel 脚本生成插件界面。
  只要 ADV 插件位置没有改变,并且 Maya 之后又是正常关闭的,那每次打开 Maya 都可以通过当时安装的工具架图标开启插件。

图标安装原理

  安装成功之后,可以打开 ADV 的启动图标看看它的启动代码。

1
source "D:/Users/xxxxx/Desktop/AdvancedSkeleton5/AdvancedSkeleton5.mel";AdvancedSkeleton5;

  其实就是定位到安装时候的目录,然后调用AdvancedSkeleton5.mel 脚本获取到 AdvancedSkeleton5 proc 来执行代码。
  因此 install.mel 做的事就是定位到当前脚本的目录位置,然后生成对应的图标,并且将当前的路径输入到图标的执行代码里面。
  这里利用 Maya 工具架正常退出是可以保存下来的机制,实现工具持久化存在。
  可以再我的文档的 maya 目录 对应版本文件下的 prefs 找到 工具架定义的 mel 文件,正常退出 Maya 会将工具架上的数据覆盖到这里。

mel 获取当前执行脚本路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
global proc asInstallScriptLocator (){}

global proc string asInstallScriptLocation ()
{
// NOTE whatIs 命令获取 程序路径 | 返回 Mel procedure found in: D:/xxxx.mel
string $whatIs=`whatIs asInstallScriptLocator`;
// NOTE 获取 Mel procedure found in: 之后的路径
string $fullPath=`substring $whatIs 25 999`;
string $buffer[];
// NOTE 获取 mel 脚本所在的文件夹
int $numTok=`tokenize $fullPath "/" $buffer`;
int $numLetters=size($fullPath);
int $numLettersLastFolder=size($buffer[$numTok-1]);
string $scriptLocation=`substring $fullPath 1 ($numLetters-$numLettersLastFolder)`;
return $scriptLocation;
}

  上面这段就是 ADV 安装脚本获取路径的核心代码。
  主要还是利用 whatIs 命令获取路径,实在是妙啊~

添加 Mod 文件调用插件

  其实通过上面模块机制就可以知道 , 通过设置环境变量 MAYA_MODULE_PATH 可以定义 mod 文件读取的位置
  而模块目录下的 scripts 文件夹下的 userSetup.py 或者 userSetup.mel 是可以启动时被执行的。
  因此基于这个原理就可以创建一个带 scripts 的文件夹,然后将环境变量指向到该文件夹来初始化插件。

  mod 设置可以区分 Maya 版本 语言,是更好的安装插件方式。
  官方最推荐的安装方案就是通过 mod 来安装,毕竟定义不同的模块更加方便文件的区分。
  我的文档其实也可以看做一个特殊模块文件夹。
  以前我野路子安装统统弄到 我的文档 里面,会把文件搞得十分混乱的。

Autodesk ApplicationPlugins

  这个安装方法非常少人知道,我是研究 Command Search 插件的时候才学习到的。 官方下载地址 备用下载地址
  不过别后原理其实还是利用了 Maya 的模块规则来做的。

  通过上面的下载地址可以下载一个 msi 安装包,安装完成之后开启 Maya 就会发现 插件自动启动了,方便快捷得一批。
  这个安装方式和 Maya 的 bonus 工具箱的安装也是一样的。

  相关的设置说明可以在 Maya 的开发者中心里面找到。 链接
  至于怎么打包成 msi 安装包,貌似是需要按照 Autodesk 规范弄好,然后官方会给你打包。
  不过官方安装包也只不过是将文件拷贝的 Autodesk 系列软件在系统内的的公用文件夹。
  可以通过 command Search 提供的代码来找到这些 python 包在系统的位置。

1
2
3
import commandSearch
print commandSearch
# <module 'commandSearch' from 'C:\ProgramData\Autodesk\ApplicationPlugins\CommandSearch\Contents\scripts\commandSearch\__init__.py'>

  可以看到 C:\ProgramData\Autodesk\ApplicationPlugins\ 这个路径就是 Autodesk App 的通用路径。
  也可以按照 Autodesk 的规范,写一个 PackageContents.xml 来描述 Maya 插件
  这个描述文件可以起到和 mod 类似的作用,判断不同的平台以及添加不同的 Maya 环境变量,并且指定了 Maya 模块的路径。
  具体的写法官方也没有详细文档,只是说可以下载一些官方的插件来看写法。

  虽然官方没有提供制作 msi 文件的方法,但是我们自己也可以通过 python 程序将文件复制到对应的目录来实现插件的自动安装。

RJ 大神的 module-installer 方案

  也是非常巧合的,我后来才发现原来 commandSearch 这个插件也是 RJ 大神制作的。 链接

  总之在 RJ 大神的个人网站里面收获匪浅,有通道盒的增强工具,还有增强版的 Maya 减帧工具
  还有今天这里介绍到的 module installer 方案。 github仓库


  其实这个方案就是利用 Maya 的 mod 文件配置的方案,但是通过 mel 文件将整个配置过程自动化了。
  核心原理和 ADV 的 mel 脚本方案类似,也需要获取当前 mel 脚本的路径。

  • 首选创建一个 mod 文件,将当前的模块路径命名为 <PATH> mel 脚本复制的时候会自动将路径替换为 mel 脚本的路径。
  • 获取 Maya 的模块路径 和 当前的脚本路径
  • 判断当前的模块是否已经安装,对比 模块文件 的版本信息是否相同
  • 将 mod 文件复制到一个 模块路径下,并且替换 <PATH>
  • 执行模块文件的 userSetup.py 或者 userSetup.mel 来立刻启动插件
  • 输出安装信息

  一套流程已经全部设置好了,自动安装、避免重复安装、以及自启动。


  通过这种方案安装的模块非常方便,而且可以确保 Maya 启动的时候启动插件。
  只要启动的时候可以执行脚本就可以将插件安放到 Maya 的任意位置上。
  模块越来越多,管理也不好弄, RJ 还针对这种情况制作了一个 模块管理工具

总结

  Maya 安装插件持久化的核心是要解决的是运行指定脚本的问题。
  工具架利用的是 Maya 首选项存储的 mel 脚本进行脚本路径指定。
  模块化安装则是利用 mod 文件指定启动路径。