Тема: I.D.S. MONSTERS
Показать сообщение отдельно
Старый 19.04.2020, 00:41   #81
Crystal
Терабайт исходников
 
Аватар для Crystal
 
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений
(для 5,374 пользователей)
Ответ: I.D.S. MONSTERS

Ас-саляму алейкум товарищи атеисты, программисты, тунеядцы,
и мазохисты, и прочие кто бы вы там ни были, всем здрасте!

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

Короче, что за жёпа меня постигла? Дело в том, что мой
предыдущий код генерирования меша образующего сетку - говно.
Как оказалось, создавалась нифига не сетка, а квад из двух треугольников,
растянутый вершинами по площади игрового поля!

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

А всё дело в том, что моя система создания сетки опиралась на опыт
конструирования оной в блитце, но у нас же юнити, и вертел он
знаешь ли наш предыдущий опыт на детородном органе!
Эта тварюга вместо генерации новых вершин и треугольников,
в каждый момент когда нужно было создать ячейку сетки,
просто переписывала данные предыдущих вершин и треугольников,
и растягивала эти четыре вершины. Я когда до этого допёр,
очень хотел обоссать лицо разрабам юнити за создание такой
неудобной системы процедурной генерации так сказать.

Дальше было больше! Я относился к "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;
        }




    }
}


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

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

В общем разработка этой игры мне даётся с большой болью,
во времена дарк бэйсика, блитца, и хорса, у меня таких проблем не было.
__________________
Проект "Deathbring World - Rangers" и его финансовая поддержка:
https://boosty.to/deathbringrangers

Я на - TWITCH
Канал на YouTube
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
ABTOMAT (19.04.2020), ant0N (22.04.2020), Arton (21.04.2020), Randomize (19.04.2020)