danilaxxl danilaxxl

CollectableItemData.cs

[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]

GoloGames GoloGames

vadya_ivan, рад, что вам игра показалась интересной : )

P.S. Кстати уже доступна бесплатная демо-версия в Steam

vadya_ivan vadya_ivan

Визуал, задумка, музыка , механики, все в цель

GoloGames GoloGames

Ato_Ome, спасибо за позитивные эмоции, будем стараться : )

Ato_Ome Ato_Ome

Потрясающий результат, все так четенько, плавненько)
То ли саунд, то ли плавность напомнили мне игрушку World of Goo, удачи вам в разработке и сил побольше дойти до релиза!)

Cute Fox Cute Fox

Graphics are a little cool, good HD content. But this game doesn't cause nary interest me.
However the game is well done.

GMSD3D GMSD3D

Почему действие после всех условий выполняется?
[step another object]

Zemlaynin Zemlaynin

Jusper, Везде, но наугад строить смысла нет. Нужно разведать сперва территорию на наличие ресурсов.

Jusper Jusper

Zemlaynin, а карьеры можно будет везде запихать?
Или под них "особые" зоны будут?

Zemlaynin Zemlaynin

Это так скажем тестовое строительство, а так да у города будет зона влияния которую нужно будет расширять.

Jusper Jusper

А ссылка есть?

Jusper Jusper

Я не оч понял из скриншота, как вообще работает стройка. У игрока будет как бы поле строительства?

split97 split97

в игру нужно добавить время песочные часы в инвентаре, пока бегаешь наберается усталость и ты очень тормозной мобильный враг просто убевает

split97 split97

в игру нужно добавить время песочные часы в инвентаре, пока бегаешь наберается усталость и ты очень тормозной мобильный враг просто убевает

ViktorJaguar ViktorJaguar

Почему я нигде не могу найти нормальный туториал, где покажут как экипировать предмет (например, меч) в определенную (выделенную под оружие) ячейку???

Логотип проекта Unity

Триангуляция

Триангуляция — Unity — DevTribe: инди-игры, разработка, сообщество

Триангуляция по простому - разбиение фигуры на треугольники. Подобная операция может понадобиться при создании как нестандартной области выделения, так и при генерации моделей из кода.
Однако, как можно посмотреть в википедии - способов триангуляции существует несколько и один другого круче.
Но не беда прочитать о ней, хочется еще и не изобретать велосипед и взять что-то готовое. Так решил сделать и я, но попытки не увенчались успехом - алгоритм Делоне на 1000 строк кода часть треугольников зачем-то переворачивал, а ушная триангуляция прикрепленная к самой вики статье - на 7000 строк ужасно кривого кода, в котором просто невозможно разобраться. Это принудило меня к написанию алгоритма с нуля - встречайте, ушная триангуляция для Unity всего на 100 строк.

Как работает:

  • Закиньте скрипт в папку с проектом
  • В коде используйте Triangulation.GetResult для получения результата триангуляции. У метода есть две перегрузки

На вход в методе имеется два параметра:

  • List<Vector2> points - точки многоугольника

Триангуляция - это работа в плоскости, потому вектора двумерные. Если внимательно посмотреть, то вариантов разбиения многоугольника на треугольники всегда несколько и в пространстве это бы возвращало разные фигуры. Потому даже не пытайтесь приводить это к трехмерному вектору, не повторяйте моих глупых ошибок :)

  • bool clockwise - если true, то полученные точки обрабатываются по часовой, если false - против часовой.

На выходе возвращается:

  • List<Vector2> - точки треугольников

Список по количеству всегда кратен 3, то есть через каждые три индекса описывается новый треугольник

Пример использования:

var result = Triangulation.GetResult(points, true);

В методе имеется 6 параметров, из которых три на вход:

  • List<Vector3> points - точки многоугольника в пространстве
  • bool clockwise - если true, то полученные точки обрабатываются по часовой, если false - против часовой.
  • Vector3 upAxis - ось, перпендикулярная плоскости

Возвращает три параметра при помощи out. Все эти данные используются для создания меша в аналогичных полях:

  • Vector3[] verticles
  • int[] triangles
  • Vector2[] uvcoords

Третья координата рассчитывается как "среднее значение по точкам на перпендикулярной плоскости".

Пример использования:

        Vector3[] verticles;
        int[] triangles;
        Vector2[] uvcoords;
        Triangulation.GetResult(points, true, Vector3.up, out verticles, out triangles, out uvcoords);
UPDATE:

В комментариях приложен доработанный код с более быстрым алгоритмом.

Смотрите также:


Комментарии



Extravert, нет

nvc123, да
http://www.opengl.org/sdk/docs/man3/xhtml/glDrawArrays.xml

Parameters
mode
Specifies what kind of primitives to render. Symbolic constants GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_LINE_STRIP_ADJACENCY, GL_LINES_ADJACENCY, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_TRIANGLE_STRIP_ADJACENCY and GL_TRIANGLES_ADJACENCY are accepted.

где тут Quadres?

nvc123, нет его тут. Я его называю лишь из того что GL класс в юнити его самостоятельно переделывает
http://prntscr.com/3h1qgf

Бтв, речь изначально шла о том что GL в дефолте не держит многоугольники. Еще одно подтверждение.

что то у меня ничего не получается..
создаю куб, стандартный юнити куб 1х1х1, потом что то такое :
Mesh mesh = gameObject.GetComponent<MeshFilter> ().mesh;
List<Vector3> listPoint = new List<Vector3> ();

for (int i = 0; i<mesh.vertices.Length; i++) {
listPoint.Add (mesh.vertices[i]);
}
Vector3[] verticles;
int[] triangles;
Vector2[] uvcoords;

Triangulation.GetResult (listPoint, true, Vector3.up, out verticles, out triangles, out uvcoords);

print (mesh.vertices.Length + "|количесво точек в меше" ); //вывод - 24
print (verticles.Length + "|количестно новых точек триангуляции"); } //вывод - 0

**

вопрос.. что не так... почему массив новых точек 0?

taraa, вы отправляете на триангуляцию трехмерный объект, который соответственно нельзя представить в плоскости. Как минимум одна неверность уже есть.
Триангуляция это операция совершаемая в плоскости. Точки пространства же порождают непредсказуемо разные фигуры. То есть для обработки трехмерного объекта вам надо поделить модель на соответствующие "плоскости", которые и будете обрабатывать алгоритмом.
А второе это то что вы подаете "фигуру в целом". А надо подавать ее контур. То есть вы просто туда сейчас закидываете набор точек, некоторые из которых там по два три раза фигурируют. Если вы посмотрите комментарии выше, то увидите что триангуляция строилась по "контуру многоугольника", который вы и должны подать в функцию. В результате точки пересекают фигуру несколько раз и все они засчитываются как невалидные.
Например вот такая фигура по ясным причинам не является обычным многоугольником:

|\/|
|/\|

Она пересекает саму себя, если отправленных точек 4 и они идут накрест.
Триангуляция так не работает, ибо ни по одному варианту из трех точек этой фигуры в итоге нельзя построить треугольник, ибо он не принадлежит фигуре и/или пересекает ее грани.
Но если бы точек было 6 и они бы шли по/против часовой, то это бы прокатило.

Конкретно ваш случай - триангуляцию придется запускать 9 раз (для каждой стороны куба) и класть туда по 4 точки и указывая ось. Вообще не вижу смысла в таких вопросах применять триангуляцию, как то не по назначению.

Extravert, оно конечно хорошо, но мне нужно только одну допустим грань разбить на маленькие кусочки полигонов, то есть допустим даже взять один полигон треугольной формы и раздробить на более мельче, допустим сделать 2 или 4 или 8 маленьких треугольников в одной плоскости. я просидел кучу времени и у меня не проходит проверку : !Intersect(lines, a, b) && !Intersect(lines, b, c) && !Intersect(lines, a, c)
насколько я понял - он ничего не делает поскольку полигон и так прямоугольник.. возможно если добавить точку по середине между действующими точками поможет... но пока не получается.. как быть.?? возможно вообще такое?

taraa, треугольники на более мелкие нужно разбивать другим алгоритмом. Как это сделать проще всего?
Взять ваш треугольник, на самом широком ребре найти середину, разбить. И повторять так с каждой более мелкой фигурой, пока не достигнете необходимой вам глубины деления.

Почему может не пройти проверка? Очень просто. Линии, которые кладутся в алгоритм изначально собираются "подряд". То есть первая точка связана со второй, вторая с третьей и так далее. Когда вы построили куб, то там вероятно был стык, когда две точки имеют одинаковую координату. Таким образом эти точки пересекаются и проверка не идет. В прямоугольнике у вас должно быть 4 точки, чтобы он разбился например на два треугольника. А не 6, как вероятнее всего они описаны в меше.

Я вас уверяю в описанном вам случае вам не нужна триангуляция. Достаточно сделать то что я описал в самом начале.
То есть.
Берете ваши вертексы из меша. Берете трианглес оттуда же, чтобы узнать в каком порядке вертексы располагаются. Согласно этому порядку берете первые три индекса из массива трианглс, далее по этим индексам обращаетесь к вертексам и кладете все в свой массив. И запускаете в алгоритм, который узнает между какими из трех точек наибольшее расстояние. Вычитаете вектора, делите полученный вектор пополам, прибавляете обратно. И вы узнали точку, образующую новые треугольники.

Extravert, спасибо)) Вы подтвердили мою вчерашнею теорию над которой сидел.. только я когда добавил новую точку дополнительно прогонял через функцию GetResult.. и для чого непонятно... только запутался.

Extravert, nvc123, по поводу нашего разговора о стандартном функционале триангуляции средствами OpenGL. Я тут пока делал лабу на компьютерную графику по OpenGL разобрался в чем соль данного параметра. Это не тип рендера, а порядок обхода вершин. То есть указав 4 вершины и указав тип Quadres он просто создаст 2 треугольника, 1-2-3 и 3-4-1

Справка