Unity/Script

이펙트 툴) 버텍스 컬러 오버라이드 툴

Jade Kim 2023. 12. 4. 23:14

 

using UnityEngine;
using UnityEditor;

public class VertexColorOverrideTool : EditorWindow
{
    private Mesh selectedMesh;
    private Texture2D selectedTexture;
    private Vector2 scrollPos;



    [MenuItem("Window/Jade FX Tools/Vertex Color Override Tool")]
    public static void ShowWindow()
    {
        GetWindow<VertexColorOverrideTool>("Vertex Color Override Tool");
    }


    void OnGUI()
    {
    EditorGUILayout.Space(10);

    
     scrollPos = GUILayout.BeginScrollView(scrollPos);

     EditorGUILayout.Space(10);
    // 메쉬 픽커
    GUILayout.Label("메쉬 선택:", EditorStyles.boldLabel);
    selectedMesh = (Mesh)EditorGUILayout.ObjectField(selectedMesh, typeof(Mesh), false);

    EditorGUILayout.Space(10);

    // 텍스처 픽커
    GUILayout.Label("텍스처 선택:", EditorStyles.boldLabel);
    selectedTexture = (Texture2D)EditorGUILayout.ObjectField(selectedTexture, typeof(Texture2D), false);

    EditorGUILayout.Space(10);

    // 버텍스 컬러 오버라이드 버튼
    if (GUILayout.Button("버텍스 컬러 오버라이드") && selectedMesh != null && selectedTexture != null)
    {
        OverrideVertexColors(selectedMesh, selectedTexture);
    }

    EditorGUILayout.Space(5);

    if (GUILayout.Button("버텍스 알파 오버라이드(기준은 R채널)") && selectedMesh != null && selectedTexture != null)
    {
        OverrideVertexAlpha(selectedMesh, selectedTexture);
    }

    EditorGUILayout.Space(5);

    if (GUILayout.Button("버텍스 컬러 및 알파 초기화") && selectedMesh != null)
    {
        ResetVertexColors(selectedMesh);
    }

    EditorGUILayout.Space(30);

    

       GUILayout.BeginHorizontal();
       GUILayout.FlexibleSpace();
       GUILayout.Label("https://jadekim.tistory.com/");
       GUILayout.FlexibleSpace();
       GUILayout.EndHorizontal();
   



    GUILayout.EndScrollView();

    }

    bool SetTextureReadable(Texture2D texture, bool isReadable)
{
    if (texture == null) return false;

    string assetPath = AssetDatabase.GetAssetPath(texture);
    var textureImporter = AssetImporter.GetAtPath(assetPath) as TextureImporter;

    if (textureImporter == null) return false;

    bool wasReadable = textureImporter.isReadable;
    if (textureImporter.isReadable != isReadable)
    {
        textureImporter.isReadable = isReadable;
        AssetDatabase.ImportAsset(assetPath);
        AssetDatabase.Refresh();
    }

    return wasReadable;
}

    void OverrideVertexColors(Mesh mesh, Texture2D texture)
    {

        
        Vector2[] uv = mesh.uv;
        Color[] colors = new Color[uv.Length];

        bool wasReadable = SetTextureReadable(texture, true);

        for (int i = 0; i < uv.Length; i++)
        {
            colors[i] = texture.GetPixelBilinear(uv[i].x, uv[i].y);
        }

        mesh.colors = colors;

        if (!Application.isPlaying)
        {
            Undo.RecordObject(mesh, "Vertex Color Override");
            EditorUtility.SetDirty(mesh);
            AssetDatabase.SaveAssets();
        }

        SetTextureReadable(texture, wasReadable); // 원래 설정으로 되돌림
    }

    void OverrideVertexAlpha(Mesh mesh, Texture2D texture)
{
    bool wasReadable = SetTextureReadable(texture, true);

    Vector2[] uv = mesh.uv;
    Color[] colors = mesh.colors;

    if (colors.Length != uv.Length)
    {
        colors = new Color[uv.Length];
    }

    for (int i = 0; i < uv.Length; i++)
    {
        Color textureColor = texture.GetPixelBilinear(uv[i].x, uv[i].y);
        colors[i].a = textureColor.r; // R 채널 값으로 알파 값 설정
    }

    mesh.colors = colors;

    SetTextureReadable(texture, wasReadable); // 원래 설정으로 되돌림
}

void ResetVertexColors(Mesh mesh)
{
    Color[] colors = new Color[mesh.vertexCount];

    for (int i = 0; i < colors.Length; i++)
    {
        colors[i] = Color.white; // RGB = 1, 알파 = 1
    }

    mesh.colors = colors;
}


}

 

VertexColorOverrideTool.cs
0.00MB

 

 

버텍스의 컬러와 알파를 텍스쳐로 오버라이드하는 툴을 만들었습니다.

 

기존 기능들과 마찬가지로 에디터 아무데나 던져놓으면 window에서 꺼내 쓸 수 있습니다.

 

 

 

 

사용법은 다음과 같습니다.  

 

 

 

메쉬 선택: 툴을 적용할 메쉬를 선택합니다(드래그 가능).

텍스쳐 선택 : 메쉬에 오버라이드 할 텍스쳐를 선택합니다(드래그 가능).

 

 

버텍스 컬러 오버라이드 : 텍스쳐의 RGB값을 메쉬 버텍스 컬러에 uv를 기준으로 오버라이드합니다.  

버텍스 알파 오버라이드 : 텍스쳐의 R값을 메쉬 버텍스 알파에 uv에 맞춰 오버라이드합니다.

버텍스 컬러 및 알파 초기화 : 버텍스 컬러와 알파를 모두 1로 초기화합니다.

 

 

 

 

이렇게 생긴 메쉬에 텍스쳐 컬러를 입력해보겠습니다.

 

 

 

 

 

 

메쉬와 텍스쳐를 링크시키고 버텍스 컬러 오버라이드 버튼을 누릅니다.

 

 

 

 

 

버텍스 컬러를 이런식으로 오버라이드 시킬 수 있습니다. ( 빈 alpha blended를 넣어 확인 )

 

 

이번에는 메쉬에 버텍스 알파를 입력해보겠습니다.

 

 

 

 

다시 빈 메쉬에 이렇게 생긴 텍스쳐를 입력합니다. 

 

 

 

 

 

이번에는 버텍스 알파 오버라이드 버튼을 누릅니다. 알파가 씌워지는 기준은 R채널입니다.

 

 

 

 

 

 

정상적으로 알파가 적용되는 것을 확인할 수 있습니다.

 

 

 

 

 

버텍스 컬러 및 알파 초기화 버튼으로 컬러 및 알파를 원래대로 돌릴 수 있습니다.

 

 

'Unity > Script' 카테고리의 다른 글

이펙트 툴) 커스텀 데이터 활성화 툴  (3) 2023.12.03