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

这个是还没完善的特定版代码,如直接使用需要更改文件夹名字和贴图后缀。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO;
using System.Text; [ExecuteInEditMode]
public class Transferandmapnormal : EditorWindow
{
[MenuItem("Window/AutoAddNormal")] //打开一个新的窗口
static void AutoAddNormalinmaterials()
{ Rect wr = new Rect(, , , );
Transferandmapnormal window = (Transferandmapnormal)EditorWindow.GetWindowWithRect(typeof(Transferandmapnormal), wr, true, "AutoAddNormal");
window.Show();
} public List<Material> scensmaterial = new List<Material>();
public List<string> sourceTexturespath = new List<string>(); private string textureSuffix = "_NRM.jpg";
private string docPath = "DWSJ.fbm";
//public Material[] scensmaterial;
//绘制窗口时调用
void OnGUI()
{
EditorGUILayout.LabelField("自动添加法线贴图或其他贴图", GUILayout.Width(), GUILayout.Height());
GUILayout.BeginArea(new Rect(, , , ), "", "Box");
// textureSuffix = EditorGUILayout.TextField("输入贴图后缀:", textureSuffix);
if (GUILayout.Button("获取场景材质", GUILayout.Width()))
{
if (scensmaterial != null)
{ scensmaterial.Clear(); }
if (sourceTexturespath != null)
{ sourceTexturespath.Clear(); }
GetScenesmaterial();
} if (GUILayout.Button("应用法线贴图到材质", GUILayout.Width()))
{
FindandapplyNormalmap(); }
if (GUILayout.Button("关闭窗口", GUILayout.Width()))
{
this.Close();
}
if (GUILayout.Button("除去法线贴图", GUILayout.Width()))
{
testpath();
}
GUILayout.EndArea(); }
private Material tempmaterial;
//获取场景内的材质球
//获取材质球的贴图名称和路径
void GetScenesmaterial()
{ Object[] selection = Selection.GetFiltered(typeof(Material), SelectionMode.Editable | SelectionMode.TopLevel);
if (selection.Length == ) return; foreach (Material test in selection)
{
if (test.mainTexture != null)
{
scensmaterial.Add(test);
sourceTexturespath.Add(docPath + "/" + test.mainTexture.name + textureSuffix);
}
else
{
scensmaterial.Add(null);
sourceTexturespath.Add("");
} }
}
//在相应的文件夹里获取法线贴图
//把法线贴图贴到material对应的位置
public List<Texture> tempTex;
public void FindandapplyNormalmap()
{ for (int i = ; i < scensmaterial.Count; i++)
{ if (!sourceTexturespath[i].Equals(""))
{
//string path = AssetDatabase.GetAssetPath(targetObj);
// Assets / Resources / DWSJ.fbm / DWSJ00B.jpg
TextureImporter texture = (TextureImporter)AssetImporter.GetAtPath("Assets/Resources" + "/" + sourceTexturespath[i]);
Debug.Log("Assets/Resources" + "/" + sourceTexturespath[i]);
if (texture != null)
{
texture.textureType = TextureImporterType.Bump;
AssetDatabase.ImportAsset("Assets/Resources" + "/" + sourceTexturespath[i]);
string correctString=sourceTexturespath[i].Replace(".jpg","");
Debug.Log(correctString);
Texture TempTexture =Resources.Load(correctString) as Texture;
scensmaterial[i].SetTexture("_BumpMap", TempTexture);
}
}
}
AssetDatabase.Refresh(); }
public void testpath()
{
Object[] selection = (Object[])Selection.objects;
//合法性处理
if (selection.Length == ) return;
//批量导入贴图
foreach (Object obj in selection)
{
//取得每一张贴图
Texture texture = (Texture)obj;
//获得贴图路径
string localpath = AssetDatabase.GetAssetPath(texture);
Debug.Log(localpath);
TextureImporter importer = (TextureImporter)AssetImporter.GetAtPath(localpath);
//设置贴图类型
importer.textureType = TextureImporterType.Bump;
//导入项目资源
AssetDatabase.ImportAsset(localpath);
}
AssetDatabase.Refresh(); } }

api解析:

[ExecuteInEditMode]//在编辑器模式下可调用

[MenuItem("Window/AutoAddNormal")]//在window工具栏下增AutoAddNormal选项
window.Show();//展示新的窗口

GUILayout.Button("应用法线贴图到材质",
GUILayout.Width(200))
//添加按钮

Object[] selection = Selection.GetFiltered(typeof(Material),
SelectionMode.Editable | SelectionMode.TopLevel);//把选取的物体过滤掉非Material类型的object到object选项。

TextureImporter –textureimporeter类可以调各种图片输入器的参数,包括图片的类型也是在这里调节。

AssetDatabase.ImportAsset(localpath);//重新载入asset资源
importer.textureType = TextureImporterType.Bump;//将图片的类型改为法线

AssetDatabase.Refresh();//刷新资源

使用方法:

1.在project选取材质

2.点击按键2,批量获取材质和贴图路径

3.获取法线贴图路径并且贴在材质球上

注意事项:(1.法线贴图要放在Resources文件夹上, 2.这个脚本需要修改再使用,因为我还没做通用版本,有些是我自己的文件路径,所以使用需要修改

   private string textureSuffix = "_NRM.jpg";
private string docPath = "DWSJ.fbm";这两句,替换到你自己的贴图后缀和文件名字。

一键批量添加材质的法线贴图-unity插件的更多相关文章

  1. Obj模型功能完善(物体材质,光照,法线贴图).Cg着色语言+OpenTK+F#实现.

    这篇文章给大家讲Obj模型里一些基本功能的完善,包含Cg着色语言,矩阵转换,光照,多重纹理,法线贴图的运用. 在上篇中,我们用GLSL实现了基本的phong光照,这里用Cg着色语言来实现另一钟Blin ...

  2. Unity 着色器训练营(2) - MVP转换和法线贴图

    https://mp.weixin.qq.com/s/Qf4qT15s9bWjbVGh7H32lw 我们刚刚公布了Unity 2018.1中,Unity将会内置可视化编程工具Shader Graph, ...

  3. Unity3D研究院之自制批量关联材质与贴图插件

    原地址:http://www.xuanyusong.com/archives/2314 美术做过的模型导出fbx,美术把Fbx和贴图文件给了程序,程序把Fbx导入工程可能会出现贴图和材质没有关联上的问 ...

  4. 推荐一款Python神器,5 行 Python 代码 实现一键批量扣图

    今天给大家分享一款Python装逼实用神器. 在日常生活或者工作中,经常会遇到想将某张照片中的人物抠出来,然后拼接到其他图片上去.专业点的人可以使用 PhotoShop 的"魔棒" ...

  5. Unity3D ShaderLab法线贴图

    Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...

  6. 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  7. 分布式监控系统Zabbix--完整安装记录-批量添加主机和自动发现端口

    一.Zabbix-3.0.3批量添加主机的配置如下: 0)被监控机上要安装zabbix_agent,并配置好zabbix_agentd.conf (如下172.29.8.50是zabbix_serve ...

  8. (转)Unity3D 游戏贴图(法线贴图,漫反射贴图,高光贴图)

    原帖网址http://www.u3dpro.com/read.php?tid=207  感谢jdk900网友的辛苦编写 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图 ...

  9. 163_技巧_Power BI 一键批量建立自定义字段参数

    163_技巧_Power BI 一键批量建立自定义字段参数 一.背景 在 2022 年 5 月开始,Power BI 新增了一个非常有用的功能字段参数.再也不用写一串的 SWITCH 了.字段参数的效 ...

随机推荐

  1. Android 开源库和项目 2

    1.带尾巴的RecyclerViewPager 特点:1.像viewPager一样滑动一次就滑动一页 2.像画廊gallery一样,滑动一次可以滑动很多页 3.竖向滑动 4.支持点击事件,没有错乱   ...

  2. 织梦Dedecms安全设置

    织梦DedeCMS是一款非常流行的CMS,很多刚开始建站人都用的织梦,一方面是织梦比较容易操作;另一方面是织梦的SEO方面做的确实比其他的系统要好一些.这些都导致织梦的用户群是非常庞大的,用的人多了, ...

  3. 从零自学Hadoop(18):Hive的CLI和JDBC

    阅读目录 序 Hive CLI(old CLI) Beeline CLI(new CLI) JDBC Demo下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出 ...

  4. dubox首次调用消费者执行两次问题

    dubbox+zookeeper服务开启后 Dubbo的超时重试机制为服务容错.服务稳定提供了比较好的框架支持,但是在一些比较特殊的网络环境下(网络传输慢,并发多)可能由于服务响应慢,Dubbo自身的 ...

  5. protobuf学习(2)-相关学习资料

    protobuf官方git地址 protobuf官方英文文档   (你懂的需要FQ) protobuf中文翻译文档 protobuf概述          (官方翻译 推荐阅读) protobuf入门 ...

  6. Warm myself by my hand

    周末的尾巴了. 前几天白日里的气温降到10摄氏度以下,穿上了秋裤.隔天跑一次步,晚上九点多,5公里,25分钟左右.换上薄薄的运动裤,两件运动衣.一出宿舍门就没觉得冷,跑着跑着就愈加热了起来.遇到的问题 ...

  7. 学习python函数笔记之一

    1.函数文档字符串,用于存放函数的说明,一般写在第一行 2.函数调用:函数名+参数列表(函数的参数分实际参数和形式参数,str就是形式参数,则'welcome 头 python'就是实际参数) 参数需 ...

  8. angular js 在ie11 下的get请求缓存问题的解决办法

    使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑. 还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新.今天我们就来解决这个问题. 几行代 ...

  9. Dapper学习笔记(一)

    https://github.com/StackExchange/dapper-dot-net Dapper是对IDbConnection的扩展,需要使用Dapper提供的扩展只需要把SqlMappe ...

  10. Redis中connect与pconnect区别?

    1.首先先介绍下connect和pconnect的区别. connect:脚本结束之后连接就释放了. 2.pconnect:脚本结束之后连接不释放,连接保持在php-fpm进程中. 所以使用pconn ...