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));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|