近期发现有些时候Max的贴图会对制作人员造成困扰 ,常见的就是贴图路径的不确定,其根本原因是制作目录不统一。
有一个常见的问题,Max打开一个有很多丢失贴图的文件会导致非常卡,有个文件在我的机器上打开需要18分钟,而我将文件移动到项目目录下打开,只需要不到三秒。需要注意的是,尽量不要使用包含中文的路径、文件。不要把项目目录设成中文。不要对英文字母有不同戴天的怨念,看几个英文字母不会怀孕。
--------------------------------------
如果只是想看着怎么让丢失贴图的文件快速打开,就不必往下看了,看清楚上面有红字的那句话即可。
然后如果你确实没事,又闲的蛋疼,更打算给你们项目的程序增加些蛋疼的工作或者你想亲自蛋疼一下,你可以继续看下去。
--------------------------------------
前面说的路径不统一和丢失的贴图之类的问题完全可以用项目路径设置来解决。
Max项目目录默认为 "我的文档\3dsMax"
项目目录可以自己设置,如下图
但是Max默认的项目目录设置,会创建许多根本用不到的文件夹,例如import、preview、vpost,可能游戏开发中只想每个角色一个目录,然后所有的贴图和Max文件放在相应的目录下。那就需要更改 Max的项目目录设置去掉那些多余的目录。项目目录的设置如下图
红框框出的部分,即为子目录的设置,将不需要生成子目录的设置为"."即可(或者设置为上面项目文件夹的同目录,会自动转换为".")。
如果只是了解一下应用,到这里即可,如果想深入挖掘一下,可以继续看下去。
刚才的路径设置可以用MaxScript完成,也可以同时 打开项目目录设置的窗口。此处给出一个简单范例.
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#animations,
#archives,
#downloads,
#export,
#expression,
#image,
#import,
#matlib,
#maxstart,
#Photometric,
#preview,
#proxies,
#renderassets,
#renderPresets,
#renderoutput,
#scene,
#sound,
#vpost
)
for i in SubPathNameList do SetDir i " . "
pathConfig.doProjectSetupSteps()
如此,每个游戏项目就设置一个项目目录,所有贴图都使用相对路径,打开文件前先设定项目目录,如果有多个项目,也可以用MaxScript做一个快捷的设置.
MaxScript的相应函数为 : pathConfig.setCurrentProjectFolder
有些人可能设置项目目录后会经常出现类似这样的警告框
这是因为autoback目录不存在导致的,重新在项目目录的子目录设置里面指定一个自动保存目录或者关闭自动保存功能即可。推荐指定一个自动保存的目录。
此外,目录不统一还会导致另外一个问题,Max在按照文件内存储的路径找不到贴图时又会在自身的系统目录中寻找,如果找到了就会正确显示。虽然可以 正确显示,材质中保存的贴图路径还是错误的,所以会导致导出插件在复制贴图的时候无效。对于这个问题,我想可以用项目目录的设置配合设置使用相对路径配合 一些MaxScript来解决。
在Max中使用相对路径的选项如下图所示(注意不要选择UNC):
该窗口从菜单"Customize->Preferences"打开,中文版则为"自定义->首选项".勾选该选项之后,在Max中使 用的文件 ,会转化为相对于项目路径的相对路径。要注意的是,在勾选之前指定的贴图,并不会随着该选项的勾选而改变。这个选项选中之后Max会在指定文件时尝试转换 指定的路径,并不会对当前已经指定的路径进行处理,当然这个处理可以用MaxScript来做 ,后面会说到。
需要注意的是,此处的相对路径是相对于Max的项目路径的.
当然使用相对路径会造成一个问题,许多导出插件在导出的时候,都是直接读取材质中的贴图路径,如果是相对路径,并不会根据项目目录去寻找贴图,如果有程序需要去做这个,MaxSDK获取当前项目目录的方法为
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <IPathConfigMgr.h>
*/
const TCHAR * projectPath = IPathConfigMgr::GetPathConfigMgr() -> GetCurrentProjectFolder().GetCStr();
当然,我们的程序有可能要忙于更为重要的事情,而且有时候我们更希望能够自行解决问题,那就很简单了,每一次导出之前将贴图路径修改为绝对路径,导出后修改回来即可,而这些可以用MaxScript一次性完成,修改贴图路径则可以直接用Max的Asset Tracking System(中文版里的资源跟踪),这里给出一个转换路径的简单范例.
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
(
local AssetFileList
AssetFileList = #()
ATSOps.Refresh()
ATSOps.GetFiles & AssetFileList
for tempFile in AssetFileList do
(
ATSOps.SelectFiles #(tempFile)
ATSOps.ResolveSelectionToAbsolute()
)
ATSOps.ClearSelection()
)
Fn ResolveResourceToRelative =
(
local AssetFileList
AssetFileList = #()
ATSOps.Refresh()
ATSOps.GetFiles & AssetFileList
for tempFile in AssetFileList do
(
ATSOps.SelectFiles #(tempFile)
ATSOps.ResolveSelectionRelativeToProjectFolder()
)
ATSOps.ClearSelection()
)
ResolveResourceToAbsolute()
/*
此处添加 自己的导出代码
*/
ResolveResourceToRelative()
最后,这个帖子并非是手把手的教程,只是介绍一些相应的设置和方法。具体应用还需读者自行组合完善。
解释一下为什么推荐用项目目录的设置,许多人都觉得每个人的盘符不同之类的是很大的问题,实际上,这个东西一直就不是问题。
项目目录在max9之前版本也有很接近的东西,只不过Max9把它单独列出来了。
假设在开始制作前,设置了项目目录,然后也设置了使用相对路径
路人甲的机器上可能是这样
项目路径为:
c:\maxproject\game1\
用到的一个贴图文件是:
c:\maxproject\game1\char1\txs1.png
如果前面设置了相对路径,然后路人乙需要修改路人甲的文件,若都统一使用了项目目录的方式,那么无论他把这个项目目录放在哪里,只要在max里面设置一下项目路径,贴图都可以完美的认出来。
比如上面的c:\maxproject\game1\,这个整个目录可能在路人乙的机器中的d:\xixihaha\mp\g1\。
没有关系,路人乙重新指定一下max的项目目录为d:\xixihaha\mp\g1\即可,没有任何影响