Не столько вопрос, сколько нужно мнение опытных "юнитологов". Как лучше реализовать кликабельные ячейки (квадратные, гексагональные, не суть важно) карты? Генерировать из обычных GameObject, повесив на каждую ячейку скрипт действия и 2d-коллайдер (просто, но не слишком-ли затратно, если ячеек далеко за сотню?)? Отрисовать через Canvas? Или более разумные варианты существуют? Важно, что игра в 2d, в изометрии.
Каждый по своему делает. Я например сделал бы префаб одной ячейки с коллайдером. И из кода разбросал бы ячейки по полю при старте игры по нужным координатам. Можно поле и изначально на сцене в собранном виде иметь. Кому - как удобнее, готовых рецептов не существует... X.cor.R (Prologue)
Я например сделал бы префаб одной ячейки с коллайдером. И из кода разбросал бы ячейки по полю при старте игры по нужным координатам.
Так изначально и поступил, но потом подумал, что 400+ ячеек, на каждой из которых висит код, могут в будущем серьёзно подорвать быстродействие игры. Как вариант, добавлять скрипт и коллайдер только в момент обращения к префабу-ячейке, но снова лишние вычисления и рэйкасты - хрен редьки не слаще.
Geb-Z, на самом деле, все проще можно сделать. Отлавливаем клик по плоскости и используя полученные координаты рассчитываем ячейку, в которую мы попали.
К примеру, у нас есть поле 1024x1024 и ячейка 64x64. При клике по полю, мы получили координаты x = 543, y = 342. Делим без остатка эти две переменные и получаем a1 = 543/64 = 8, a2 = 342 / 64 = 5. Ну и мы имеем, что игрок выбрал ячейку в 8 столбце, 5 строке. end.
400+ ячеек, на каждой из которых висит код, могут в будущем серьёзно подорвать быстродействие игры.
С какого перепугу ? Не в апдейте же клик в ячейках отлавливать. Пишется метод который срабатывает на клик, а в остальное время он нейтрален. Да и не обязательно скрипты вешать на ячейки, можно их обрабатывать отдельным - единичным скриптом. X.cor.R (Prologue)
Отлавливаем клик по плоскости и используя полученные координаты рассчитываем ячейку, в которую мы попали.
В таком случае графическое отображение ячеек вообще не играет роли. Идея хорошая, но пока не в моём варианте.
ЦитатаЛевша ()
Да и не обязательно скрипты вешать на ячейки, можно их обрабатывать отдельным - единичным скриптом.
Cобирал ячейки в массив и присваивал им класс помощью AddComponent<>(), в котором уже отслеживал клик по ячейке через OnMouseDown, но не был уверен в правильности своего решения.
Продолжая идею собирания ячеек, набросал следующий код:
Код
usingUnityEngine; usingSystem.Collections;
publicclassXManager:MonoBehaviour{
publicGameObject grid;// prefab, из которого генерируется поле ячеек publicGameObject[] grid_gen;// массив ячеек publicGameObject menu;//объект на сцене, содержащий GUI меню. publicVector2 tran;
// Use this for initialization voidStart(){ menu.SetActive(false); GenGrid();// Вызываем функцию генерации ячеек. grid_gen =GameObject.FindGameObjectsWithTag("Grids");// Добавляем в массив все сгенерированные ячейки. foreach(GameObject g in grid_gen){ g.AddComponent<BuildMenu>();// Вешаем на каждую ячейку class Build Menu } }
// Update is called once per frame voidFixedUpdate(){ }
publicvoidGenGrid(){//генерация сетки for(int i =0; i < gen_x; i++){//запускаем цикл генерации for(int j =0; j < gen_y; j++){ float x =((j - i)*(gen_h /2))/100; float y =((j + i)*(gen_w /2))/100; Instantiate(grid,newVector3(y, x,0),Quaternion.identity);// Генерируем поле ячеек. } } }
publicvoidOnClick(){ menu.SetActive(true);// Активируем объект с висящим на нём GUI-меню. } }
Вот создал я элемент dropdawn. В инспекторе заполнил строки. Все красиво - нажимается, выбирается. Но как дальше-то? Как мне в скрипте к нему обратиться и узнать, что же там выбрали? Что-то типа такого: ... if (выбрано первое значение в выпадающем списке) {n=....}; if (выбрано второе значение в выпадающем списке) {n=....} ... Что написать вместо "выбрано первое значение в выпадающем списке"?
Как сделать Canvas непрозрачным для курсора (например, если под Canvas находится объект с OnMouseEnter, то объект всё равно не реагирует на мышку)? Что-то слышал про Event System и использование Switch, но в этом направление сильно не копал.
С евент систем - там все мутно. Проще курсор в ректе гуя отлавливать и запрещать\разрешать взаимодействие. А коллайдер на гуе - да, не помогает. Он находится физически в сцене а в камеру только проецируется (чето я не подумал)... X.cor.R (Prologue)