一键批量添加材质的法线贴图-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 了.字段参数的效 ...
随机推荐
- git推送本地分支到远程分支
场景 有时候我们开发需要开一个分支,这样可以有效的并行开发. 开分支有两种方式: 一种是在远程开好分支,本地直接拉下来; 一种是本地开好分支,推送到远程. 远程先开好分支然后拉到本地 git chec ...
- 1-3 - C#语言习惯 - 推荐使用查询语法而不是循环
C#语言中并不缺少控制程序流程的结构,for.while.do-while和foreach等都可以做到这点. 历史上所有计算机语言设计者都不曾遗漏这些重要的循环控制结构. 不过我们还有一个更好的方式: ...
- C#语句2——循环语句(for循环与for循环嵌套)
循环:反复执行某段代码. 循环四要素:初始条件,循环条件,循环体,状态改变. for(初始条件;循环条件;状态改变) { 循环体 } break ——中断循环,跳出整个循环 continue——停止本 ...
- Echarts在JavaWeb中与后台的交互实现
本Web系统后台框架是:Spring+SpringMVC+Mybatis+Shiro+Maven.完整系统搭建的配置过程见上一篇文章:基于Spring+SpringMVC+Mybatis的Web系统搭 ...
- linux命令在线手册
下面几个网址有一些 Linux命令的在线手册,而且还是中文的,还可以搜索.非常方便 Linux命令手册 Linux命令大全 Linux中文man在线手册 每日一linux命令
- Android Studio NDK 开发 问题记录
Android NDK 开发 问题解决 编译:找不到gles3库 使用旧的编译方式,写Android.mk 进行编译.报错如下 gles3/gl3.h no such file or director ...
- [转]How to override HandleUnauthorizedRequest in ASP.NET Core
本文转自:http://quabr.com/40446028/how-to-override-handleunauthorizedrequest-in-asp-net-core I'm migrati ...
- Stack操作,栈的操作。
栈是先进后出,后进先出的操作. 有点类似浏览器返回上一页的操作, public class Stack<E>extends Vector<E> 是vector的子类. 常用方法 ...
- vs2013 打开vs2010 找不到此项目类型所基于的应用程序 MVC2 升级 MVC5 不能加载Web项目
Upgrading an ASP.NET MVC 2 Project to ASP.NET MVC 3 Tools Update ASP.NET MVC 3 can be installed side ...
- rxjs5.X系列 —— filter系列 api 笔记
欢迎指导与讨论 :) 前言 本文是笔者翻译 RxJS 5.X 官网各类operation操作系列的的第二篇 -- filter转换.如有错漏,希望大家指出提醒O(∩_∩)O.更详细的资料尽在rxjs官 ...