Skip to content

Instantly share code, notes, and snippets.

@EsProgram
Last active June 24, 2022 06:15
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save EsProgram/cdc589c829848c48191578f75f4efc4d to your computer and use it in GitHub Desktop.
Save EsProgram/cdc589c829848c48191578f75f4efc4d to your computer and use it in GitHub Desktop.
UnityでUVを確認するエディタ拡張
using System.Collections;
using System.Text;
using UnityEditor;
using UnityEngine;
public class UVChecker : EditorWindow
{
private GameObject targetGameObject;
private MeshFilter targetMeshFilter;
private Texture2D tex;
[MenuItem("Window/UVChecker")]
private static void Open()
{
GetWindow<UVChecker>();
}
private void OnGUI()
{
targetGameObject = EditorGUILayout.ObjectField("TargetMesh", targetGameObject, typeof(GameObject), true) as GameObject;
if(GUILayout.Button("Execute"))
{
targetMeshFilter = targetGameObject.GetComponent<MeshFilter>();
tex = new Texture2D(256, 256);
var mesh = targetMeshFilter.sharedMesh;
DrawUV(mesh);
}
if(tex != null)
{
EditorGUI.DrawPreviewTexture(new Rect(10, 50, tex.width, tex.height), tex);
}
}
private void DrawUV(Mesh mesh)
{
var uvs = mesh.uv;
var tri = mesh.triangles;
for(int i_base = 0; i_base < tri.Length; i_base += 3)
{
int i_1 = i_base;
int i_2 = i_base + 1;
int i_3 = i_base + 2;
Vector2 uv1 = uvs[tri[i_1]];
Vector2 uv2 = uvs[tri[i_2]];
Vector2 uv3 = uvs[tri[i_3]];
DrawLine(uv1, uv2);
DrawLine(uv2, uv3);
DrawLine(uv3, uv1);
}
tex.Apply(false);
UVLog(uvs);
}
private void UVLog(Vector2[] uvs)
{
StringBuilder sb = new StringBuilder();
foreach(var uv in uvs)
{
sb.AppendLine(uv.ToString());
}
Debug.Log(sb.ToString());
}
private void DrawLine(Vector2 from, Vector2 to)
{
int x0 = Mathf.RoundToInt(from.x * tex.width);
int y0 = Mathf.RoundToInt(from.y * tex.height);
int x1 = Mathf.RoundToInt(to.x * tex.width);
int y1 = Mathf.RoundToInt(to.y * tex.height);
DrawLine(x0, y0, x1, y1, Color.red);
}
private void DrawLine(int x0, int y0, int x1, int y1, Color col)
{
int dy = y1 - y0;
int dx = x1 - x0;
int stepx, stepy;
if(dy < 0)
{ dy = -dy; stepy = -1; }
else
{ stepy = 1; }
if(dx < 0)
{ dx = -dx; stepx = -1; }
else
{ stepx = 1; }
dy <<= 1;
dx <<= 1;
float fraction = 0;
tex.SetPixel(x0, y0, col);
if(dx > dy)
{
fraction = dy - (dx >> 1);
while(Mathf.Abs(x0 - x1) > 1)
{
if(fraction >= 0)
{
y0 += stepy;
fraction -= dx;
}
x0 += stepx;
fraction += dy;
tex.SetPixel(x0, y0, col);
}
}
else
{
fraction = dx - (dy >> 1);
while(Mathf.Abs(y0 - y1) > 1)
{
if(fraction >= 0)
{
x0 += stepx;
fraction -= dy;
}
y0 += stepy;
fraction += dx;
tex.SetPixel(x0, y0, col);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment