当前位置:网站首页>Unity map auto match material tool map auto add to shader tool shader match map tool map made by substance painter auto match shader tool
Unity map auto match material tool map auto add to shader tool shader match map tool map made by substance painter auto match shader tool
2022-07-07 12:06:00 【Tang Zhe】
Powerful Unity Editor Extension
Some of you might ask : The model is made , Decompress the map first in the model settings , Just unzip the material ?
Certainly. , But now the problem is that the model has no mapping , Maps are in SP Made in , The exported maps are all separate maps , It will not be directly bound to the model
All in all , It's no problem for you to paste one by one on the shader , I think it's too painful , I have to post a model … Post a der.
Editor extension can solve many manual problems .
Look at the effect :

The shader will automatically match the map


Pay attention when matching maps :
The map name must be : The model name _ Shader name _ Map type
Property introduction
- Model path : Dragging the model will automatically identify the path
- Map suffix : similar _Albedo perhaps _Occlusion, Some students like to name it like this ,AL,AO, So open it and customize
- Export shaders : The directory where the model exists will be automatically created Material Folder , Models that do not unzip materials will unzip materials to this folder
- Set the material : Automatically match the map according to the name of the model and shader
SP Export process :
file - Export map - The configuration needs to be named like this 
among :
- $project It is the present. SP Project name ( In less than )
- $mesh Is the model name
- $textureSet Is the shader name
Code Introduction :
Attribute here, you can modify the default suffix
[SerializeField]
public string m_Albedo = "_Albedo", m_Metallic = "_Metallic", m_NormalMap = "_Normal", m_HeightMap = "_Height", m_OcclusionMap = "_Occlusion";
Set the name rule here :objName + “_” + mat.name + m_Albedo, Can be modified by yourself
void setMaterialShader(string path)
{
Material mat = AssetDatabase.LoadAssetAtPath<Material>(path);
string[] allPath = GetObjPath("Texture2D");
for (int i = 0, len = allPath.Length; i < len; i++)
{
string filePath = AssetDatabase.GUIDToAssetPath(allPath[i]);
Texture2D t = AssetDatabase.LoadAssetAtPath<Texture2D>(filePath);
string objName = Path.GetFileName(modelPath);
objName = objName.Substring(0, objName.Length - 4);
if (t.name == objName + "_" + mat.name + m_Albedo)
{
mat.SetTexture(Albedo, t);
}
else if (t.name == objName + "_" + mat.name + m_HeightMap)
{
mat.SetTexture(HeightMap, t);
}
else if (t.name == objName + "_" + mat.name + m_Metallic)
{
mat.SetTexture(Metallic, t);
}
else if (t.name == objName + "_" + mat.name + m_NormalMap)
{
mat.SetTexture(NormalMap, t);
}
else if (t.name == objName + "_" + mat.name + m_OcclusionMap)
{
mat.SetTexture(OcclusionMap, t);
}
else
{
Debug.Log(mat.name+" Shaders cannot match :" + t.name);
}
}
}
Complete code :
This code inherits EditorWindow
So we have to put it in Editor Under the folder , Make revolving door And Camera controller Is the same , All use Editor Extension Technology
using System.IO;
using UnityEngine;
using UnityEditor;
public class MatchinMaterial_Editor : EditorWindow
{
public string modelPath = "Assets";
public Rect modelRect;
public string Albedo = "_MainTex";
public string Metallic = "_MetallicGlossMap";
public string NormalMap = "_BumpMap";
public string HeightMap = "_ParallaxMap";
public string OcclusionMap = "_OcclusionMap";
private static MatchinMaterial_Editor _window;
[SerializeField]
public string m_Albedo = "_Albedo", m_Metallic = "_Metallic", m_NormalMap = "_Normal", m_HeightMap = "_Height", m_OcclusionMap = "_Occlusion";
[MenuItem("Tools/ Material matching ")]
public static void showWindow()
{
Rect wr = new Rect(0, 0, 300, 300);
// true Indicates that you cannot dock
_window = (MatchinMaterial_Editor)GetWindowWithRect(typeof(MatchinMaterial_Editor), wr, true, " Material matching ");
_window.Show();
}
public void OnGUI()
{
EditorGUILayout.Space();
EditorGUILayout.LabelField(" Model path ( Drag the folder here with the mouse )");
EditorGUILayout.Space();
GUI.SetNextControlName("input1");// Set the name of the next control
modelRect = EditorGUILayout.GetControlRect();
modelPath = EditorGUI.TextField(modelRect, modelPath);
EditorGUILayout.Space();
m_Albedo = EditorGUILayout.TextField("Albedo Picture suffix ", m_Albedo);
m_Metallic = EditorGUILayout.TextField("Metallic Picture suffix ", m_Metallic);
m_NormalMap = EditorGUILayout.TextField("NormalMap Picture suffix ", m_NormalMap);
m_HeightMap = EditorGUILayout.TextField("HeightMap Picture suffix ", m_HeightMap);
m_OcclusionMap = EditorGUILayout.TextField("OcclusionMap Picture suffix ", m_OcclusionMap);
DragFolder();
EditorGUILayout.Space();
// Export materials
if (GUILayout.Button(" Export shaders "))
{
ForEachModels();
}
EditorGUILayout.Space();
if (GUILayout.Button(" Set the material "))
{
ForEachMaterials();
}
}
/// <summary>
/// Get the drag file
/// </summary>
void DragFolder()
{
// The mouse is in the current window
if (mouseOverWindow == this)
{
// Drag into the window without releasing the mouse
if (Event.current.type == EventType.DragUpdated)
{
DragAndDrop.visualMode = DragAndDropVisualMode.Generic;// Change the appearance of the mouse
// Judgment area
if (modelRect.Contains(Event.current.mousePosition))
GUI.FocusControl("input1");
}
// Drag into the window and release the mouse
else if (Event.current.type == EventType.DragExited)
{
string dragPath = string.Join("", DragAndDrop.paths);
// Judgment area
if (modelRect.Contains(Event.current.mousePosition))
this.modelPath = dragPath;
// Remove focus ( Otherwise GUI Not refresh )
GUI.FocusControl(null);
}
}
}
/// <summary>
/// Export materials
/// </summary>
void ForEachModels()
{
string[] allPath = AssetDatabase.FindAssets("t:GameObject", new string[] {
modelPath });
//Debug.Log("-- allPath: " + allPath.Length);
for (int i = 0, len = allPath.Length; i < len; i++)
{
string filePath = AssetDatabase.GUIDToAssetPath(allPath[i]);
// Set up the model
ExtractMaterialsFromFBX(filePath);
}
// If you choose FBX Model file
if (allPath.Length == 0)
{
if (Path.GetExtension(modelPath) == ".fbx")
{
ExtractMaterialsFromFBX(modelPath);
}
else
{
Debug.LogError(" The currently selected directory cannot be found FBX file : " + this.modelPath);
}
}
}
/// <summary>
/// Export shaders
/// </summary>
/// <param name="assetPath"></param>
public void ExtractMaterialsFromFBX(string assetPath)
{
// Material catalog
string materialFolder = Path.GetDirectoryName(assetPath) + "/Material";
//Debug.Log(assetPath);
// If the folder does not exist, create a new
if (!AssetDatabase.IsValidFolder(materialFolder))
AssetDatabase.CreateFolder(Path.GetDirectoryName(assetPath), "Material");
// obtain assetPath All resources under .
Object[] assets = AssetDatabase.LoadAllAssetsAtPath(assetPath);
foreach (Object item in assets)
{
if (item.GetType() == typeof(Material))
{
string path = System.IO.Path.Combine(materialFolder, item.name) + ".mat";
// Create a new unique path for the resource .
path = AssetDatabase.GenerateUniqueAssetPath(path);
// By importing resources ( for example ,FBX file ) Extract external resources , In object ( for example , texture of material ) Create this resource in .
string value = AssetDatabase.ExtractAsset(item, path);
// Successfully extracted ( If Unity Successfully extracted resources , Then return an empty string )
if (string.IsNullOrEmpty(value))
{
AssetDatabase.WriteImportSettingsIfDirty(assetPath);
AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate);
Debug.Log(Path.GetFileName(assetPath) + " Of Material Export succeeded !!");
}
}
}
}
/// <summary>
/// Get all shaders
/// </summary>
void ForEachMaterials()
{
string[] allPath = GetObjPath("Material");
for (int i = 0, len = allPath.Length; i < len; i++)
{
string filePath = AssetDatabase.GUIDToAssetPath(allPath[i]);
setMaterialShader(filePath);
}
Debug.Log("Material Shader Setup completed , altogether : " + allPath.Length + " individual ");
}
void setMaterialShader(string path)
{
Material mat = AssetDatabase.LoadAssetAtPath<Material>(path);
string[] allPath = GetObjPath("Texture2D");
for (int i = 0, len = allPath.Length; i < len; i++)
{
string filePath = AssetDatabase.GUIDToAssetPath(allPath[i]);
Texture2D t = AssetDatabase.LoadAssetAtPath<Texture2D>(filePath);
string objName = Path.GetFileName(modelPath);
objName = objName.Substring(0, objName.Length - 4);
if (t.name == objName + "_" + mat.name + m_Albedo)
{
mat.SetTexture(Albedo, t);
}
else if (t.name == objName + "_" + mat.name + m_HeightMap)
{
mat.SetTexture(HeightMap, t);
}
else if (t.name == objName + "_" + mat.name + m_Metallic)
{
mat.SetTexture(Metallic, t);
}
else if (t.name == objName + "_" + mat.name + m_NormalMap)
{
mat.SetTexture(NormalMap, t);
}
else if (t.name == objName + "_" + mat.name + m_OcclusionMap)
{
mat.SetTexture(OcclusionMap, t);
}
else
{
Debug.Log(mat.name+" Shaders cannot match :" + t.name);
}
}
}
string[] GetObjPath(string mType)
{
//string path = Path.GetDirectoryName(modelPath) + "/Material";// Get the file directory of this object , Specific to the Material file
string path = Path.GetDirectoryName(modelPath);// Get the file directory of this object
return AssetDatabase.FindAssets("t:"+ mType, new string[] {
path });// Look under this file "t:Material" This file
}
}
This code needs Demo demonstration ?
边栏推荐
- Superscalar processor design yaoyongbin Chapter 9 instruction execution excerpt
- 什么是局域网域名?如何解析?
- Enclosed please find. Net Maui's latest learning resources
- Flet tutorial 17 basic introduction to card components (tutorial includes source code)
- 清华姚班程序员,网上征婚被骂?
- Common locking table processing methods in Oracle
- Fleet tutorial 19 introduction to verticaldivider separator component Foundation (tutorial includes source code)
- Suggestions on one-stop development of testing life
- 防红域名生成的3种方法介绍
- <No. 9> 1805. 字符串中不同整数的数目 (简单)
猜你喜欢

<No. 9> 1805. 字符串中不同整数的数目 (简单)

NPC Jincang was invited to participate in the "aerospace 706" I have an appointment with aerospace computer "national Partner Conference

The road to success in R & D efficiency of 1000 person Internet companies

Onedns helps college industry network security

Rationaldmis2022 advanced programming macro program

Enclosed please find. Net Maui's latest learning resources

Zero shot, one shot and few shot
![111.网络安全渗透测试—[权限提升篇9]—[Windows 2008 R2内核溢出提权]](/img/2e/da45198bb6fb73749809ba0c4c1fc5.png)
111.网络安全渗透测试—[权限提升篇9]—[Windows 2008 R2内核溢出提权]

sql里,我想设置外键,为什么出现这个问题

Improve application security through nonce field of play integrity API
随机推荐
Unity中SmoothStep介绍和应用: 溶解特效优化
Problem: the string and characters are typed successively, and the results conflict
如何理解服装产业链及供应链
Test the foundation of development, and teach you to prepare for a fully functional web platform environment
千人规模互联网公司研发效能成功之路
Swiftui swift internal skill: five skills of using opaque type in swift
Mise en œuvre du codage Huffman et du décodage avec interface graphique par MATLAB
Rationaldmis2022 array workpiece measurement
Half of the people don't know the difference between for and foreach???
【神经网络】卷积神经网络CNN【含Matlab源码 1932期】
【最短路】ACwing 1127. 香甜的黄油(堆优化的dijsktra或spfa)
Summed up 200 Classic machine learning interview questions (with reference answers)
Camera calibration (2): summary of monocular camera calibration
Visual Studio 2019 (LocalDB)\MSSQLLocalDB SQL Server 2014 数据库版本为852无法打开,此服务器支持782版及更低版本
超标量处理器设计 姚永斌 第8章 指令发射 摘录
How to understand the clothing industry chain and supply chain
30. Few-shot Named Entity Recognition with Self-describing Networks 阅读笔记
【纹理特征提取】基于matlab局部二值模式LBP图像纹理特征提取【含Matlab源码 1931期】
What are the technical differences in source code anti disclosure
软件内部的定时炸弹:0-Day Log4Shell只是冰山一角