うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】テクスチャの色を反転するツール

仮画像を作成したいときなど、仮画像と分かるようになにかしら対応をしたい

そんなときに利用できるツールを作成しました

使い方

変換したいテクスチャを Project Window で右クリックして
Texture/Nage を選択すると変換できます

f:id:hacchi_man:20201026002002p:plain:w200

変更例

f:id:hacchi_man:20201026002102p:plain:w300f:id:hacchi_man:20201026002120p:plain:w300

コード

using UnityEditor;
using UnityEngine;
 
public class TextureNegaConvertTool
{
    [MenuItem("Assets/Texture/Nega")]
    private static void TextureConvertNega()
    {
        var guids = Selection.assetGUIDs;
        if (guids.Length <= 0)
            return;

        foreach (var guid in guids)
        {
            var path = AssetDatabase.GUIDToAssetPath(guid);
            var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
            if (texture != null)
                ToNega(texture);
        }
    }
 
    private static void ToNega(Texture2D src)
    {
        var texture = new Texture2D(src.width, src.height, src.format, src.mipmapCount == -1);
        var path = AssetDatabase.GetAssetPath(src);
        var importer = AssetImporter.GetAtPath(path) as TextureImporter;
 
        var isChange = !importer.isReadable;
        if (isChange)
        {
            importer.isReadable = true;
            importer.SaveAndReimport();
            AssetDatabase.Refresh();
        }
 
        for (var x = 0; x < src.width; x++)
        {
            for (var y = 0; y < src.height; y++)
            {
                var color = src.GetPixel(x, y);
                for (var i = 0; i < 3; i++)
                    color[i] = 1 - color[i];
 
                texture.SetPixel(x, y, color);
            }
        }
 
        texture.Apply();
 
        System.IO.File.WriteAllBytes(path.Replace('/', System.IO.Path.DirectorySeparatorChar), texture.EncodeToPNG());
        AssetDatabase.Refresh();
        if (isChange)
        {
            var importer2 = AssetImporter.GetAtPath(path) as TextureImporter;
            importer2.isReadable = false;
            importer2.SaveAndReimport();
        }
    }
}