Объявление
public void OverrideGeometry(Vector2[] vertices, ushort[] triangles);Параметры
vertices | Массив позиций вершин в пространстве Sprite Rect. |
triangles | Массив индексов треугольников сетки спрайтов. |
Описание
Настраивает новую геометрию Sprite.
Позиции вершин находятся в пространстве Sprite.rect, то есть от Rect.zero до Rect.size. Смещение точки поворота и преобразование в единицу пространства выполняются автоматически.
Размер массива треугольников всегда должен быть кратен 3. Вершины, соединенные с треугольником, можно использовать совместно, просто индексируя их в одну и ту же вершину.
UV спрайта рассчитываются автоматически путем сопоставления предоставленной геометрии с текстурой спрайта.
Смотри так же: прямоугольник.
В приведенном ниже примере сценария используется многоугольник, показанный в Редакторе спрайтов — изменение размера многоугольника. В этом случае спрайт имеет 8 сторон. Самая правая вершина перемещается на 50 пикселей внутрь спрайта. Это третья вершина.
// Получить вершины из скрипта и изменить положение
// одного из них. Используйте для этого OverrideGeometry().
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
private SpriteRenderer spriteR;
private Rect buttonPos1;
private Rect buttonPos2;
void Start()
{
spriteR = gameObject.GetComponent<SpriteRenderer>();
// Создайте пустую текстуру и спрайт для переопределения позже.
var texture2D = new Texture2D(64, 64);
spriteR.sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), Vector2.zero, 100);
buttonPos1 = new Rect(10.0f, 10.0f, 200.0f, 30.0f);
buttonPos2 = new Rect(10.0f, 50.0f, 200.0f, 30.0f);
}
void OnGUI()
{
if (GUI.Button(buttonPos1, "Draw Debug"))
DrawDebug();
if (GUI.Button(buttonPos2, "Perform OverrideGeometry"))
ChangeSprite();
}
// Показать треугольники спрайта
void DrawDebug()
{
Sprite sprite = spriteR.sprite;
ushort[] t = sprite.triangles;
Vector2[] v = sprite.vertices;
int a, b, c;
// рисуем треугольники, используя захваченные вершины
for (int i = 0; i < t.Length; i = i + 3)
{
a = t[i];
b = t[i + 1];
c = t[i + 2];
Debug.DrawLine(v[a], v[b], Color.white, 100.0f);
Debug.DrawLine(v[b], v[c], Color.white, 100.0f);
Debug.DrawLine(v[c], v[a], Color.white, 100.0f);
}
}
// Редактируем вершины, полученные из спрайта. Используйте OverrideGeometry для
// отправляем изменения.
void ChangeSprite()
{
Sprite o = spriteR.sprite;
Vector2[] sv = o.vertices;
for (int i = 0; i < sv.Length; i++)
{
sv[i].x = Mathf.Clamp(
(o.vertices[i].x - o.bounds.center.x -
(o.textureRectOffset.x / o.texture.width) + o.bounds.extents.x) /
(2.0f * o.bounds.extents.x) * o.rect.width,
0.0f, o.rect.width);
sv[i].y = Mathf.Clamp(
(o.vertices[i].y - o.bounds.center.y -
(o.textureRectOffset.y / o.texture.height) + o.bounds.extents.y) /
(2.0f * o.bounds.extents.y) * o.rect.height,
0.0f, o.rect.height);
// вносим небольшие изменения в 3-ю вершину
if (i == 2)
sv[i].x = sv[i].x - 50;
}
o.OverrideGeometry(sv, o.triangles);
}
}