i saw Unity - How to set the color of an individual face when clicking a mesh? this Question and I'm challenging this. However, I have no understanding of how to reconstruct UV. If there's anyone who can tell me which part to modify in the code below, I'd like to get help.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class meshColor : MonoBehaviour
{
public GameObject cube;
[SerializeField] private MeshFilter meshFilter;
[SerializeField] private MeshRenderer meshRenderer;
[SerializeField] private MeshCollider meshCollider;
private Mesh _mesh;
private void Awake()
{
if (!meshFilter) meshFilter = GetComponent<MeshFilter>();
if (!meshRenderer) meshRenderer = GetComponent<MeshRenderer>();
if (!meshCollider) meshCollider = GetComponent<MeshCollider>();
_mesh = meshFilter.mesh;
var colors = new Color[_mesh.vertices.Length];
for (var k = 0; k < colors.Length; k++)
{
colors[k] = Color.white;
}
_mesh.colors = colors;
}
private void Update()
{
if (!Input.GetMouseButtonDown(0)) return;
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out var hit))
{
Debug.Log(hit.triangleIndex);
var vertices = _mesh.vertices;
var uvs = _mesh.uv;
var triangles = _mesh.triangles;
var colors = _mesh.colors;
var vert1Index = triangles[hit.triangleIndex * 3 + 0];
var vert2Index = triangles[hit.triangleIndex * 3 + 1];
var vert3Index = triangles[hit.triangleIndex * 3 + 2];
var vert1Pos = vertices[vert1Index];
var vert2Pos = vertices[vert2Index];
var vert3Pos = vertices[vert3Index];
var uv1Pos = uvs[vert1Index];
var uv2Pos = uvs[vert2Index];
var uv3Pos = uvs[vert3Index];
var vert1Occurrences = 0;
var vert2Occurrences = 0;
var vert3Occurrences = 0;
foreach (var index in triangles)
{
if (index == vert1Index) vert1Occurrences++;
else if (index == vert2Index) vert2Occurrences++;
else if (index == vert3Index) vert3Occurrences++;
}
var newVertices = vertices.ToList();
var newColors = colors.ToList();
var newUvs = uvs.ToList();
if (vert1Occurrences > 1)
{
newVertices.Add(vert1Pos);
newColors.Add(new Color());
newUvs.Add(uv1Pos);
vert1Index = newVertices.Count - 1;
}
if (vert2Occurrences > 1)
{
newVertices.Add(vert2Pos);
newColors.Add(new Color());
newUvs.Add(uv2Pos);
vert2Index = newVertices.Count - 1;
}
if (vert3Occurrences > 1)
{
newVertices.Add(vert3Pos);
newColors.Add(new Color());
newUvs.Add(uv3Pos);
vert3Index = newVertices.Count - 1;
}
triangles[hit.triangleIndex * 3 + 0] = vert1Index;
triangles[hit.triangleIndex * 3 + 1] = vert2Index;
triangles[hit.triangleIndex * 3 + 2] = vert3Index;
newColors[vert1Index] = Color.red;
newColors[vert2Index] = Color.red;
newColors[vert3Index] = Color.red;
newUvs[vert1Index] = new Vector2(uv1Pos.x, uv1Pos.y);
newUvs[vert2Index] = new Vector2(uv2Pos.x, uv2Pos.y);
newUvs[vert3Index] = new Vector2(uv3Pos.x, uv3Pos.y);
_mesh.vertices = newVertices.ToArray();
_mesh.triangles = triangles;
_mesh.colors = newColors.ToArray();
_mesh.uv = newUvs.ToArray();
_mesh.RecalculateNormals();
}
else
{
Debug.Log("no hit");
}
}
}