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

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

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. ASP.NET MVC 5 04 - 控制器

    PS: 唉.本来这一篇前几天早就应该发了的,可是谁每月没有那么几天啊... 呵呵.开个玩笑.反正就是各种烦气,所以也就一直没上来继续发了. 年底了,摆正一下心态吧.好好干,整点钱,过年回家能跟亲朋好友 ...

  2. java获取日期之间天数的方法

    //获取两个日期之间的天数private int daysBetween(Date now, Date returnDate) { Calendar cNow = Calendar.getInstan ...

  3. 2.lvm动态逻辑卷

    Lvm动态逻辑卷 一.             基本概念 LVM 把实际的物理磁盘数据映射到一个简单而灵活的虚拟逻辑存储视图上,藉以控制磁盘资源: 也就是重新考虑了管理文件系统和卷的方法,在文件系统管 ...

  4. 安卓APP与智能硬件相结合的简易方案

    第1章 概  述 (作者小波QQ463431476) (来源http://blog.chinaaet.com/zhaocundang/p/5100017645博客) (来源   http://www. ...

  5. 前端编辑工具之VSCode

      因为前段时间看了瞬息之间的一篇文章编辑器背后的程序观, 里面只提到了Visual studio. 我想想可能是因为非.Net开发者,所以不知道Visual sutdio code这个工具.来看看V ...

  6. 第三方Android 模拟器流畅速度快,适合开发人员

    “工欲善其事,必先利其器.” 使用Android模拟器开发和调试应用肯定比使用真机方便.但相比XCODE的IOS模拟器,Android SDK自带的AVD实在不争气,不过一些第三方的模拟器却表现不俗! ...

  7. bitmap解码

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define BYTE unsigned c ...

  8. IE10 IE11 中 网站无法登录问题cookie

    方法一: 在程序文件中添加此文件 在项目中创建一个文件夹将下载的文件直接拖入文件夹中 来源于:http://www.hanselman.com/blog/BugAndFixASPNETFailsToD ...

  9. lombok在IntelliJ IDEA下的使用

    lombok是一款可以精减java代码.提升开发人员生产效率的辅助工具,利用注解在编译期自动生成setter/getter/toString()/constructor之类的代码.代码越少,意味着出b ...

  10. [LeetCode] Meeting Rooms II 会议室之二

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...