Сейчас я работаю над очень простым прототипом. У него просто есть карта тайлов Unity 2D, и с помощью кода я создаю кнопки на некоторых плитках. Каким-то образом эти кнопки не запускают события onClick.
При выполнении трассировки Raycast на моем TileMap я обнаружил, что первый элемент блокирует его (MainPanelSettings), похоже, является элементом редактора Unity. Как я могу решить эту проблему?
Кроме того, я трижды проверил все настройки raycast и Z-индексы на своих элементах. Я не думаю, что это проблема, но я открыт для любых предложений. Я буквально пытаюсь это исправить уже 3 вечера.
Журнал отладки:
Hit: MainPanelSettings
UnityEngine.Debug:Log (object)
TilemapController:Update () (at Assets/Scripts/Map/TileMapController.cs:29)
Hit: TileYieldButton(Clone)
UnityEngine.Debug:Log (object)
TilemapController:Update () (at Assets/Scripts/Map/TileMapController.cs:29)
Click over UI, ignoring TilemapController
UnityEngine.Debug:Log (object)
TilemapController:Update () (at Assets/Scripts/Map/TileMapController.cs:33)
Вот как я создал этот оператор отладки:
PointerEventData pointerData = new PointerEventData(EventSystem.current);
pointerData.position = Mouse.current.position.ReadValue();
List results = new List();
EventSystem.current.RaycastAll(pointerData, results);
foreach (var r in results)
{
Debug.Log("Hit: " + r.gameObject.name);
}
// Only block if we hit an actual Button
if (results.Any(r => r.gameObject.GetComponent() != null))
{
Debug.Log("Click over UI, ignoring TilemapController");
//return;
}
Прослушиватель событий кнопки:
btn.onClick.AddListener(() =>
{
bg.color = (bg.color == originalColor) ? Color.grey : originalColor;
Debug.Log($"Button clicked for tile: {land.Position}");
});
С помощью этого я могу инициировать нажатие кнопок, но не путем фактического нажатия и использования встроенного метода onclick кнопки:
PointerEventData pointerData = new PointerEventData(EventSystem.current);
pointerData.position = Mouse.current.position.ReadValue();
List results = new List();
EventSystem.current.RaycastAll(pointerData, results);
foreach (var r in results)
{
Button btn = r.gameObject.GetComponent();
if (btn != null)
{
// Fire the button click event manually
btn.onClick.Invoke();
Debug.Log("Manually fired click for button: " + r.gameObject.name);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... he-onclick