Не столько вопрос, сколько нужно мнение опытных "юнитологов". Как лучше реализовать кликабельные ячейки (квадратные, гексагональные, не суть важно) карты? Генерировать из обычных 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, но не был уверен в правильности своего решения.
Продолжая идею собирания ячеек, набросал следующий код:
Код
using UnityEngine; using System.Collections;
public class XManager : MonoBehaviour {
public GameObject grid; // prefab, из которого генерируется поле ячеек public GameObject[] grid_gen; // массив ячеек public GameObject menu; //объект на сцене, содержащий GUI меню. public Vector2 tran;
public int gen_x; public int gen_y; public float gen_w; public float gen_h;
// Use this for initialization void Start () { 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 void FixedUpdate () { }
public void GenGrid (){ //генерация сетки 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, new Vector3 (y, x, 0), Quaternion.identity); // Генерируем поле ячеек. } } }
public void OnClick() { menu.SetActive (true); // Активируем объект с висящим на нём GUI-меню. } }
public class BuildMenu : MonoBehaviour { public Renderer rend; public GameObject tor;
void Start() { rend = GetComponent<Renderer>(); rend.enabled = false;
Вот создал я элемент dropdawn. В инспекторе заполнил строки. Все красиво - нажимается, выбирается. Но как дальше-то? Как мне в скрипте к нему обратиться и узнать, что же там выбрали? Что-то типа такого: ... if (выбрано первое значение в выпадающем списке) {n=....}; if (выбрано второе значение в выпадающем списке) {n=....} ... Что написать вместо "выбрано первое значение в выпадающем списке"?
Как сделать Canvas непрозрачным для курсора (например, если под Canvas находится объект с OnMouseEnter, то объект всё равно не реагирует на мышку)? Что-то слышал про Event System и использование Switch, но в этом направление сильно не копал.
С евент систем - там все мутно. Проще курсор в ректе гуя отлавливать и запрещать\разрешать взаимодействие. А коллайдер на гуе - да, не помогает. Он находится физически в сцене а в камеру только проецируется (чето я не подумал)... X.cor.R (Prologue)