一键批量添加材质的法线贴图-unity插件
有时候材质做完后需要更改贴图,或者增加贴图,数量少的时候可以一张张添加和修改,数量多的时候就只能代码生成了。原理是通过名字的关联:主贴图和法线贴图大多数只是后缀的不同上,如果不是那是美术规范没做好啊,代码很简单,基本是编辑器类的代码。
这个是还没完善的特定版代码,如直接使用需要更改文件夹名字和贴图后缀。
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插件的更多相关文章
- Obj模型功能完善(物体材质,光照,法线贴图).Cg着色语言+OpenTK+F#实现.
这篇文章给大家讲Obj模型里一些基本功能的完善,包含Cg着色语言,矩阵转换,光照,多重纹理,法线贴图的运用. 在上篇中,我们用GLSL实现了基本的phong光照,这里用Cg着色语言来实现另一钟Blin ...
- Unity 着色器训练营(2) - MVP转换和法线贴图
https://mp.weixin.qq.com/s/Qf4qT15s9bWjbVGh7H32lw 我们刚刚公布了Unity 2018.1中,Unity将会内置可视化编程工具Shader Graph, ...
- Unity3D研究院之自制批量关联材质与贴图插件
原地址:http://www.xuanyusong.com/archives/2314 美术做过的模型导出fbx,美术把Fbx和贴图文件给了程序,程序把Fbx导入工程可能会出现贴图和材质没有关联上的问 ...
- 推荐一款Python神器,5 行 Python 代码 实现一键批量扣图
今天给大家分享一款Python装逼实用神器. 在日常生活或者工作中,经常会遇到想将某张照片中的人物抠出来,然后拼接到其他图片上去.专业点的人可以使用 PhotoShop 的"魔棒" ...
- Unity3D ShaderLab法线贴图
Unity3D ShaderLab法线贴图 说到法线贴图,应该算是我们最常使用的一种增强视觉效果的贴图.将法线贴图的各个像素点座位模型的法线,这样我们的光照可以模拟出高分辨率的效果, 同时也保持较低的 ...
- 【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 分布式监控系统Zabbix--完整安装记录-批量添加主机和自动发现端口
一.Zabbix-3.0.3批量添加主机的配置如下: 0)被监控机上要安装zabbix_agent,并配置好zabbix_agentd.conf (如下172.29.8.50是zabbix_serve ...
- (转)Unity3D 游戏贴图(法线贴图,漫反射贴图,高光贴图)
原帖网址http://www.u3dpro.com/read.php?tid=207 感谢jdk900网友的辛苦编写 我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图 ...
- 163_技巧_Power BI 一键批量建立自定义字段参数
163_技巧_Power BI 一键批量建立自定义字段参数 一.背景 在 2022 年 5 月开始,Power BI 新增了一个非常有用的功能字段参数.再也不用写一串的 SWITCH 了.字段参数的效 ...
随机推荐
- jquery双向列表选择器DIV模拟版
前段时间项目需要用到双向列表选择,想直接用select,结果发现某些样式不支持,只好用div模拟了以下,功能基本实现能用了,需要其他功能自己加上,譬如列表里展示多列数据等. select版链接:htt ...
- JavaScript标准参考教材(alpha)--笔记
一.导论 二.基本语法 1.严格来说var a=1与a=1效果不太一样,delete命令无法删除前者. JavaScirpt是一种动态类型语言,也就是说,变量的类型没有限制,可以赋予各种类型的值. J ...
- Spring 4 创建REST API
什么是REST 全称:表述性状态转移 (Representational State Transfer), 将资源的状态以最适合客户端或服务端的形式从服务器端转移到客户端(或者反过来). 面向资源,而 ...
- nodejs pm2部署配置
pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能. 1.pm2安装使用需要全局安装 npm install -g pm ...
- linux基本知识
1.默认不写端口号就是80端口 127.0.0.1.localhost都代表本机 2.linux下的用户管理: id:可以查看当前用户whoami:查看当前的用户who:看当前已经登录的用户w:也 ...
- ASP.NET MVC Controllers and Actions
MVC应用程序里的URL请求是通过控制器Controller处理的,不管是请求视图页面的GET请求,还是传递数据到服务端处理的Post请求都是通过Controller来处理的,先看一个简单的Contr ...
- mongodb高级应用
一. 高级查询 查询操作符 条件操作符:db.collection.find({"field":{$gt/$lt/$gte/$lte/$eq/$ne:value}}); 匹配所有 ...
- C#相关开发视频
Quickly Generate C# Classes from JSON Responses .NET Compiler Platform ("Roslyn") for the ...
- 【js】初入AJAX
AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...
- 快速排序算法 quick sort的理解
最近做了一下算法的一些练习,感觉基础薄弱了,只是用一些已经有的东西来完成练习如quickSort(c++使用的时候是sort(起始位置,终止位置,比较函数),这个需要加头文件),但是不知道怎么推出来, ...