Установка alphahittestminimumthreshold кнопки приводит к отсутствию вызова Button.OnPointerDown

#c# #unity3d #alpha #raycasting

#c# #unity3d #альфа #raycasting

Вопрос:

Я хочу создать кнопку, которая имеет пользовательскую форму в Unity.

Я создал объект пользовательского интерфейса по умолчанию> Button и установил для него Image следующий спрайт: введите описание изображения здесь

На этом сайте это не показано, но круг — единственная прозрачная часть этого изображения. Это спрайт .png.

Когда я установил это в качестве спрайта для моей кнопки, я мог щелкнуть по всему прямому преобразованию этого спрайта, чтобы активировать кнопку, используя метод OnPointerDown () моей кнопки, и скрыть некоторые другие спрайты вокруг него:

 public override void OnPointerDown(PointerEventData eventData)
{
    base.OnPointerDown(eventData);
    Debug.Log("Foo");
}
 

Каждый раз, когда нажимали на любую часть спрайта, прозрачную или нет, печаталось «Foo».

Теперь я устанавливаю для кнопки alphaHitTestMinimumThreshold значение 0.5:

GetComponent<Button>().image.alphaHitTestMinimumThreshold = .5f;

И, как следует из документов, я отключил атласирование…

введите описание изображения здесь

… и включен режим чтения / записи для спрайта:

введите описание изображения здесь

Но теперь, когда я нажимаю кнопку в своей сцене.. ничего не происходит. Независимо от того, где я нажимаю, «Foo» больше не печатается.

Затем я попытался изменить значение alphaHitTestMinimumThreshold на множество разных значений. Опять же, вся кнопка больше не была доступна для просмотра. Однако, если я вообще не коснусь alphaHitTestMinimumTreshold, мой «Foo» снова печатается.

Почему изменение значения alphaHitTestMinimumTreshold на любое значение приводит к тому, что мой метод OnPointerDown никогда не вызывается?

Ответ №1:

Итак, после 12 часов перебора всевозможных опций я обнаружил, что было более 3 последовательных проблем, вызывающих такое поведение.

Если вы когда-нибудь столкнетесь с тем, что ваши прозрачные кнопки не работают, обязательно попробуйте выполнить следующие шаги:

  • Убедитесь, что в настройках импорта текстур включено чтение / запись
  • Попробуйте, помогает ли установка типа сетки в режиме спрайта на полный прямоугольник (иногда хитбокс кнопки выключен)
  • Отключите атласацию в разделе «Настройки проекта»> «Редактор»> «Упаковщик спрайтов»> «Режим»
  • ..и, наконец, что помогло мне: если вы работаете с сборкой, которая вложена в другую сборку (скажем, у вас есть сборная для вашей кнопки, а затем другая сборная для вашего пользовательского интерфейса canvas / contents), удалите вложенную сборную из родительской сборки (иначе удалите сборную кнопку изСборный пользовательский интерфейс), и просто добавьте его обратно снова. Для меня это было чертовски просто.

Я трижды проверил, отличается ли моя вложенная сборка кнопок от схемы сборки кнопок, и это не так. Но каким-то образом удаление его из сборного пользовательского интерфейса и добавление его обратно снова решило мою проблему с большим количеством магии.

Ответ №2:

С помощью кнопок прозрачности я обнаружил, что обнаружение улучшается, когда изображение является дочерним объектом button . Итак, иерархия — это Холст> Кнопка> Изображение.

Ответ №3:

Я знаю, старая тема, но она появилась, так что вот мое решение:

Он выполнил все предложения, но это не сработало.

ОДНАКО то, что в конце концов сработало для меня, — это УКАЗАТЬ ПРАВИЛЬНЫЙ РАЗМЕР. Мой игровой объект был удлиненным, но у спрайта была отмечена галочка «сохранить соотношение сторон». Я просто не потрудился правильно определить его размер. Поэтому, когда у вас есть изображение, установите размер игрового объекта на правильные размеры.