107 lines
4.4 KiB
C#
107 lines
4.4 KiB
C#
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));
|
||
}
|
||
}
|
||
}
|
||
} |