Страница 1 из 1

Гексовое поле

СообщениеДобавлено: 24 авг 2011, 22:03
Kroid
Приветствую, форум. Я хочу сделать такую сцену: поле боя, состоит из клеток(гексов). На одном из гексов игрок. При нажатии мышкой на любой из гексов герой перемещается к нему.

В общих чертах, я буду делать так:
создаю модель гекса (например, в 3ds max);
делаю на сцене terrain, поверх него укладываю модели гексов, обзываю каждый гекс по-разному;
пишу скрипт с логикой вида: "Щелкнул мышкой, узнал координаты, получил название гекса, заставил героя встать на него".

Хотелось бы узнать, можно ли сделать подобное попроще (а то кажется, что велосипед изобретаю)? И можно ли, вместо того, чтобы прокладывать гексы поверх террайна(как асфальт поверх земли), сам terrain разбить на клетки?

Re: Гексовое поле

СообщениеДобавлено: 24 авг 2011, 23:39
WereVarg
второй вопрос: смешать текстуру с гексами поверх текстуры террейна простым проецированием сверху


первый: по идее от гексов которые могут быть не видимы тебе нужны только х и у и в принципе их координаты определены раз и навсегда
хоть в массив

вот и анализируй ближе к которой игрок кликнул

Re: Гексовое поле

СообщениеДобавлено: 25 авг 2011, 00:38
Kroid
WereVarg писал(а):второй вопрос: смешать текстуру с гексами поверх текстуры террейна простым проецированием сверху


Даже не задумывался о таком способе :) Тогда в догонку вопрос:

Например мне понадобится изменять цвет гекса(если наведу на него мышь) или еще что-нибудь с ним делать. С отдельными объектами-шестиугольниками это можно сделать( например, сделать 3 вида текстур:доступный для хода, недоступный и наведенный мышкой; и при изменения состояния накладывать соответствующую текстуру).
Однако, если я покрою весь терейн одной текстурой, я больше не смогу изменить какой-нибудь отдельный гекс, верно?

Re: Гексовое поле

СообщениеДобавлено: 25 авг 2011, 01:01
ArtUni3d
Вы просто создайте не 3 текстуры, а 3 материала. И меняйте не текстуру, а сам материал гекса.

Re: Гексовое поле

СообщениеДобавлено: 25 авг 2011, 13:14
WereVarg
Kroid писал(а):Однако, если я покрою весь терейн одной текстурой, я больше не смогу изменить какой-нибудь отдельный гекс, верно?

теоретически можно умело манипулировать несколькими материалами/текстурами и использовать между ними маску
белый хекс на черном фоне

смещая UV маски можно попробовать добиться эффекта

Re: Гексовое поле

СообщениеДобавлено: 25 авг 2011, 16:44
Kroid
Простейшую гексовую карту собрал (решил наложить гексы на терррайн), заставил монстра (куб) поворачивать и перемещаться с одного гекса на другой. И, куда ж без этого, опять проблема возникла.

по идее от гексов которые могут быть не видимы тебе нужны только х и у и в принципе их координаты определены раз и навсегда
хоть в массив

вот и анализируй ближе к которой игрок кликнул


Гекс отличается от, скажем, круга тем, что не все точки гекса (ближе к периметру) равноудалены друг от друга.

Например, игрок щелкнул на гексе мышкой. Я считываю координаты клика, ищу центр ближайшего гекса и выделяю его. Проблема в том, что вершина гекса находится от центра дальше, чем ближайшая точка другого гекса. Соответственно, если игрок будет нажимать "абы-как" и тыкать на самый край гекса, будут ошибки, путаница и куча проблем.

Заносить в базу всевозможные координаты точек для каждого гекса (а не его центра) - верх идиотизма получится. А как делать по-другому - не могу понять. Существует ли функция, которая ищет любой объект на сцене в заданных координатах? Как вообще в играх выделение объекта делается?

Изображение
вот рисунок в качестве примера. Если искать ближайший к точке клика центр гекса, то будет неправильный результат. Например, эти 2 точки клика находятся на примерно одинаковом расстоянии от центра нижнего гекса.

Re: Гексовое поле

СообщениеДобавлено: 26 авг 2011, 04:15
Order
находи по декартовым координатам мышки, координаты в гексе, бери гекс по радиусу от этой точки.
Я так делал.

Re: Гексовое поле

СообщениеДобавлено: 26 авг 2011, 05:16
waruiyume
А если представить 6-угольник как 6 треугольников?

Re: Гексовое поле

СообщениеДобавлено: 26 авг 2011, 08:50
Kroid
Спасибо всем за советы. Сделал так(вдруг кому еще пригодится):
Запихнул гекс в префаб, добавил туда скрипт:
Синтаксис:
Используется csharp
void OnMouseDown() {
        geks = gameObject.transform;
        enemy = GameObject.Find("Enemy").transform;
}
 

Теперь через geks.position я могу узнать координаты центра гекса, на который кликнул мышью. Через enemy.position узнаем координаты игрока и ищем ближайшие координаты центра гекса. Осталось написать алгоритмы: поиска пути и передвижения игрока на соседнюю клетку.

Re: Гексовое поле

СообщениеДобавлено: 26 авг 2011, 13:24
ArtUni3d
Еще можно сделать гексы триггер колайдером и сделать еще одиин коллайдер в координатах мыши, который будет наступать на гексы.