Ас-саляму алейкум товарищи атеисты, программисты, тунеядцы,
и мазохисты, и прочие кто бы вы там ни были, всем здрасте!
В общем спешу сообщить, у меня был секс, и ещё какой!
Юнити отымел мой мосг во всех позах камасутры.
А раз я здесь, значит я его перетрахал!
Короче, что за жёпа меня постигла? Дело в том, что мой
предыдущий код генерирования меша образующего сетку - говно.
Как оказалось, создавалась нифига не сетка, а квад из двух треугольников,
растянутый вершинами по площади игрового поля!
Я тут значит сделал двухмерный массив сетки непроходимости,
и решил значит в меше непроходимые квадраты не создавать.
а тут через боль и маты выяснилось, что у меня нихрена не
получается, по тому, что это не сетка, а два треугольника!
Это был поистине шок!
А всё дело в том, что моя система создания сетки опиралась на опыт
конструирования оной в блитце, но у нас же юнити, и вертел он
знаешь ли наш предыдущий опыт на детородном органе!
Эта тварюга вместо генерации новых вершин и треугольников,
в каждый момент когда нужно было создать ячейку сетки,
просто переписывала данные предыдущих вершин и треугольников,
и растягивала эти четыре вершины. Я когда до этого допёр,
очень хотел обоссать лицо разрабам юнити за создание такой
неудобной системы процедурной генерации так сказать.
Дальше было больше! Я относился к "Vector3" как к хранилищу
координатных точек, и собственно при построении двух треугольников
использовал всего 4 точки, ну ибо нафига больше, если точки
пересекаются. Так вот при создании новой системы генерации сетки
я столкнулся с жопой фантастических масштабов, у меня чё только
не генерировалось: лесенки, заборы, многоугольные геометрические
фигуры, или дроблёное поле. Пришлось атаковать американские
ресурсы через гугол, чтобы вычитать что за хрень творится
с "Vector3". И чё я выяснил? А "Vector3" это нихрена не хранилище
точек по трём координатам, а хранилище именно векторов,
а вектор это не точка нихрена, и по этому у меня генерировалась всякая
шняга! Решить проблему можно было переводом "Vector3" из векторной
системы, в точечную через "Matrix4x4.MultiplyPoint", или Matrix4x4.MultiplyPoint3x4,
но я послав на три всем знакомые буквы это великолепное развлечение
от разработчиков юнити, пошёл другим путём. Я просто на 2 треугольника
создаю теперь 6 вершин через тот же банк векторов "Vector3",
и всё работает. В общем текст короткий, но разобрался я
в этом дерьме как вы понимаете не так быстро, как описал суть проблемы.
В общем вот прототип теперь точно рабочего кода ,
пока что он генерирует сетку по размерам игрового поля,
далее мне нужно будет привязать это к системе определения,
какого размера сетку строить, а после научить код не рисовать
квадраты там, куда наш монстр не может пойти, опираясь
на его максимальный радиус движения, и массив непроходимости:
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using UnityEngine;
public class TEST : MonoBehaviour
{
public Mesh SetkaDvij2;
public int SetkaDvijScaleZ2 = 11; //Размер сетки по оси "Z".
public int SetkaDvijScaleX2 = 11; //размер сетки по оси "X".
public int SetcaDvijPloshad2 = 0; //Площадь сетки.
public int ZDvij = 0;
public int XDvij = 0;
public int UDvij = 0;
private int VSPX;
private int VSPZ;
public int TESTE = 0;
public int[,] SetkaPassability;
public int SPK;
private Vector3[] Vershini1;
private int[] Bermudes1;
private int VK = 0;
private int BR = 0;
private int SDVIG = 0;
private int SDVIG2 = 1;
private int SDVIGX = 0;
private int SDVIGX2 = 0;
private int SDVIGFUCK = 0;
private int RAZDELITEL = 0;
void Start()
{
SetkaPassability = SetkaPassabilityControl.Setka;
TESTE = 1;
}
void Update()
{
//------------------------------------------------------------------------------------------------------------------------------------
if (TESTE == 1)
{
//Расчёт площади сетки.
SetcaDvijPloshad2 = SetkaDvijScaleZ2 * SetkaDvijScaleX2;
SDVIGX = SetkaDvijScaleX2;
Vershini1 = new Vector3[(SetcaDvijPloshad2 * 6)];
Bermudes1 = new int[(SetcaDvijPloshad2 * 6)];
SetkaDvij2 = new Mesh();
//Создаём меш.
//Подключаем меш фильтр.
MeshFilter SetkaDvijFilter2 = GetComponent<MeshFilter>();
//Применяем мешфильтр к мешу.
SetkaDvijFilter2.mesh = SetkaDvij2;
SPK = SetkaPassabilityControl.SetkaScaleControl;
TESTE = 2;
SetkaPassabilityControl.Setka[SetkaDvijScaleX2 - 1, SetkaDvijScaleZ2 - 1] = 1; // Непроходимый квадрат
}
if (SPK == 2 && TESTE == 2)
{
//Циклы создания сетки исходя из её размера по оси "z" и оси "x" а так же её площади.
for (ZDvij = 0; ZDvij < SetkaDvijScaleZ2; SetkaDvijScaleZ2--)
{
for (XDvij = 0; XDvij < SetkaDvijScaleX2; SetkaDvijScaleX2--)
{
for (UDvij = 0; UDvij < SetcaDvijPloshad2; SetcaDvijPloshad2--)
{
Vershini1[VK] = new Vector3(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - 1 - SDVIGFUCK, 0);
Vershini1[VK + 1] = new Vector3(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - 1 - SDVIGFUCK, 0);
Vershini1[VK + 2] = new Vector3(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - SDVIGFUCK, 0);
Vershini1[VK + 3] = new Vector3(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - SDVIGFUCK, 0);
Vershini1[VK + 4] = new Vector3(SetkaDvijScaleX2 - SDVIG, SetkaDvijScaleZ2 - 1 - SDVIGFUCK, 0);
Vershini1[VK + 5] = new Vector3(SetkaDvijScaleX2 - SDVIG2, SetkaDvijScaleZ2 - SDVIGFUCK, 0);
Debug.Log("VK" + Vershini1[VK]);
Debug.Log("VK + 1" + Vershini1[VK + 1]);
Debug.Log("VK + 2" + Vershini1[VK + 2]);
Debug.Log("VK + 3" + Vershini1[VK + 3]);
Debug.Log("VK + 4" + Vershini1[VK + 4]);
Debug.Log("VK + 5" + Vershini1[VK + 5]);
RAZDELITEL = RAZDELITEL + 1;
Debug.Log("RAZDELITEL -----------" + RAZDELITEL);
VK = VK + 6;
SDVIG = SDVIG + 1;
SDVIG2 = SDVIG2 + 1;
SDVIGX2 = SDVIGX2 + 1;
if (SDVIGX2 == SDVIGX)
{
SDVIGX2 = 0;
SDVIGFUCK = SDVIGFUCK + 1;
}
if (SDVIG == SDVIGX)
{
SDVIG = 0;
}
if (SDVIG2 == SDVIGX + 1)
{
SDVIG2 = 1;
}
//Создаём массив с трианглами.
Bermudes1[BR] = 0 + BR;
Bermudes1[BR + 1] = 2 + BR;
Bermudes1[BR + 2] = 1 + BR;
Bermudes1[BR + 3] = 3 + BR;
Bermudes1[BR + 4] = 5 + BR;
Bermudes1[BR + 5] = 4 + BR;
BR = BR + 6;
Debug.Log("Создали Квады");
if (SetcaDvijPloshad2 <= 1)
{
TESTE = 3;
}
}
}
}
}
if (TESTE == 3 && SetcaDvijPloshad2 == 0)
{
Debug.Log("Создали SetkaDvij");
//Задаём вершины мешу.
SetkaDvij2.vertices = Vershini1;
//Создаём трианглы меша.
SetkaDvij2.triangles = Bermudes1;
TESTE = 4;
}
}
}
Я уже говорил, код пишется для того, чтобы потом его переписывать.
З.ы. А ещё юнити задолбал крашиться, выходит из строя до переустановки.
Вёжл Студия от мелкософта тож задолбала, кончается пробный период,
логиньтесь говорит, я логинюсь, а там тоже краш (логинится похоже через старый ИЕ, в котором нет нужных функций, у меня семёрка).
Приходится её туда-сюда переустанавливать (студию).
В общем разработка этой игры мне даётся с большой болью,
во времена дарк бэйсика, блитца, и хорса, у меня таких проблем не было.