美术做过的模型导出fbx,美术把Fbx和贴图文件给了程序,程序把Fbx导入工程可能会出现贴图和材质没有关联上的问题,如果场景材质非常多,一个一个去给材质贴图非常的费劲。我有一个办法,最好让美术装上Unity,美术在3DMAX中创建模型并且给材质贴图。然后打开Unity,先把贴图文件全部拷贝在Unity中,这样所有贴图就会有一个Unity的路径。Asset/Textures/pic.png 等等、。。。此时在回到3DMAX中,修改一下材质上贴图的路径,用上面Asset/Textures/pic.png 这样类型的路径重新引用一下下在3dmax中,这时候在导出FBX模型,最后将FBX模型放入Unity工程,你会发现所有材质已经被赋值贴图了。
在插一句,因为Unity是左手坐标系,而3DMAX是右手坐标系,直接导出FBX以后模型X轴的旋转会变成-90。所以建议美术在3DMAX中修改一下模型的位置。方法是:3XMAX中切换顶视图,默认坐标轴向是 :X轴向右 :Y轴向上: Z轴朝向自己。 修改后还是在顶视图中改成:X轴向右: Y轴朝向自己: Z轴朝下。 这时候在导出FBX 放在Unity中就正常了。
当Fbx导入Unity的时候会自动在当前路径下生成Materials文件夹,为了避免混乱建议每一个原始Fbx分别放在不同文件夹中,最后统一用Prefab来代替。
废话不多说,回到本篇的重点上,请记住一定要美术把材质的名称和贴图的名称保持一致,程序要根据材质名称去找对象的贴图。考虑到项目中会有多个模型使用同一个贴图的情况所以建议大家把贴图都放在同一个文件夹下,必须放在/Assets/Textures文件夹中。如下图所示,在Hierarchy视图中先选择需要批量关联的游戏对象,只需选择父对象就可以,程序会自动遍历所有子对象,然后点击Windows->ApplyMaterial弹出关联窗口。
官网上说是可以先把贴图文件放在Textures文件夹中,然后在把模型文件放入工程,Unity会自动匹配材质和贴图的关系,这个不办法我试过但是不是每次都会成功,我也不知道为什么,所以就写了这个插件。
如下图所示,可以批量关联材质,也可以批量删除材质。我已经测试过比较多的场景材质和贴图的关联,也希望大家帮我测试测试嘿嘿。。
关联前
关联后
把插件的代码放在Editor文件夹中,由于你的贴图可能是多个类型的,只需在下面代码的config数组中配置一下,目前我配置了.png .jpg .tag格式,也可以继续拓展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
using UnityEngine; using System.Collections; using UnityEditor; public class ApplyMaterial : EditorWindow { public static string [] config = { ".PNG",".JPG",".TGA" }; [MenuItem ("Window/ApplyMaterial")] static void Applay () { Rect wr = new Rect (0,0,500,500); ApplyMaterial window = (ApplyMaterial)EditorWindow.GetWindowWithRect (typeof (ApplyMaterial),wr,true,"widow name"); window.Show(); } void OnGUI () { if(GUILayout.Button("批量关联材质")) { ApplayMatrials(true); } if(GUILayout.Button("批量删除关联")) { ApplayMatrials(false); } } void ApplayMatrials(bool isAdd) { if(Selection.activeGameObject != null) { foreach(GameObject g in Selection.gameObjects) { Renderer []renders = g.GetComponentsInChildren<Renderer>(); foreach(Renderer r in renders) { if(r != null) { foreach(Object o in r.sharedMaterials) { string path = AssetDatabase.GetAssetPath(o); Material m = Resources.LoadAssetAtPath(path,typeof(Material)) as Material; if(isAdd) { if(m.mainTexture == null) { Texture t = GetTexture(m.name); if(t != null) { m.mainTexture = t; }else { Debug.Log("材质名:" + o.name + " 材质替换失败,请检查资源" ); } } }else { m.mainTexture = null; } } } } } this.ShowNotification(new GUIContent("批量关联材质贴图成功")); }else { this.ShowNotification(new GUIContent("没有选择游戏对象")); } } static Texture GetTexture(string name) { foreach(string suffix in config) { Texture t = Resources.LoadAssetAtPath("Assets/Textures/" + name+suffix,typeof(Texture)) as Texture; if(t != null) return t; } return null; } } |
最后是本文的下载地址:http://vdisk.weibo.com/s/AFWi4
祝大家学习愉快,啦啦啦啦德玛西亚~~~~
- 本文固定链接: https://www.xuanyusong.com/archives/2314
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
直接导出FBX以后模型X轴的旋转会变成-90,在unity中能通过代码将角度调整么
momo 大神 请教下, 我的些材质中有些有2张贴图但是mainTexture只能关联1张, 要想获取另外一张必须知道他shader中变量的名称,请问有什么简便的方法可以获取到他所关联的所有贴图?
Material.GetTexture 可以传 name
我找到了一个方法虽然只能在编辑器用 用ShaderUtil.GetPropertyCount 可以获取到Shader的属性数量,ShaderUtil.GetPropertyName可以获取到属性名称
雨松大兄弟。请教你:如何获得一个cube身上的材质球在assets下的路径?
Shaders/Lightmapped/Diffuse 这个是需要2张贴图的 请教下老师怎么弄
多个贴图怎么做?
挖个坟,就是想问一下,这个东西如果升级到批量关联指定路径下的所有fbx的各自的贴图应该怎么写?
挖个坟,就是想问一下,这个东西如果升级到批量关联指定路径下的fbx的贴图应该怎么写?
为什么我导入插件在为window中没有显示呢
你好,请问我想获取一个还没有实例化 预设的大小该怎么办? 我用tranform.collider.bounder.size 来获取正常的物件是没有问题的,获取预设的大小都为0.
帅~~~~~~~~~~
过奖啦。。
最后输出FBX时能够把材质,贴图,模型压缩成一个FBX文件的,只是这个文件有些大
FBX只包含材质 不包含贴图的。。
可以的,maya 勾选 EmbedMedia
MO哥,有个问题急求,我的程序运行在ios设备上,时间长了,程序越来越慢,这是什么原因造成的呢?
不好说 ,只能说代码有问题 呵呵,得仔细检查。。
MONO哥有没有做过将虚拟翻书加到Unity里呢??我这里有一套虚拟翻书的程序,但不知道怎么嵌到Unity里。。如果实在不能嵌的话Unity打开外部EXE的代码是怎么写的呢?灰常感谢啦~~
可以打开EXE 但是不能把EXE嵌入。。。
嗯,试了一下打开exe程序没问题了,但是等退出后没法切换到Unity的程序了。。
有时间我在windows上做个例子把 现在在mac
谢啦谢啦~~
momo 探索一下在移动终端,即手机上。模型的面数,到底控制在多少才合适 嘿嘿
嘿,看来你也玩lol或者只看啦啦啦拉德玛西亚~~~
momo每次都要奇怪地卖萌- –