Гексагональная карта

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

Гексагональная карта

Сообщение _3D_ 28 авг 2012, 11:51

Вопрос у меня возник: а здесь есть какой-либо раздел для разбора конкретного кода?
Профит таких тем вижу в формировании рабочих примеров для новичков для последующих разборов.

Например, я только начал изучать Unity. Делаю гексагональную спрайтовую карту (при помощи RagePixel). Из опыта C# пытаюсь всё организовать по классам, но уже сомневаюсь в правильности организации своей архитектуры. Можно ли выкладывать простейший код для разбора конкретных вопросов? Ничего лишнего там особо нет, чтобы не отвлекаться от предмета вопроса.
Цель - реализовать самоорганизующуюся гексагональную карту (на входе карта в некоем виде), которая сама инициализируется при старте и отслеживает работу с мышью (клики по ячейкам).

Предполагаемая архитектура (объясняю своими словами, простите, может спутаю термины):
- Класс ячейки может отображать Prefab шестигранника с любым типом местности (равнина, лес, горы) и содержит информацию по типу юнита на нём, если таковой есть (классы в папке Classes).
- Класс карты по входной матрице строит карту из классов ячеек (скрипт MapController.cs).
- На сцене единственный объект - камера, на которой и висит построитель карты (MapController.cs), контроллер мыши (MouseController.cs) и пользовательский интерфейс (UserInterface.cs). Последнее для данного примера не важно, забыл удалить.

Сейчас столкнулся с тем, что:
1. Все объекты ячеек создаются копиями префеба Cell и смена текстуры одной ячейки влияет на все экземпляры этого класса (сделал выводы, но встал в ступор как быть теперь?).
2. Physics.Raycast никак не хочет втыкаться в ячейки (я уже начал грешить, что у объектов ячеек нет какого-то необходимого коллайдера? или лучи не в ту сторону "бьют"?)

Потому можете подсказать верное направление для реализации? Постарался убрать всё лишнее из проекта и минимизировать его, если у кого будет время заглянуть, буду благодарен конструктивным замечаниям.
У вас нет доступа для просмотра вложений в этом сообщении.
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение Syberex 28 авг 2012, 13:00

1. Создать для каждого вида ячейки свой префаб, для каждого префаба свой материал, в каждом задать нужную текстуру!

2. Каждая ячейка должна иметь свой коллайдер соответственно, коллайдер надо включить в префаб ячейки.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Гексагональная карта

Сообщение _3D_ 28 авг 2012, 14:05

Спасибо!
По п.1 я всё склонялся к автоматизации, вплоть до того, чтобы сделать абстрактный префаб-класс с вложенными префабами каждого типа ячеек, чтобы родительский сам создавал нужный в зависимости от параметра в его конструкторе. Ибо мне всё кажется глупым работать с разными типами префабов одновременно и каждый раз дёргаться определять с каким же типом из них мне нужно работать в данный момент.

А с коллайдерами я чисто наобум предположил из теоретических изысканий. Теперь хотя бы продолжу копать, чётко предполагая что именно получу в результате. :)
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение WhiteDevil 28 авг 2012, 14:15

Что я сделал: скачал ваш проект, добавил на префаб Cell бокс коллайдер и откомментировал в коде MouseController.cs строчку
Синтаксис:
Используется csharp
                                if (cell != null) {
                                        cell.cellSprite.SetSprite("Wood");
                                        Debug.Log("mouse click");
                                }
 


И.. видимо все работает. Нажимаю на ячейку, и лишь та ячейка, на которую я кликнул меняется в зеленый цвет.
РейджПиксел сохраняет количество драуколов. Если было бы отдельными текстурами и в ручную, было бы все намного хуже.
Так что... обе проблемы решены?...
Просто у вас не то что не было "нужного" колайдера, его не было вообще.
Что можно сделать:
- так как у вас объект - шестигранный, то под него колайдера класного не будет. Можно в максо-майе заделать такой-же шестигранник и под него делать Mesh Collider
- обязателен ли вам РейджПиксел? Имея атлас всех объектов, вы можете и вручную управлять UV координатами материала. И не нужен для этого плагин
- Еще вам нужно знать о лейерах.
http://docs.unity3d.com/Documentation/C ... ayers.html
Чтобы рейкастить по типу объекта. Рейкаст работает по первому попавшемуся колайдеру (на случай, если вы положете колайдер на префаб unit, то до cella вы уже без лейеров не доберетесь)
- Как только вы захотите освободиться от РейджПиксел, вам надо знать следующее:
http://docs.unity3d.com/Documentation/S ... derer.html
http://docs.unity3d.com/Documentation/S ... ilter.html
(а конкретно: отличие между material и sharedMaterial, mesh и sharedMesh)
Это как раз касается случая когда вы меняете текстуру одному объекту и она меняется на всех сразу

Ну вобщем.. постарался максимально :)


Едит:
_3D_ писал(а): Ибо мне всё кажется глупым работать с разными типами префабов одновременно и каждый раз дёргаться определять с каким же типом из них мне нужно работать в данный момент.

И это действительно глупо. Потому что, единственное чем будут отличаться вашы селлы: UV координата на меше, генерируемая РейджПикселом (что можно делать и без него)
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Гексагональная карта

Сообщение Syberex 28 авг 2012, 14:34

WhiteDevil писал(а):И это действительно глупо. Потому что, единственное чем будут отличаться вашы селлы: UV координата на меше, генерируемая РейджПикселом (что можно делать и без него)

По моему это не глупо ни сколько! В Юнити это нормальный подход. Так же ни сколько не глупо задать все в коде, но в этом случае будет сложнее и менее визуально, зато больше контроля.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Гексагональная карта

Сообщение _3D_ 28 авг 2012, 14:41

Отлично! Попробую повторить.

Просто у вас не то что не было "нужного" колайдера, его не было вообще.

С коллайдерами я ещё не сталкивался, вот - видимо, настало время.

- так как у вас объект - шестигранный, то под него колайдера класного не будет. Можно в максо-майе заделать такой-же шестигранник и под него делать Mesh Collider

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

- обязателен ли вам РейджПиксел? Имея атлас всех объектов, вы можете и вручную управлять UV координатами материала. И не нужен для этого плагин

По первости я вообще понадобавлял всё, что было рекомендовано теми или иными лицами для 2D разработки. В итоге минимизировал до RagePixel'а - пока он позволяет мне:
1) Не париться с настройкой камеры и сцены в целом, а сразу приступить к разработке. Быть может позже, как уложу в голове как всё сделать самому и приведу код в порядок.
2) Даёт возможность "здесь и сейчас" клепать спрайты для отладочного кода, опять-таки не отвлекаясь от конкретной задачи. Уже позже можно будет задаться целью загрузки нормальных спрайтов. Тем более, что фразы "вручную управлять UV координатами материала" сейчас меня вгоняют только в ступор.

И спасибо за направление на Слои и 2D - займусь, как в голове устаканится.
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение WhiteDevil 28 авг 2012, 14:41

Syberex писал(а):По моему это не глупо ни сколько! В Юнити это нормальный подход. Так же ни сколько не глупо задать все в коде, но в этом случае будет сложнее и менее визуально, зато больше контроля.

Согласен, сказать "глупо" было слишком глупо.. Не хотел обидеть :)
Скажем так, есть большое количество подходов, и это одно из них.
Но в нем есть минус - мобайл будет плохо есть его, если таких кусочков пойдут на сотни, тысячи. Зато легче новичкам

_3D_ писал(а):Можно ли создать mash шестигранника программно? Как-то совсем не улыбает ради него ставить максо-майю, разве что ради ностальгии по ушедшему детству.
Я предполагаю этот шестигранник мне понадобится для корректного определения кликов?

Можно, вот код:
http://docs.unity3d.com/Documentation/S ... /Mesh.html
Создаете меш и сохраняете его. А значит и МешКолайдер тоже создаете динамически после создания меша.
Или же можно попробовать.. создать меш и сохранить его на жестком. Я такого не делал..
Последний раз редактировалось WhiteDevil 28 авг 2012, 14:52, всего редактировалось 3 раз(а).
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Гексагональная карта

Сообщение _3D_ 28 авг 2012, 14:48

Syberex писал(а):
WhiteDevil писал(а):И это действительно глупо. Потому что, единственное чем будут отличаться вашы селлы: UV координата на меше, генерируемая РейджПикселом (что можно делать и без него)

По моему это не глупо ни сколько! В Юнити это нормальный подход. Так же ни сколько не глупо задать все в коде, но в этом случае будет сложнее и менее визуально, зато больше контроля.

Если честно, мне больше импонирует вариант с одним массивом спрайтов (в данном случае материалом), которым рулит один класс ячейки, т.к. этому классу я всегда могу подсунуть другой материал (скин) карты и в миг сменить визуализацию поля без пробегания по каждой ячейке и подмены её другим префебом.

Это же касается возможности включения "тумана войны" - я просто буду включать другой кусок спрайта, соответствующий активному. Хотя, тут я ещё не думал точно - возможно, стоит просто поверх пускать полупрозрачный гекс.
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение bomberest 28 авг 2012, 15:08

Основы Unity3D Свой 2D-движок Фильм для разработчиков Кастомизация едитора
Лекции игрового программирования
Skype: Andrewf56 | Steam: bomberest (-AnF-) | Vk: _https://vk.com/andrewshut
Аватара пользователя
bomberest
Старожил
 
Сообщения: 538
Зарегистрирован: 22 июн 2011, 14:38
Откуда: Минск
  • ICQ

Re: Гексагональная карта

Сообщение _3D_ 28 авг 2012, 15:27

http://habrahabr.ru/post/128106/

Да-да, читал! :) И как всегда, хочется сделать что-то своё, а вечно не доходят руки. И вот решил под давно культивированную идею под шумок изучить Unity, а от html всё-таки отказался хоть реализация на нём у меня и вызвала бы много меньше вопросов.

Можно, вот код:
http://docs.unity3d.com/Documentation/S ... /Mesh.html
Создаете меш и сохраняете его. А значит и МешКолайдер тоже создаете динамически после создания меша.
Или же можно попробовать.. создать меш и сохранить его на жестком. Я такого не делал..

Воткнул пока в качестве меша плоский Capsule Collider - он вполне вписывается в гекс и даёт пространство по краям, чтобы уменьшить количество промахов при кликах между гексами. Ну, и на данный момент я выбираю "реактивное" изучение Unity пока идея "держит". По мере того как видишь проявляющийся результат становится легче двигаться дальше и остаётся интерес возвращаться для оптимизации, вместо того, чтобы зарываться с головой и погрязнуть в изучении лишь только самого "инструмента".
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение _3D_ 29 авг 2012, 07:59

Ещё раз спасибо за подсказки!

Следующий вопрос заключается в следующем: при выборе юнита необходимо затенять часть ячеек, куда юнит дойти за 1 ход не может. Пока у меня два предположения как это лучше делать:
1) по отработанной уже схеме просто менять текстуру ячейки на аналогичную затемнённую;
2) добавить поверху тёмные полупрозрачные ячейки и включать/выключать их видимость при необходимости, затеняя те ячейки, что находятся под ними.

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

UPD:
Пока писал вспомнил про функцию Tint Color у объектов - кажется, это то, что мне нужно..
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение Syberex 29 авг 2012, 09:52

Смотря с какого ракурса смотрит камера, но я бы сделал так:
в префабе ячейки сделал дубль ячейки выше нормального, по умолчанию он отключен (active = false), при появлении необходимости затенять включаем статик! переменную isShadow = true, по которой затеняются все ячейки, кроме тех которым включим переменную isLight = true (не статик!)
Синтаксис:
Используется csharp
void Update() {
    if (isShadow && !isLight)
        shadow.active = true;
    else
        shadow.active = false;
}
 


Но на самом деле, подсвечивать доступные не затеняя остальные будет более оптимально :-?
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Гексагональная карта

Сообщение _3D_ 29 авг 2012, 13:03

Syberex писал(а):Смотря с какого ракурса смотрит камера, но я бы сделал так:
в префабе ячейки сделал дубль ячейки выше нормального, по умолчанию он отключен (active = false), при появлении необходимости затенять включаем статик! переменную isShadow = true, по которой затеняются все ячейки, кроме тех которым включим переменную isLight = true (не статик!)
Синтаксис:
Используется csharp
void Update() {
    if (isShadow && !isLight)
        shadow.active = true;
    else
        shadow.active = false;
}
 


Но на самом деле, подсвечивать доступные не затеняя остальные будет более оптимально :-?


Камера смотрит строго на плоские объекты, без перспективы, как нужно в 2D. Вот как засунуть один префеб в другой - с этим ещё не разобрался.
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

Re: Гексагональная карта

Сообщение PAX 29 авг 2012, 15:38

Syberex писал(а):Смотря с какого ракурса смотрит камера, но я бы сделал так:
в префабе ячейки сделал дубль ячейки выше нормального, по умолчанию он отключен (active = false), при появлении необходимости затенять включаем статик! переменную isShadow = true, по которой затеняются все ячейки, кроме тех которым включим переменную isLight = true (не статик!)
Синтаксис:
Используется csharp
void Update() {
    if (isShadow && !isLight)
        shadow.active = true;
    else
        shadow.active = false;
}
 


Но на самом деле, подсвечивать доступные не затеняя остальные будет более оптимально :-?


С точки зрения оптимизации данный способ ужасен. Это на каждой ячейке будет свой Update? который каждый кадр будет выполнять действие.
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Гексагональная карта

Сообщение _3D_ 29 авг 2012, 16:14

PAX писал(а):С точки зрения оптимизации данный способ ужасен. Это на каждой ячейке будет свой Update? который каждый кадр будет выполнять действие.

Я сделал иначе: каждой ячейке привязал дочерний объект-тень, по умолчанию отключенный. И при кликах по ячейкам (обработчик один - MapController) контроллер оценивает наличие юнита в ячейке и пробегает по окружающим ячейкам, подсвечивая путь возможного движения.

Итого - обновление сцены идёт один раз сразу после клика. Пожже ещё код подсветки пути перенесу в FixUpdate (который после Update вызывается - забыл точное название, ещё не пользовал), чтобы не нагружать Update.
_3D_
UNец
 
Сообщения: 14
Зарегистрирован: 28 авг 2012, 11:38

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 17