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;
}
}
버텍스의 컬러와 알파를 텍스쳐로 오버라이드하는 툴을 만들었습니다.
기존 기능들과 마찬가지로 에디터 아무데나 던져놓으면 window에서 꺼내 쓸 수 있습니다.
사용법은 다음과 같습니다.
메쉬 선택: 툴을 적용할 메쉬를 선택합니다(드래그 가능).
텍스쳐 선택 : 메쉬에 오버라이드 할 텍스쳐를 선택합니다(드래그 가능).
버텍스 컬러 오버라이드 : 텍스쳐의 RGB값을 메쉬 버텍스 컬러에 uv를 기준으로 오버라이드합니다.
버텍스 알파 오버라이드 : 텍스쳐의 R값을 메쉬 버텍스 알파에 uv에 맞춰 오버라이드합니다.
버텍스 컬러 및 알파 초기화 : 버텍스 컬러와 알파를 모두 1로 초기화합니다.
이렇게 생긴 메쉬에 텍스쳐 컬러를 입력해보겠습니다.
메쉬와 텍스쳐를 링크시키고 버텍스 컬러 오버라이드 버튼을 누릅니다.
버텍스 컬러를 이런식으로 오버라이드 시킬 수 있습니다. ( 빈 alpha blended를 넣어 확인 )
이번에는 메쉬에 버텍스 알파를 입력해보겠습니다.
다시 빈 메쉬에 이렇게 생긴 텍스쳐를 입력합니다.
이번에는 버텍스 알파 오버라이드 버튼을 누릅니다. 알파가 씌워지는 기준은 R채널입니다.
정상적으로 알파가 적용되는 것을 확인할 수 있습니다.
버텍스 컬러 및 알파 초기화 버튼으로 컬러 및 알파를 원래대로 돌릴 수 있습니다.
'Unity > Script' 카테고리의 다른 글
이펙트 툴) 커스텀 데이터 활성화 툴 (3) | 2023.12.03 |
---|