Unity3D研究院之自制批量关联材质与贴图插件
原地址: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研究院之自制批量关联材质与贴图插件的更多相关文章
- Unity3D研究院之脚本批量打包渠道包研究
原地址:http://www.xuanyusong.com/archives/2418#comments 最近在研究Unity3D脚本批量打包,比如在Android平台下各种不同分辨率和不同内存大小的 ...
- 一键批量添加材质的法线贴图-unity插件
有时候材质做完后需要更改贴图,或者增加贴图,数量少的时候可以一张张添加和修改,数量多的时候就只能代码生成了.原理是通过名字的关联:主贴图和法线贴图大多数只是后缀的不同上,如果不是那是美术规范没做好啊, ...
- (转)Unity3D研究院之Assetbundle的实战(六十三)
上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院之Assetbundle的原理(六十一) 本篇文章我们将说说assetbundl ...
- Unity3D研究院之Assetbundle的实战(六十三)
http://www.xuanyusong.com/archives/2405 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院 ...
- Unity3D研究院之IOS Android支持中文与本地文件的读取写
前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写.当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原 ...
- Unity3D研究院之Jenkins的使用(七十八)
长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ...
- Unity3D研究院之与Android相互传递消息
原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条
Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...
- (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景
自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ...
随机推荐
- groot 引入外部模板
index7.html <html><head> <title>groots引入外部模板van</title> <script src=" ...
- ModernUI教程:使用预定义的页面布局
Modern UI for WPF自带了一组页面布局.Modern UI page是继承自control控件的,Page通过是通过ModernWindow.MenuLinkGroups属性来引用显示在 ...
- mac版beyond compare 4 中对比class文件
http://www.scootersoftware.com/download.php?zz=moreformats 这个网址中没有mac版本的class文件对比的file format.只能自己造了 ...
- [C#]Attribute特性(2)——方法的特性及特性参数
上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性 之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射 ...
- 三维数组——与 宝玉QQ群讨论交流之二
宝玉 12:27:35 这几天看了大部分大家交的作业,发现一个主要问题还是卡在对三维数组的理解上,之前把三维数组类比成三维空间可能会造成误导 宝玉 12:27:45 其实鞠老师解释的很好: 三维数组 ...
- FilenameFilter用法
使用FilenameFilter实现图片过滤,只要.gif,.jpg,.png文件. java 代码 public class ImageFilter implements FilenameFilte ...
- Gson解析Json格式数据
//数据定义:=========================================== class User{ String name; String password; String ...
- session的一个问题
<%@ page language="java" import="java.util.*,javax.servlet.http.Cookie.*" pag ...
- Jquery-获取父级元素parent
1. parent([expr]): 获取指定元素的所有父级元素 <div id="par_div"><a id="href_fir" hre ...
- Jquery-处理iframe的高度自适应
超级简单的方法,也不用写什么判断浏览器高度.宽度啥的.下面的两种方法自选其一就行了.一个是放在和iframe同页面的,一个是放在test.html页面的.注意别放错地方了哦. iframe代码,注意要 ...