Files
JJBB/Assets/Project/Script/Shader/Editor/NormalConvert.cs

107 lines
4.4 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections.Generic;
public static class NormalConvert
{
[MenuItem("Assets/Fix Normal", false, 1)]
public static void ConvertNormal()
{
List<string> normalList = new List<string>();
List<string> fullList = new List<string>();
for (int i = 0; i < Selection.objects.Length; i++)
{
var texture = Selection.objects[i] as Texture2D;
if (texture)
{
var assetPath = AssetDatabase.GetAssetPath(texture);
var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;
if (textureImporter)
{
fullList.Add(assetPath);
if (textureImporter.normalmap)
normalList.Add(assetPath);
}
}
}
if (fullList.Count > 0)
{
if (fullList.Count == normalList.Count)
Convert(fullList);
else
NormalConvertWarning.OpenWindow(normalList, fullList, Convert);
}
}
private static void Convert(List<string> pathList)
{
for (var i = 0; i < pathList.Count; i++)
ConvertOneNormal(pathList[i]);
AssetDatabase.Refresh(ImportAssetOptions.Default);
}
private static string GetFilePath(string assetPath)
{
return Application.dataPath + assetPath.Substring("Assets".Length);
}
public static void ConvertOneNormal(string path)
{
var textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
if (textureImporter == null)
Debug.LogError(string.Format("无法找到图片:{0}", path));
else if (textureImporter.textureType == TextureImporterType.NormalMap)
{
var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
textureImporter.isReadable = true;
textureImporter.textureType = TextureImporterType.Default;
textureImporter.crunchedCompression = false;
textureImporter.textureCompression = TextureImporterCompression.Uncompressed;
textureImporter.SaveAndReimport();
var colors = texture.GetPixels();
for (int j = 0; j < colors.Length; j++)
{
var color = new Vector3(colors[j].r, colors[j].g, colors[j].b);
color = color * 2f - Vector3.one;
color.z = Mathf.Sqrt(1f - Mathf.Clamp01(color.x * color.x + color.y * color.y));
color = color.normalized;
color = (color + Vector3.one) * 0.5f;
colors[j] = new Color(color.x, color.y, color.z, 1f);
}
string sourceFile = GetFilePath(path);
//string sourceMeta = sourceFile + ".meta";
var targetFile = sourceFile;
if (Path.HasExtension(targetFile))
targetFile = targetFile.Remove(targetFile.LastIndexOf('.'));
targetFile = targetFile + ".png";
//string targetMeta = targetFile + ".meta";
Texture2D temp = new Texture2D(texture.width, texture.height, TextureFormat.ARGB32, false);
temp.SetPixels(colors);
//string sourceFileBackup = sourceFile + ".tbackup";
// 只保存最早的备份文件,防止两次转换导致原始贴图丢失
//if (File.Exists(sourceFileBackup))
// File.Delete(sourceFile);
//else
// File.Move(sourceFile, sourceFileBackup);
File.Delete(sourceFile);
//if (sourceMeta != targetMeta)
// File.Move(sourceMeta, targetMeta);
if (File.Exists(targetFile))
File.Delete(targetFile);
File.WriteAllBytes(targetFile, temp.EncodeToPNG());
textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
if (textureImporter != null)
{
textureImporter.textureType = TextureImporterType.NormalMap;
textureImporter.textureCompression = TextureImporterCompression.Uncompressed;
textureImporter.mipmapEnabled = false;
textureImporter.isReadable = false;
textureImporter.SaveAndReimport();
Debug.Log(string.Format("转换 {0} 为 {1}", sourceFile, targetFile));
}
}
}
}