Кнопки произвольной формы в Unity3d

541
10 мая 2017, 06:12

Как реализовать кнопку произвольной формы?

Имеется Button, имеется текстура с альфа-каналом, имеющая полностью прозрачные области (якобы там ничего и нет. Как никак, графический файл являет собой прямоугольную область). Нужно, чтобы область реагирования на клик у кнопки совпадала с непрозрачной частью наложенной на кнопку текстуры. Если просто натянуть текстуру на кнопку, последняя реагирует на нажатия в любой точке картинки, даже прозрачной.

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

Answer 1

Не совсем понятно, что вы в итоге хотите получить: простую кастомную кнопку или также карту делаете, как в приведенном вами примере или еще что.

Как бы то ни было, в Unity уже есть разные вещи для работы с такими текстурами. К примеру есть у вас текстура со множеством точек перехода. Без проблем. Делаете картинку спрайтом, навешиваете на него Polygon Collider 2D и делаете скрипт, который реагирует, например, на мышь:

using UnityEngine;
public class PolygonColliderHover : MonoBehaviour {
    // Use this for initialization
    private SpriteRenderer spriteRenderer;
    void OnMouseOver() {
        spriteRenderer.color = Color.red;
    }
    void OnMouseExit() {
        spriteRenderer.color = Color.white;
    }
}

Всё. Результат:

Как видим, картинка имеет коллайдер, по форме "обтекающий" текстуру, при наведении на который что-то происходит.

Тоже самое можно делать и с картой. Навешиваем всё тот же Polygon Collider 2D у которого можно добавить множество областей, которые имеют множеством кастомных координат:

Твори что угодно. Вот пример при наведении на одну из областей карты:

Саму карту можно делать с прозрачным фоном. У спрайта есть SpriteMode Multiple и Polygon, позволяющие отделить те же материки на карте друг от друга.

READ ALSO
Сохранение файла в облаке

Сохранение файла в облаке

ТакНадеюсь правильно поставлю вопрос

392
C#/.NET user32.dll

C#/.NET user32.dll

Как получить X и Y мышки из user32dll ? Вроде бы есть функция GetCursorPos, но я не понял как её использовать

343
Сервер не читает данные

Сервер не читает данные

Есть проект на ардуиноСуть проекта в том, чтобы с кнопки отправлять данные на сервер

319
Как обработать ответ от сервера при завершении php сессии без лишних телодвижений

Как обработать ответ от сервера при завершении php сессии без лишних телодвижений

Подскажите, пожалуйста, универсальный метод, так как на сайте используется ajax валидация

340