Решён
Как получить цвет определенной вершины меша?

Alex G Разработка игр
590
3

Работаю в Unity, пишу процедурную генерацию ландшафта. Есть меш terrain, каждой вершине назначен свой цвет через mesh.colors32. Теперь нужно во время выполнения получить цвет конкретной вершины по ее индексу.

Пробовал напрямую обращаться к массиву mesh.colors32[vertexIndex] но получаю исключение IndexOutOfRangeException хотя индекс точно существует (проверял через mesh.vertexCount).

Как получить цвет определенной вершины меша корректно? Unity 2021.3 LTS.

Решение
12
Участник • 2 ответа

Проблема в том что массив mesh.colors32 может быть пустым если цвета не были явно установлены.

Сначала проверь длину:

Color32[] colors = mesh.colors32;
if (colors.Length == 0)
{
    Debug.LogError("Mesh has no vertex colors!");
    return;
}

if (vertexIndex >= 0 && vertexIndex < colors.Length)
{
    Color32 vertexColor = colors[vertexIndex];
}

Если массив пустой, нужно инициализировать:

Color32[] colors = new Color32[mesh.vertexCount];
for (int i = 0; i < colors.Length; i++)
{
    colors[i] = Color.white; // дефолтный цвет
}
mesh.colors32 = colors;

Также учти что при изменении топологии меша (добавлении/удалении вершин) массив цветов не обновляется автоматически.

Аватар Alex G

Точно! Забыл проверить длину массива. Спасибо, заработало

3
Участник • 3 ответа

Возможно у тебя меш содержит подмеши (submeshes), тогда индексация может сбиваться. Попробуй через GetColors:

List<Color32> colorsList = new List<Color32>();
mesh.GetColors(colorsList);
Color32 color = colorsList[vertexIndex];
1
Участник • 2 ответа

я делал похожую штуку для воды процедурной, у меня colors32 всегда null был пока не сделал mesh.colors = new Color[vertexcount], может у тебя также

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.