原地址:http://www.xuanyusong.com/archives/2314

美术做过的模型导出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格式,也可以继续拓展。

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 (,,,);
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;
}
}

Unity3D研究院之自制批量关联材质与贴图插件的更多相关文章

  1. Unity3D研究院之脚本批量打包渠道包研究

    原地址:http://www.xuanyusong.com/archives/2418#comments 最近在研究Unity3D脚本批量打包,比如在Android平台下各种不同分辨率和不同内存大小的 ...

  2. 一键批量添加材质的法线贴图-unity插件

    有时候材质做完后需要更改贴图,或者增加贴图,数量少的时候可以一张张添加和修改,数量多的时候就只能代码生成了.原理是通过名字的关联:主贴图和法线贴图大多数只是后缀的不同上,如果不是那是美术规范没做好啊, ...

  3. (转)Unity3D研究院之Assetbundle的实战(六十三)

    上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院之Assetbundle的原理(六十一) 本篇文章我们将说说assetbundl ...

  4. Unity3D研究院之Assetbundle的实战(六十三)

    http://www.xuanyusong.com/archives/2405 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院 ...

  5. Unity3D研究院之IOS Android支持中文与本地文件的读取写

       前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写.当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原 ...

  6. Unity3D研究院之Jenkins的使用(七十八)

    长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ...

  7. Unity3D研究院之与Android相互传递消息

    原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...

  8. Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条

    Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...

  9. (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景

    自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ...

随机推荐

  1. loadsh这个神奇的js工具类库

    var _ = require('lodash'); 把几个对象合并为一个对象. _.assign({ 'a': 1 }, { 'b': 2 }, { 'c': 3 });// ➜ { 'a': 1, ...

  2. 标准I/O

    在程序运行时,会默认为我们打开三个流:标准输入流.标准输出流.标准出错流. 标准输入流一般对应我们的键盘 标准输出流一般对应显示器 标准出错流一般也对应显示器 1.标准输入流 在标准I/O中,java ...

  3. Linq之求和,平均值,最大值,最小值

    写在前面 最近一直在弄统计的内容,和统计相关的操作,就需要用到了,而有些在数据库中操作起来非常不方便,没办法就用c#中的linq来实现了. 代码 一个例子 using System; using Sy ...

  4. javascript继承(七)—用继承的方式实现照片墙功能

    照片墙DEMO下载 注意:图片有四种类型:1可放大:2可拖动:3既可放大也可拖动:4都不行.由于每个图片的构造函数不同而不同(目前在火狐上调试的,其它的浏览器可能不行,请见谅,主要讲继承的思想.以后会 ...

  5. [转]Java中的private、protected、public和default的区别

    原文地址:http://my.oschina.net/u/1169535/blog/403589 (1)对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类.接口. ...

  6. iOS不得姐项目--登录模块的布局,设置文本框占位文字颜色,自定义内部控件竖直排列的按钮

    一.登录模块的布局 将一整部分切割成若干部分来完成,如图分成了三部分来完成 设置顶部状态栏为白色的方法 二.设置文本框占位文字颜色 <1>方法一与方法二实现原理是同一种,都是通过设置pla ...

  7. Struts-1和2的比较

    Struts1和Struts2都是MVC设计模式的经典应用框架,下文从代码,性能,测试,功能等方面对Struts1和Struts2进行简单比较,来看看Struts的高级版本在哪些方面进行了优化. (1 ...

  8. Java设计模式-适配器模式(Adapter)

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...

  9. yii2图片上传

    yii2利用自带UploadedFile上传图片 public static function uploadFile($name) { $uploadedFile = UploadedFile::ge ...

  10. 使用属性表:VS2013上配置OpenCV

    以前,windows下配置OpenCV一直不太方便:总是要手动添加lib,添加include,还要配置PATH使得程序运行时候能找到dll文件. 每次新建一个使用OpenCV的工程都要手动添加,很麻烦 ...