forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Постмор (http://forum.boolean.name/forumdisplay.php?f=160)
-   -   I.D.S. MONSTERS (http://forum.boolean.name/showthread.php?t=20763)

Crystal 10.03.2020 16:41

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ABTOMAT (Сообщение 317095)
А чем плохи проверки на дистанцию (кроме того, что их надо писать) ?
"Все так делают" — нифакт, профессиональные разрабы не ссутся как в старые-добрые писать свой функционал там, где это целесообразно.
Блоггеры на Ютубе в видосах "Своя игра на Юнити за 5 миллисек" юзают триггеры (и им подобные решения) потому что это понятнее для школьной аудитории и не надо знать никакой математики.

В любом случае из твоих же слов, вариант твой математический
только для 2Д мира, для 3Д будет сложнее, делать там проверку по дополнительной оси.
Я ещё не знаю, будет открытый мир плоским, или кривым террайном,
может у зданий даже будут этажи разновысотные, хз. Мне сейчас
мой вариант выгоднее, и проще. Да ещё и мне не нужно постоянно проверять,
загружен ли префаб персонажа в сцену, триггер тип персонажа мониторит.
Так же я размер триггера могу прям в сцене регулировать, и видеть его, это удобно.

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


Вчера в стиме на халяву раздавали Minion Masters, я скачал, да как подсел, аш не спал ночь.
Игра крутая! Сплетение жанров ККИ, МОБА, ТАВЕР ДЕФЕНС. В общем на недельку-другую
разрабокта моего проекта может захромать, пока я не наиграюсь ))

ABTOMAT 10.03.2020 18:01

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317097)
В любом случае из твоих же слов, вариант твой математический
только для 2Д мира, для 3Д будет сложнее, делать там проверку по дополнительной оси.
Я ещё не знаю, будет открытый мир плоским, или кривым террайном,
может у зданий даже будут этажи разновысотные, хз. Мне сейчас
мой вариант выгоднее, и проще. Да ещё и мне не нужно постоянно проверять,
загружен ли префаб персонажа в сцену, триггер тип персонажа мониторит.
Так же я размер триггера могу прям в сцене регулировать, и видеть его, это удобно.

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


Вчера в стиме на халяву раздавали Minion Masters, я скачал, да как подсел, аш не спал ночь.
Игра крутая! Сплетение жанров ККИ, МОБА, ТАВЕР ДЕФЕНС. В общем на недельку-другую
разрабокта моего проекта может захромать, пока я не наиграюсь ))

Чуваааак, ну я же не буквально вычислять через X и Y. Всё уже сделали за нас:

https://docs.unity3d.com/ru/current/....Distance.html

PHP код:

Vector3.Distance(piska.transform.positionjopa.transform.position); 

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

Ну раз упрощает так упрощает.

Crystal 10.03.2020 20:38

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ABTOMAT (Сообщение 317098)
Чуваааак, ну я же не буквально вычислять через X и Y. Всё уже сделали за нас:

PHP код:

Vector3.Distance(piska.transform.positionjopa.transform.position); 


Ну ничего нового не увидел, у меня персонаж свой навигационный пивот ищет именно так:

Код:

                    //Определяем дистанцию между персонажем и навигатором
                    DistCheltoNavigator = Vector3.Distance(Chel.transform.position, RaycastPickCoordinates);
                    Debug.Log("Дистанция между Navigator и Персонажем: " + DistCheltoNavigator);

Ты мне сейчас тупо предложил дистанцию мерить, от которой я специально ушёл.

Ну представь у нас 200 монстров, и чё они все будут дистанцию
до персонажа мерить? Это был отличный способ поставить блитц на колени,
в юнити я таких экспериментов проводить не хочу.
Так им ещё и проверять постоянно, находится ли в сцене префаб игрока,
прежде чем проверку на дистанцию запускать.

А с триггерами тупо на физ движке, пересеклись коллайдеры, хуяк событие.
Я могу быть не прав конечно, я хз как там в юнити реализовали просчёт пересечения коллайдеров,
но что-то мне подсказывает, что это дешевле, чем спамить Vector3.Distance с множественных объектов.

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

Crystal 19.03.2020 23:48

Ответ: I.D.S. MONSTERS
 
Кристал на 10 дней превратился в геймера, и задротил в Minion Masters,
но Кристал излечился, и сегодня вернулся к геймдеву.

Реализованы точки респавна монстров, в определённом радиусе от
которых монстры респавнятся в рандомной позиции.

Реализованы порталы аля фильм терминатор (надувающийся пузырь).
Пузырь надулся, в нём появился монстр, пузырь исчез.
Запускается таймер жизни монстра, после окончания
отсчёта дезбринга отправляем обратно в ад нафиг,
создавая пузырь вокруг него, и сдувая пузырь.

Код порталов и жизни монстра:

Код:

//Портал появления

        if (MonsterLife == 0)
        {

            Portal.transform.Rotate(Vector3.right * 500 * Time.deltaTime);
            Portal.transform.localScale += PortalScaleChange;
            PortalScaleChange = -PortalScaleChange;


            if (Portal.transform.localScale.y < 2f && PortalState == 0)
            {
                PortalScaleChange = new Vector3(+0.03f, +0.03f, +0.03f);
            }

            if (Portal.transform.localScale.y >= 2f && PortalState == 0)
            {
                PortalState = 1;
            }

            if (PortalState == 1)
            {
                Portal.GetComponent<MeshRenderer>().enabled = false;
                PortalState = 2;
                MonsterBody.GetComponent<MeshRenderer>().enabled = true;
                MonsterLife = 1;
            }

        }
        //----------------------------------------------------------------

        // Удаляем монстра
        if (MonsterLife == 3)
        {
            Destroy(Monster1);

        }




        // Портал исчезновения
        if (MonsterLife == 2)
        {

            Portal.transform.Rotate(Vector3.right * 500 * Time.deltaTime);
            Portal.transform.localScale += PortalScaleChange;
            PortalScaleChange = -PortalScaleChange;


            if (Portal.transform.localScale.y > 0.01f && PortalState == 3)
            {
                PortalScaleChange = new Vector3(-0.03f, -0.03f, -0.03f);
            }

            if (Portal.transform.localScale.y <= 0.01f && PortalState == 3)
            {
                PortalState = 4;
            }

            if (PortalState == 4)
            {
                Portal.GetComponent<MeshRenderer>().enabled = false;

                MonsterLife = 3;
            }





        }


        // Жизнь монстра
        if (MonsterLife == 1)
        {
            //Таймер исчезновения
            LifeTime = LifeTime - 1f * Time.deltaTime;

            if (LifeTime < 1f)
            {
                MonsterLife = 2;
                PortalState = 3;
                Portal.GetComponent<MeshRenderer>().enabled = true;
                MonsterBody.GetComponent<MeshRenderer>().enabled = false;
            }

            //---------------------------------------------------------------

Код точки респа (она в разработке, пока создаёт только одного монстра):

Код:

    public GameObject MonsterPortal_z1;
    public GameObject Monster1;
    public Vector3 MonsterPortal_z1Coordinate;


    // Start is called before the first frame update
    void Start()
    {


        MonsterPortal_z1Coordinate = MonsterPortal_z1.transform.position;
        Instantiate(Monster1, new Vector3(MonsterPortal_z1Coordinate.x + Random.Range(-3f, 3f), 0f, MonsterPortal_z1Coordinate.z + Random.Range(-3f, 3f)), Quaternion.identity);
       
    }


Crystal 21.03.2020 00:10

Ответ: I.D.S. MONSTERS
 
Итак, мне нужны тестеры. будем проводить первый стресс тест.
На карте находится 5 точек респауна монстров, они создают каждая
по 20 монстров, далее каждую секунду будет удаляться по одному монстру,
и каждой точкой создаваться по одному.

Все монстры с триггерами-глазами. Цель теста - проверка оптимизации,
выявление багов. Если у вас игра тормозит, сообщите конфигурацию
своего ПК. Если нашли баги - сообщайте подробно описав ситуацию.

Заранее благодарен.

Билда: ТЫК

Crystal 21.03.2020 00:43

Ответ: I.D.S. MONSTERS
 
Для тех кто прошёл удачно первый стресс тест, получайте второй.
Здесь каждую секунду создаётся 10 монстров, за 100 секунд
будет создано 1000 монстров, и после каждую секунду будет
создаваться 10 монстров, и 10 удаляться.

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

Пробегите кубиком наверх аккуратно, и побегайте там.
Можете по выманивать монстров, но не дайте приблизиться,
иначе перекинет на другую сцену.

Меня интересует, гладко ли у вас всё, нет ли подёргиваний?

На моём ПК всё как по маслу, никаких лагов.

Билда: ТЫГ

P.s. 1000 монстров это 2000 триггеров.
P.p.s. В данный момент есть не оптимизированная штука, все 1000 монстров
следят за камерой, и поворачиваются в её сторону, они проводят 1000 расчётов
положения камеры, когда можно делать один в отдельном скрипте.
Данная срань оптимизироваться не будет, т.к. фича нужна лишь для плоских
монстров созданных из квадов, которые являются временным решением, пока отсутствуют 3D модели.

Crystal 21.03.2020 23:57

Ответ: I.D.S. MONSTERS
 
Вложений: 2
Изменения на сегодня:

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

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

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

Космос теперь трёхслойный с прозрачностью, чтобы сгладить текстуру,
и передать глубину глубин глубины глубокого космоса.

БИЛД

Crystal 22.03.2020 23:41

Ответ: I.D.S. MONSTERS
 
Учу общаться скрипты между собой.
Теперь расчёт размера сетки в сцене боя
ведётся исходя из уровня угрозы монстра.
Уровень угрозы закреплён в переменной
внутри скрипта привязанного к монстру.
Там целая сеть прогонов через несколько скриптов,
узнав уровень угрозы, выбираем размер сетки:

Код:

    //Уровень угрозы
    public int ThreatLevel;

    void Start()
    {

        //Уровень угрозы монстра с которым мы столкнулись
        ThreatLevel = Clash.ThreatLevel;

        //расчёт размера сетки исходя из уровня угрозы
        if (ThreatLevel == 1)
        {
            SetkaScaleZ = 10;
            SetkaScaleX = 10;
        }
        if (ThreatLevel == 2)
        {
            SetkaScaleZ = 12;
            SetkaScaleX = 12;
        }
        if (ThreatLevel == 3)
        {
            SetkaScaleZ = 16;
            SetkaScaleX = 16;
        }
        if (ThreatLevel == 4)
        {
            SetkaScaleZ = 20;
            SetkaScaleX = 20;
        }
        if (ThreatLevel == 5)
        {
            SetkaScaleZ = 24;
            SetkaScaleX = 24;
        }
        if (ThreatLevel == 6)
        {
            SetkaScaleZ = 30;
            SetkaScaleX = 30;
        }
        if (ThreatLevel == 7)
        {
            SetkaScaleZ = 100;
            SetkaScaleX = 100;
        }

Так же мы узнаём какой конкретно монстр на нас напал, чтобы его создать.
Но создаём пока не его. Всё пока сыро, но работает. В данный момент чтобы реализовать
данную задачу двумя параметрами (MonsterNumber, ThreatLevel) обмениваются пять скриптов:
скрипт отвечающий за характеристики монстра, скрипт работающий с его триггером,
статичный глобальный скрипт получающий информацию с кем сталкиваемся,
скрипт создающий сетку, скрипт создающий монстров на сетке.


Скрипт с параметрами монстра, прикреплён к ассету монстра:
Код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterInfo : MonoBehaviour
{
    public int MonsterNumber = 1; //Порядковый номер монстра
    public int ThreatLevel = 1; //Уровень угрозы монстра

}

Скрипт контроллирующий триггер монстра, который при столкнвоении с игроком
перекидывает нас на сцену боя.
Код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Monster1trigger : MonoBehaviour
{
    public int MonsterNumber; //Порядковый номер монстра
    public int ThreatLevel; //Уровень угрозы монстра
    public MonsterInfo MI; //Скрипт монстра MonsterInfo
    public GameObject Contacter;

    private void Start()
    {
        Contacter.GetComponent<MeshRenderer>().enabled = false;
        gameObject.layer = LayerMask.NameToLayer("Ignore Raycast");

        MonsterNumber = MI.MonsterNumber; // Получаем порядковый номер монстра из скрипта MonsterInfo
        ThreatLevel = MI.ThreatLevel; // Получаем уровень угрозы монстра из скрипта MonsterInfo

    }

    void OnTriggerEnter(Collider Contacter)
    {
        if (Contacter.tag == "Player")
        {

            Clash.MonsterNumber = MonsterNumber; //Записываем в скрипт Clash порядковый номер монстра
            Clash.ThreatLevel = ThreatLevel; //Записываем в скрипт Clash уровень угрозы монстра

            Debug.Log("Персонаж вошёл в триггер монстра");
            SceneManager.LoadScene("Fight");

        }
    }



}

Глобальный статичный независимый скрипт, который принимает параетры
монстра после столкновения игрока с его триггером
Код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class Clash
{
    public static int MonsterNumber = 0; //Порядковый номер монстра столкнувшегося с игроком
    public static int ThreatLevel = 0; //Уровень угрозы монстра столкнувшегося с игроком
}

Это пока заготовка скрипта создающего монстра на сетке.
Скрипт уже знает с каким монстром он столкнулся,
но создаётся всё равно пока ещё единственный дефолтный.
Скоро сделаю, чтобы создавался конкретно тот с кем столкнулись,
и нужно сделать чтобы его создавало в правой части сетки в конце посередине,
там мы будем в зависимости от уровня угрозы, расчитывать размер сетки, и искать середину.
Код:

public class BotMonsterCreator : MonoBehaviour
{

    public GameObject MonsterFight1; // Ассет монстра MonsterFight1
    public int MonsterNumber; // Порядковый номер монстра
 
    // Start is called before the first frame update
    void Start()
    {
        MonsterNumber = Clash.MonsterNumber; // Получаем порядковый монстр столкнувшегося с игроком монстра из скрипта Clash

    }

    // Update is called once per frame
    void Update()
    {
        if (MonsterNumber > 0)
        {
            Instantiate(MonsterFight1, new Vector3(1.5f, 0, 2.5f), Quaternion.identity);
            MonsterNumber = 0;
        }
    }
}


Crystal 24.03.2020 00:03

Ответ: I.D.S. MONSTERS
 
Теперь скрипт создающий монстра в сцене боя знает кого конкретно создавать.

Теперь этот скрипт знает какого размера сетка игрового поля получится,
высчитывает правый край, находит его середину, и помещает монстра туда.

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

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

Теперь монстр увидевший игрока рычит, это маленькое дополнение
изменило восприятие проекта. Теперь появилось ощущение,
что мы играем в игру. Звук рыка в режиме 3D, откуда рычат,
от туда и слышим.

БИЛДО

ABTOMAT 24.03.2020 14:24

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317128)
Теперь скрипт создающий монстра в сцене боя знает кого конкретно создавать.

Теперь этот скрипт знает какого размера сетка игрового поля получится,
высчитывает правый край, находит его середину, и помещает монстра туда.

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

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

Теперь монстр увидевший игрока рычит, это маленькое дополнение
изменило восприятие проекта. Теперь появилось ощущение,
что мы играем в игру. Звук рыка в режиме 3D, откуда рычат,
от туда и слышим.

БИЛДО

Проверил — работает

Crystal 24.03.2020 23:47

Ответ: I.D.S. MONSTERS
 
Взрослая жизнь задолбала! Да что такое! Опять сегодня мало времени на кодинг было!
Однакож нужно выговориться.

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

Как я заявлял ранее, мы будем выбирать самого опасного монстра
игрока, и сравнивать его с уровнем опасности нападающего монстра,
а после выбирать кто из них круче, и в соответствии с полученными
данными выбирать размер уровня. Так-как логично, что более крутые
монстры будут тупо крупнее, и часто резво перемещаться на большие расстояния,
и в маленький уровень не влезут, а создавать уровни размером
100 на 100 для всех подряд включая самых мелких монстров
это было бы мегатупо, так-как основную часть геймплея
займёт время доковыливания до врага. Я думаю вы согласитесь,
что такая система расчётов была нужна, она готова, и применена
почти в одинаковом виде к трём скриптам, пример:

Код:

public int ThreatLevel; //Уровень угрозы Монстра
    public int ThreatLevelPlayerKarman; //Максимальный уровень угрозы монстров в инвентаре игрока
    public int TotalThreatLevel; // Итоговый уровень угрозы после расчётов


    void Start()
    {


        // Пишем в массив уровень угрозы монстров в инвентаре игрока
        int[] PlayerKarmanThreatLevelYachMax = new int[5];
        PlayerKarmanThreatLevelYachMax[0] = PlayerKarman.ThreatLevelYach1;
        PlayerKarmanThreatLevelYachMax[1] = PlayerKarman.ThreatLevelYach2;
        PlayerKarmanThreatLevelYachMax[2] = PlayerKarman.ThreatLevelYach3;
        PlayerKarmanThreatLevelYachMax[3] = PlayerKarman.ThreatLevelYach4;
        PlayerKarmanThreatLevelYachMax[4] = PlayerKarman.ThreatLevelYach5;

        // Расчитываем уровень угрозы монстров в инвентаре игрока выбирая самого опасного
        ThreatLevelPlayerKarman = Mathf.Max(PlayerKarmanThreatLevelYachMax);

        //Уровень угрозы монстра с которым мы столкнулись
        ThreatLevel = Clash.ThreatLevel;

        // Расчитываем итоговый уровень угрозы сравнив опасность монстра с опасностью самого крутого монстра в инвентаре игрока
        TotalThreatLevel = Mathf.Max(ThreatLevelPlayerKarman, ThreatLevel);

        //расчёт размера сетки исходя из уровня угрозы
        if (TotalThreatLevel == 1)
        {
            SetkaScaleZ = 11;
            SetkaScaleX = 11;
        }
        if (TotalThreatLevel == 2)
        {
            SetkaScaleZ = 13;
            SetkaScaleX = 13;
        }
        if (TotalThreatLevel == 3)
        {
            SetkaScaleZ = 15;
            SetkaScaleX = 15;
        }
        if (TotalThreatLevel == 4)
        {
            SetkaScaleZ = 19;
            SetkaScaleX = 19;
        }
        if (TotalThreatLevel == 5)
        {
            SetkaScaleZ = 23;
            SetkaScaleX = 23;
        }
        if (TotalThreatLevel == 6)
        {
            SetkaScaleZ = 35;
            SetkaScaleX = 35;
        }
        if (TotalThreatLevel == 7)
        {
            SetkaScaleZ = 99;
            SetkaScaleX = 99;
        }

Импровизированный инвентарь игрока на 5 походных монстров:

Код:

public static class PlayerKarman
{
    public static int MonYach1 = 1;
    public static int ThreatLevelYach1 = 1;
    public static int MonYach2 = 0;
    public static int ThreatLevelYach2 = 0;
    public static int MonYach3 = 0;
    public static int ThreatLevelYach3 = 0;
    public static int MonYach4 = 0;
    public static int ThreatLevelYach4 = 0;
    public static int MonYach5 = 0;
    public static int ThreatLevelYach5 = 0;
}

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

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

Уже даже герои меча и магии начинают сосать, так-как там по моему
весь бой происходит на одинаковой сцене, с сеткой одного размера,
там только задники меняются, есть там правда и вторая сцена "замок".
А у меня 7 размеров уровней генерирующихся автоматически в одной
единственной сцене, чем не повод для гордости? ))
Масштаб задумки огромный, чтобы всё рассказать придётся писать
огромный диздок, в котором нет смысла для студии из одного человека )

---

Окей, что дальше делаем?
Далее создам скрипт, запихивающий игрока в сцену боя,
при этом у нас будет 2 варианта на выбор, либо мы
присутствуем в стороне как в HoMM3 например,
либо идём и самим персонажем в бой как в HoMM4.
Разница будет в том, что стоя в сторонке и отдавая
приказы монстру, мы будем в безопасности, и сможем убежать,
а при выходе на поле боя лично, мы сможем там сразу опиздюлиться,
а смерть юзера это будет стопроцентный молниеносный гамовер.

Зачем же нам выползать на поле боя самому? Ну во первых,
в моей игре задницу игроку никто нализывать не будет,
и никакой профессор "ОАК" нам с ходу не вручит имбового пикачу,
нам дадут дубинку, и скажут, хочешь жить, умей вертеться.
И с этой херновиной мы пойдём врукопаш на монстров,
чтобы кого-нибудь поймать, или сдохнуть. При этом
если у нас нет походных монстров, значит бой стопроцентно
начнётся с игроком на поле боя.

Далее, в скрипте создания монстра на поле боя будет реализована
рандомная случайность, что монстр который на нас напал, моментально
призовёт на помощь от 0 до 2 монстров на подмогу.
А если вы помните, мы призываем монстров с помощью перчатки-контроллера,
которая может контролировать только одного монстра, собственно
только одного и призывать, и раз монстров противников может
оказаться более одного, значит игроку придётся самому часто
выползать на поле боя в виде подмоги.
Но я уже ранее писал, что будет возможность призвать больше монстров.
Первая это используя скилл особого монстра, вторая это дополнительный
предмет, о котором я не расскажу.

Уже жду не дождусь когда наконец смогу перейти к разработке механики боя,
однако ещё много что нужно реализовать перед этим.

ant0N 25.03.2020 11:58

Ответ: I.D.S. MONSTERS
 
Код:

//расчёт размера сетки исходя из уровня угрозы
        if (TotalThreatLevel == 1)
        {
            SetkaScaleZ = 11;
            SetkaScaleX = 11;
        }
        if (TotalThreatLevel == 2)
        {
            SetkaScaleZ = 13;
            SetkaScaleX = 13;
        }
        if (TotalThreatLevel == 3)
        {
            SetkaScaleZ = 15;
            SetkaScaleX = 15;
        }
        if (TotalThreatLevel == 4)
        {
            SetkaScaleZ = 19;
            SetkaScaleX = 19;
        }
        if (TotalThreatLevel == 5)
        {
            SetkaScaleZ = 23;
            SetkaScaleX = 23;
        }
        if (TotalThreatLevel == 6)
        {
            SetkaScaleZ = 35;
            SetkaScaleX = 35;
        }
        if (TotalThreatLevel == 7)
        {
            SetkaScaleZ = 99;
            SetkaScaleX = 99;
        }

Почему ты не используешь switch?

Код:

public static class PlayerKarman
И почему карман статический?

PS. нэйминг у тебя шикарный

Crystal 25.03.2020 22:25

Ответ: I.D.S. MONSTERS
 
Цитата:

Почему ты не используешь switch?

Код:

public static class PlayerKarman
И почему карман статический?

PS. нэйминг у тебя шикарный
Не использую по тому, что не знаю о чём речь.
Это первый мой проект за десятилетие,
Первый проект на юнити, первый на си шарп.
Я в процессе изучения, разрабатываю как могу.
Последнее что я кодил, это на хорсе под враппером
в блитц физику и пп для ртс типа старкрафта 2,
На бэйсике.

Статический для того, чтобы иметь глобальный
Скриптовый файл без привязки к объектам.
Знаю, что можно объявить команду,
Чтобы скрипт не удалялся при смене сцен, такой
Способ тоже буду юзать, но в данный момент
Мне нужно так как есть.

Нэйминг у меня всегда такой был )))
Главное, что мне всё понятно.

ABTOMAT 26.03.2020 09:35

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317137)
Не использую по тому, что не знаю о чём речь.

https://docs.microsoft.com/ru-ru/dot...eywords/switch

Это оператор для разбора случаев разных значений одной переменной.

PHP код:

switch (переменая)
{
                case 
проверяемоезначение1:

                    
// Делаем дела
                    
break; // Прекращаем проверку, иначе код пойдёт дальше

                
case проверяемоезначение2:

                    
// Делаем дела
                    
break; // Прекращаем проверку

                
default:

                    
// Действия в случае, если не подошёл ни один из вариантов (аналог else)
                    
break; // Прекращаем проверку


Твой код как раз случай из учебника, когда используют switch-case

PHP код:

switch (TotalThreatLevel)
        {
                case 
1:

                    
SetkaScaleZ 11;
                    
SetkaScaleX 11;
                    break;

                case 
2:

                    
SetkaScaleZ 13;
                    
SetkaScaleX 13;
                    break;

                case 
3:

                    
SetkaScaleZ 15;
                    
SetkaScaleX 15;
                    break;

                case 
4:

                    
SetkaScaleZ 19;
                    
SetkaScaleX 19;
                    break;

                case 
5:

                    
SetkaScaleZ 23;
                    
SetkaScaleX 23;
                    break;

                case 
6:

                    
SetkaScaleZ 99;
                    
SetkaScaleX 99;
                    break;

        } 

В Блице, кстати, тоже он был.

Ну в принципе в программировании действует правило "Если работает, то ты уже молодец"

Crystal 26.03.2020 11:51

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ABTOMAT (Сообщение 317139)
https://docs.microsoft.com/ru-ru/dot...eywords/switch

Это оператор для разбора случаев разных значений одной переменной.

PHP код:

switch (переменая)
{
                case 
проверяемоезначение1:

                    
// Делаем дела
                    
break; // Прекращаем проверку, иначе код пойдёт дальше

                
case проверяемоезначение2:

                    
// Делаем дела
                    
break; // Прекращаем проверку

                
default:

                    
// Действия в случае, если не подошёл ни один из вариантов (аналог else)
                    
break; // Прекращаем проверку


Твой код как раз случай из учебника, когда используют switch-case

PHP код:

switch (TotalThreatLevel)
        {
                case 
1:

                    
SetkaScaleZ 11;
                    
SetkaScaleX 11;
                    break;

                case 
2:

                    
SetkaScaleZ 13;
                    
SetkaScaleX 13;
                    break;

                case 
3:

                    
SetkaScaleZ 15;
                    
SetkaScaleX 15;
                    break;

                case 
4:

                    
SetkaScaleZ 19;
                    
SetkaScaleX 19;
                    break;

                case 
5:

                    
SetkaScaleZ 23;
                    
SetkaScaleX 23;
                    break;

                case 
6:

                    
SetkaScaleZ 99;
                    
SetkaScaleX 99;
                    break;

        } 

В Блице, кстати, тоже он был.

Ну в принципе в программировании действует правило "Если работает, то ты уже молодец"

Благодарю. Будем знать. Я правда себя программистом не считаю, им и не являюсь,
по этому многого не знаю. Ну как говорится, был и был в блитце )

Так посмотреть на код, та же жопа, только вид сбоку.
Этакий миницикл. Мне важно понять, в чём преимущество
над моим папуасским говнокодом? Что тут последовательно выполняется
проверка на значение, что в моём случае то же самое.
Или я что-то упускю из виду? А то все эти IF в апдейте всё равно
по очереди исполняются. Особой экономии строк тоже не вижу,
наличие break сводит её на ноль.

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

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

Добавил: вспомнил где я в блитце использовал свитчи, аш 13 лет назад!
С их помощью я разбивал игру на сцены, нужные функции запускались при определённом
значении переменной, как раз через "case", чтобы делить игру на стартовое меню, и игровой уровень.
В юнити такая нужда отпала, и я собственно благополучно забыл о данной фиче )

Crystal 10.04.2020 15:16

Ответ: I.D.S. MONSTERS
 
Так ребяты. Я тут некоторое время отдохнул,
думаю сами заметили, и вернулся к делу.
Два дня кодил.

Визуально изменений мало, ещё меньше в геймплее,
однако внутренне много что перетряс, что-то переделал,
что-то с нуля написал, что-то добавил.
Что-то добавляешь, потом другое работать перестаёт,
там всё переделываешь, ну сами знаете как бывает.
Короче в данном апдейте:

1. Квады монстров в сцене боя теперь тоже смотрят на камеру.
2. Теперь монстр с определённым шансом может позвать себе
в подмогу на сцене боя от 0 до 2 таких же монстров.
3. Теперь можно останавливать время например для
перехода на элементы интерфейса, чтобы можно было спокойно
подумать что нажимать, для следующего пункта это используется.
4. Появились кнопки, которые спрашивают нас хотим
ли в бою мы быть в стороне, или участвовать лично.
Ну и собственно вся эта система работает, за исключением
того, что я функцию создания самого персонажа ещё не добавил.
5. Теперь в сцене боя управляемая камера, которая ориентируется
также в размерах сгенерированного уровня, и не выползает за него.

Билда: https://yadi.sk/d/V5BwvRZBdpB6EA

И, я даю вам возможность в данный момент поковыряться в самом проекте:

https://yadi.sk/d/5dgYQ7_Vps5tEA

Потрошите, изучайте, используйте в своих проектах интересные вам функции.

Crystal 19.04.2020 00:41

Ответ: 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;
        }




    }
}



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

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

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

Crystal 11.05.2020 02:32

Ответ: I.D.S. MONSTERS
 
Вложений: 1
Так, я не пропал! Ни на что не забил, и ничё не забил.
Я просто больше играю в игры, чем кодю.

Короче, я всё-таки реализовал новую версию процедурной
генерации визуализации сетки хождения монстра полигонами.
Она сейчас плотно связана с матрицей проходимости,
и с радиусом максимального хождения монстра (например 5*5).
Билды пока не будет, так-как всё это дело снова надо привязать
к клику по монстру, это в процессе.

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

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

Испытания показали, что например меш размером в 40.000 клеток,
где у нас 80.000 треугольников, генерится довольно долго,
по этому для эпических монстров, которые ходят в любую точку
карты, я такую систему использовать не буду. Но вот меши размерами
например 25 на 25 генерятся моментально, но это вообще весь размер
игрового уровня при битве с монстрами аш пятого уровня угрозы,
даже больше, короче для стандартных битв всё годно,
для управления эпиками сделаю другую систему, об этом
пока и речи не идёт у меня.

В общем всё зер гуд, результат моих мучений здесь, комментов в них мало:


Строим матрицу проходимости:
Код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SetkaPassabilityControl : MonoBehaviour
{

    public static int[,] Setka;
    public float SetkaScaleXf;
    public float SetkaScaleZf;
    public int SetkaScaleX;
    public int SetkaScaleZ;

    public int ChoTam2;

    public static int SetkaScaleControl = 0;

 
    void Update()
    {
        if (SetkaScaleControl == 0)
        {
            if (GLOBALSUPERSCRIPT.LevelScaleStatus == 1)
            {
                SetkaScaleXf = GLOBALSUPERSCRIPT.LevelScaleX;
                SetkaScaleZf = GLOBALSUPERSCRIPT.LevelScaleZ;
               
                SetkaScaleX = Mathf.RoundToInt(SetkaScaleXf);
                SetkaScaleZ = Mathf.RoundToInt(SetkaScaleZf);
                SetkaScaleControl = 1;
            }

         
        }

        if (SetkaScaleControl == 1)
        {
            Setka = new int[(SetkaScaleX * SetkaScaleZ) - SetkaScaleX + 1, SetkaScaleZ + 1];



            Setka[0, (SetkaScaleZ / 2) - 1] = 1; // Непроходимый квадрат
            Setka[0, 3] = 1; // Непроходимый квадрат

            SetkaScaleControl = 2;
        }

        ChoTam2 = Setka[SetkaScaleX - 1, (SetkaScaleZ / 2) - 1];

    }

   
 
}

Генерируем область, в которую может пойти монстр:
Код:

using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using UnityEngine;

public class TEST : MonoBehaviour
{
    public Mesh SetkaDvij2;

    public int[,] MonHodMass;
    public int[] MonHodYachMass;
    private int SetkaMonHodX = 5;
    private int SetkaMonHodZ = 5;
    public int PloshMonHodXZ;
    public int Xcount = 0;
    public int Zcount = 0;
    public int UniversalCounter = 0; //Универсальный многоразовый счётчик для разных задачь
    public int UniversalCounter2 = 0; //Универсальный многоразовый счётчик для разных задачь
    public int UniversalCounter3 = 0; //Универсальный многоразовый счётчик для разных задачь
    public int Zcounter = 0;


    private int SetkaDvijScaleZ2 = 11; //Размер сетки по оси "Z".
    private int SetkaDvijScaleX2 = 11; //размер сетки по оси "X".
    private int SetcaDvijPloshad2 = 0; //Площадь сетки.
    public int PloshCraft;
    public int[] PloshCraftMass;
    public int PloshCraftMassCounter = 0;
    public int PloshCraftFor = 0;
    private int PloX = 0;
    private int PloZ = 1;
    private int Perebor = 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 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;




    public int ZERO = 0; // Просто ноль, по тому, что мне нужен ноль.
    public int MonCorZ;
    public int MonCorX;
    public int SX;



    private float BermudesTimer;

    void Start()
    {

        MonHodMass = new int[(SetkaDvijScaleX2 * SetkaDvijScaleZ2) + 1, SetkaDvijScaleZ2 + 1 + SetkaMonHodZ];



    }

    void Update()
    {
        if (TESTE == 0)
        {
            if (SetkaPassabilityControl.SetkaScaleControl == 3)
            {

                TESTE = 1;
            }
           
        }
        //------------------------------------------------------------------------------------------------------------------------------------

        if (TESTE == 1)
        {

            //Расчёт площади сетки.
            SetcaDvijPloshad2 = SetkaDvijScaleZ2 * SetkaDvijScaleX2;
            PloshCraft = SetcaDvijPloshad2;
            Perebor = SetcaDvijPloshad2 - 1;
            PloshCraftMass = new int[PloshCraft];

            MonHodYachMass = new int[PloshCraft];

            for (PloshCraftFor = 0; PloshCraftFor < PloshCraft; PloshCraft--)
            {
                PloshCraftMass[PloshCraftMassCounter] = SetkaPassabilityControl.Setka[PloX, PloZ];

                PloshCraftMassCounter = PloshCraftMassCounter + 1;


                PloZ = PloZ + 1;
                if (PloZ > SetkaDvijScaleZ2)
                {
                    PloZ = 1;
                    PloX = PloX + SetkaDvijScaleZ2;
                }

            }

            //--------------\/------------------- В разработке ----------------------------------------------------------------------------------------------

            // Ищем координаты монстра, и занимаемся поиском координат клеток в радиусе шагания монстра -----

            MonCorZ = 6; //Z координаты монстра
            MonCorX = 11; //X координаты монстра

            MonCorZ = (MonCorZ - (SetkaMonHodZ / 2)); //Z координата точки отсчёта построения сетки ходьбы
            MonCorX = (MonCorX - (SetkaMonHodX / 2)); //X координата точки отсчёта построения сетки ходьбы


            MonCorX = MonCorX - 1; //X координаты монстра, еденицу отнимаем, чтобы воспользоваться формулой для расчёта X координаты номера ячейки

            PloshCraft = SetcaDvijPloshad2;
            PloshCraftMassCounter = 0;
            PloshMonHodXZ = SetkaMonHodX * SetkaMonHodZ;



                Xcount = MonCorX;

            if (Xcount > 0)
            {
                for (ZERO = 0; ZERO < Xcount; Xcount--)
                {
                    SX = SX + SetkaDvijScaleZ2;

                }
            }

            if (Xcount <= 0)
            {
                for (ZERO = 0; ZERO > Xcount; Xcount++)
                {
                    SX = SX - SetkaDvijScaleZ2;
                }
            }

            UniversalCounter2 = SetkaMonHodX;
            UniversalCounter3 = SetkaMonHodX;

            for (ZERO = 0; ZERO < UniversalCounter3; UniversalCounter3--)
            {
                for (ZERO = 0; ZERO < UniversalCounter2; UniversalCounter2--)
                {
                    if ((SX + Zcounter + MonCorZ) <= PloshCraft && (SX + Zcounter + MonCorZ) >= 0 - SetkaMonHodX && (MonCorZ + UniversalCounter) >= 0 && (MonCorZ + UniversalCounter) <= SetkaDvijScaleZ2)
                    {
                        Debug.Log("X" + SX + Zcounter);
                        Debug.Log("Z" + MonCorZ + UniversalCounter);
                        MonHodMass[SX + Zcounter, MonCorZ + UniversalCounter] = 3;
                    }
                    UniversalCounter = UniversalCounter + 1;

                    if (UniversalCounter > (SetkaMonHodX - 1))
                    {
                        UniversalCounter = 0;
                    }
                }

                Zcounter = Zcounter + SetkaDvijScaleZ2;
                UniversalCounter2 = SetkaMonHodX;

            }

            SX = 0;
            UniversalCounter = 0;
            UniversalCounter2 = 0;
            UniversalCounter3 = 0;








                PloX = 0;
                PloZ = 1;

            for (PloshCraftFor = 0; PloshCraftFor < PloshCraft; PloshCraft--)
            {
                MonHodYachMass[PloshCraftMassCounter] = MonHodMass[PloX, PloZ];

                PloshCraftMassCounter = PloshCraftMassCounter + 1;


                PloZ = PloZ + 1;
                if (PloZ > SetkaDvijScaleZ2)
                {
                    PloZ = 1;
                    PloX = PloX + SetkaDvijScaleZ2;
                }
            }


                //-----------------------------------------------------------------------------------------------
                //-----------------/\---------------- В разработке ----------------------------------------------------------------------------------------------




                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;

         

        }
        if (SPK == 3 && TESTE == 2)
        {








            //Циклы создания сетки исходя из её размера по оси "z" и оси "x" а так же её площади.





            for (ZDvij = 0; ZDvij < SetkaDvijScaleZ2; SetkaDvijScaleZ2--)
            {


                for (XDvij = 0; XDvij < SetkaDvijScaleX2; SetkaDvijScaleX2--)

                {

                    for (UDvij = 0; UDvij < SetcaDvijPloshad2; SetcaDvijPloshad2--)
                    {



                      if (MonHodYachMass[Perebor] == 3 && PloshCraftMass[Perebor] == 0)
                      {

                        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);
                      }

                        Perebor = Perebor - 1;


                        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;
        }




    }
}



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

Crystal 11.05.2020 03:00

Ответ: I.D.S. MONSTERS
 
Да, забыл сказать, теперь на очереди у меня система управления
перемещением монстра. Пока не знаю, ходить как в шахматах,
или сделать чтобы он как в героях двигался медленно в нужную
область используя поиск пути, первый вариант реализовать в 100 раз проще,
а на геймплей это никак не влияет, бои пошаговые.

П.с. на разработчиков No Man's Sky после своего генератора,
смотрю как на мифических зодчих всемогущих, не смотря на то,
что их игра полное говно, у них генерируются целые планеты,
с ландшафтами, пещерами, морями, ресурсами, растениями,
это что-то невероятное.Правда мир у них воксельный,
а не полигональный.

Crystal 17.05.2020 14:04

Ответ: I.D.S. MONSTERS
 
Вложений: 1
Это какая то война с юнити!
В общем прикрутил новую систему к клику мышью по монстру,
всё прекрасно работает. Далее в американских интернетах
вычитал, как программно создать коллайдер по форме меша, прикрутил.
Ну и попытался сделать перемещение монстра в точку пика на его
графической сетке проходимости. Мучился много, непонятно почему
луч в половине случаев простреливал сквозь казалось бы цельный меш.
В общем рыл долго в направлении коллайдеров, всё там перешуршал,
ничего не помогает.

И тут вдруг я начинаю переключать режимы рендера в сцене, и о чудо
ёмаё. Оказалось половина треугольников развёрнута не в ту сторону,
и видно это только в типе рендера "Render Paths", в обычном рендере
сцены, и игровом рендере меш рисовался как правильный,
скрин в посте выше, а вот и причина моей ночной головной боли:

Crystal 17.05.2020 14:09

Ответ: I.D.S. MONSTERS
 
Вложений: 1
Заменил местами две вершины в массиве, всё встало в норму.
наконец-то можно поспать, а в другой раз уже делать перемещение монстров.

Crystal 20.05.2020 01:43

Ответ: I.D.S. MONSTERS
 
Итак комрады, билда подъехала!: ТЫЫЫК

Добавлена возможность управления перемещением монстра.
Добавлены функции изменения состояния квадратов сетки проходимости
(грубо говоря куда шагнули, там квадрат стал непроходимым,
откуда ушли, тот стал проходимым).

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

Как управлять? Лкм на монстра, лкм в точку перемещения в радиусе доступности.

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

ant0N 20.05.2020 13:07

Ответ: I.D.S. MONSTERS
 
Вложений: 2
Сразу скажу, что запускал через вайн. Комп старый, на интегрированной видюхе.

1. низкий фпс, на глаз не больше 5 - 10
Я понимаю что в игре графон и все такое, но старые игры через тот же вайн у меня работают хорошо.
нужно срочно переводить игру на ecs, jobs, burst и scriptable object. Нёх в помощь


2. При клике по монстру появляется интерфейс без текста. В первый раз игра зависла на этом моменте.


3. В бою я почему-то управляю не своим персонажем, а монстром.
Когда я довел монстра до своего персонажа, то последний начал медленно улетать в горизонт.


4. Игра закрывается только убийством процесса.


Хорошая игра и бои интересные.

Crystal 20.05.2020 15:23

Ответ: I.D.S. MONSTERS
 
Щас на скорую руку фрапсом посмотрел, в 60 фпс
упёрлось, это ограничение самой проги. Наверное по тому, что монитор 60 герц, по факту макс скорость выше).
Чёт у тебя с компом или дрвоами, у меня игра летает.
Я на своей машине тестировал игру, выводил на экран 2000 монстров,
и при этом одновременно 20 монстров каждую секунду удалялись, и 20 создавались,
и фпс не проседал.

То что текста нет, я хз, стандартным методом юнити текст выводится.
То есть стандартные кнопки на стандартном канвасе,
слова выводятся встроенным в кнопки в юнити текстом.

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

Ладно, жду отзывы и других тестеров.
У меня комп Core Quad Q8200, 8гб ОЗУ, карта GF1660 SUPER,
игра летает. Комп слабый как видите, если у вас ещё хуже
(куда уж хуже, моему процессору 12 лет), то про fps можно вообще не писать ))

Crystal 20.05.2020 17:31

Ответ: I.D.S. MONSTERS
 
Коллега щас затестил. i7, 16 гб озу, GF1070.
144 FPS выдало, это максимальаня герцовка монитора его.
Чёто у тебя антон проблемы каике-то с железом или дровами.

ant0N 20.05.2020 20:36

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317212)
Коллега щас затестил. i7, 16 гб озу, GF1070.
144 FPS выдало, это максимальаня герцовка монитора его.
Чёто у тебя антон проблемы каике-то с железом или дровами.

не поленился, поставили крайзис через тот же вайн.
На низких настройках фпс не менее 30 (по ощущениям около 60)

Недавно прошел The Matrix: Puth of Neo. На стандартных настройках фпс так же не менее 30. Хоть игра и древняя, но там и анимация и отражения и частицы и эффекты


Мне кажется, проблемы не у меня.

Crystal 20.05.2020 21:08

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ant0N (Сообщение 317213)
Мне кажется, проблемы не у меня.

Под виндой у всех тестировавших всё прекрасно.
Игра всё-таки моя делается под форточки,
так что как говорится, проблемы линуксеров, это проблемы линуксеров )
На самом деле там лагать то нечему, у тебя на экране плейн, куб, и несколько квадов.

ant0N 21.05.2020 15:34

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317214)
так что как говорится, проблемы линуксеров, это проблемы линуксеров )

Как скажешь.

Цитата:

Сообщение от Crystal (Сообщение 317214)
На самом деле там лагать то нечему.

Ошибаешься

Crystal 22.05.2020 01:52

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ant0N (Сообщение 317218)
Как скажешь.


Ошибаешься

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

ABTOMAT 22.05.2020 12:59

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ant0N (Сообщение 317213)
не поленился, поставили крайзис через тот же вайн.
На низких настройках фпс не менее 30 (по ощущениям около 60)

Недавно прошел The Matrix: Puth of Neo. На стандартных настройках фпс так же не менее 30. Хоть игра и древняя, но там и анимация и отражения и частицы и эффекты


Мне кажется, проблемы не у меня.

А шо за пекарня? Какие более-менее новые игоры тянет?
Такого уровня оптимизации игр, какой был 10 лет назад, давно не делают, это тренд.

ant0N 22.05.2020 15:53

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ABTOMAT (Сообщение 317220)
А шо за пекарня? Какие более-менее новые игоры тянет?
Такого уровня оптимизации игр, какой был 10 лет назад, давно не делают, это тренд.


CPU: Topology: Dual Core model: Intel Core i3-3220
Graphics: Intel Xeon E3-1200 v2/3rd
Memory: 8 Gb
SSD: 120Gb

Если честно, я не помню сколько ему лет. Долгое время он лежал как музейный экспонать, и внезапно пригодился.

Да, калькулятор, но чтобы пустая сцена на юнити тормозила это какое-то дно.
Я на этом компе, например, делаю 3д проект на годо (и там больше логики и контента чем у Криса) и ничего не тормозит.

Насчет какие новые игры тянет я не в курсе. Не играю ни во что новое уже давно

Crystal 23.05.2020 02:22

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ant0N (Сообщение 317221)
CPU: Topology: Dual Core model: Intel Core i3-3220
Graphics: Intel Xeon E3-1200 v2/3rd
Memory: 8 Gb
SSD: 120Gb

Если честно, я не помню сколько ему лет. Долгое время он лежал как музейный экспонать, и внезапно пригодился.

Да, калькулятор, но чтобы пустая сцена на юнити тормозила это какое-то дно.
Я на этом компе, например, делаю 3д проект на годо (и там больше логики и контента чем у Криса) и ничего не тормозит.

Насчет какие новые игры тянет я не в курсе. Не играю ни во что новое уже давно

Друже, ты единственный у кого тормозит, и единственный кто на пингвине запускал, отсюда вывод, дело не в игре.
Чего-то в твоём 3D проекте нет, что есть в моём, с чем не справляется твой эмулятор.
Так-как там толком нифига не происходит, висят таймеры,
которые загружают и удаляют ассеты с периодичностью определённой не постоянно,
то могу предположить, что эмулятор не справляется с шейдерами порталов.

ant0N 23.05.2020 11:11

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317222)
Друже, ты единственный у кого тормозит, и единственный кто на пингвине запускал, отсюда вывод, дело не в игре.
Чего-то в твоём 3D проекте нет, что есть в моём, с чем не справляется твой эмулятор.
Так-как там толком нифига не происходит, висят таймеры,
которые загружают и удаляют ассеты с периодичностью определённой не постоянно,
то могу предположить, что эмулятор не справляется с шейдерами порталов.

Я как бы намекал, что проблема не в твоей игре, а в самом движке.
А эмулятора у меня нет, Вайн - не эмулятор.
Я единственный у кого тормозит, скорее потому что у меня самый слабый комп из всех. Линукс тут не причем, это доказывают другие игры.

Randomize 24.05.2020 01:10

Ответ: I.D.S. MONSTERS
 
Тормозит из-за GetComponent и CreateMesh в цикле.

Все GetComponent следует делать 1 раз и складывать в "кеш" переменную, с которой потом и работать.

Избавиться от CreateMesh в цикле, предварительно заготовив нужную модель и осуществлять только модификации (без перестройки сетки). Тут придётся как-то схитрить.

Но всё это premature оптимизации и всерьёз этим заниматься нужно только, когда будет что-то более-менее играбельное.

Crystal 24.05.2020 10:31

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ant0N (Сообщение 317223)
А эмулятора у меня нет, Вайн - не эмулятор.

Обратимся в википедию:
Цитата:

Wine (/waɪn/ — «уа́йн» рус. вино) — свободное программное обеспечение, позволяющее пользователям UNIX-подобных операционных систем, например, GNU/Linux, Apple macOS и других UNIX-подобных с поддержкой архитектур CPU x86, AMD64 (и других архитектур CPU, при наличии совместимости с ними запускаемых приложений) исполнять 16-, 32- и 64- битные приложения, в том числе игры, созданные исключительно для Microsoft Windows, без наличия при этом установленной Microsoft Windows.
Так, софт позволяющий на винде например запускать андройдные приложения - эмулятор.
Софт позволяющий запускать игры с плейстейшина - эмулятор.
Вайн позволяет на линуксе запускать виндозные приложения - не эмулятор?
Цитата:

Сообщение от Randomize (Сообщение 317225)
Тормозит из-за GetComponent и CreateMesh в цикле.

Все GetComponent следует делать 1 раз и складывать в "кеш" переменную, с которой потом и работать.

Избавиться от CreateMesh в цикле, предварительно заготовив нужную модель и осуществлять только модификации (без перестройки сетки). Тут придётся как-то схитрить.

Но всё это premature оптимизации и всерьёз этим заниматься нужно только, когда будет что-то более-менее играбельное.

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

Линуксный эмулятор просто не может переварить UNITY.
Я очень много времени уделил оптимизации проекта,
чтобы по максимуму убрать тормозящие факторы,
даже проводил стресстесты у различных людей.
Всё в ДАННЫЙ момент работает идеально,
так что давайте закроем тему эмуляторов,
меня линукс аудитория не интересует,
если проект и переедет ещё куда, так это на андройд максимум.

Ну и, я думаю правильно указывать минимальные системные требования,
которыми конечно же является компьютер разработчика.
Итак, минимальные системные требования игры:

Windows 7-8-10
Четырёхядерный процессор не ниже Intel CoeaQuad Q8200 2.33 GHZ
SSD диск любой
8GB ОЗУ DDR2 и выше.
Видеокарта GeForce 1660 SUPER
--------------------------------------------------------------------------------

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

ant0N 24.05.2020 11:23

Ответ: I.D.S. MONSTERS
 
Цитата:

Вайн позволяет на линуксе запускать виндозные приложения - не эмулятор?
Вайн не эмулирует Винду, он лишь реализует ее апи. Поэтому программы через Вайн работают с нативной скоростью.
Ты же открыл Вики, там написано: "Название W.I.N.E. является рекурсивным акронимом и расшифровывается «Wine Is Not an Emulator» — «W.I.N.E. — это не эмулятор»."



Цитата:

Сообщение от Crystal (Сообщение 317226)
Всё в ДАННЫЙ момент работает идеально,
так что давайте закроем тему эмуляторов,
меня линукс аудитория не интересует
.

Отлично, путь джедая. Если у кого-то есть проблемы с твоей игрой - эта игра не для него. По любому он сам виноват.
Ну удачи тебе (придется играть в гта5:( )

Arton 25.05.2020 00:09

Ответ: I.D.S. MONSTERS
 
Win7 x64 SP1 FX6100 GTX1050
Полёт нормальный.

Хотел проверить по быстрому на линуксе, не вышло.
Менеджер приложений сказал archive.ubuntu.com не отвечает. Протон в стиме тоже не захотел.
Хз как всё это настраивать.

  • В бою управляешь нападающем монстром? о_О
  • Бой закончить нельзя?
  • Если во время движения нажать масштаб, кубик сразу останавливается — странное поведение.

Crystal 25.05.2020 00:24

Ответ: I.D.S. MONSTERS
 
Цитата:

Ты же открыл Вики, там написано: "Название W.I.N.E. является рекурсивным акронимом и расшифровывается «Wine Is Not an Emulator» — «W.I.N.E. — это не эмулятор»."
А ещё там написано:
Цитата:

Wine, безусловно, не является стабильным продуктом, и нельзя сказать, что любую программу для Windows удастся запустить с его помощью. Некоторые подсистемы Windows вообще практически не реализованы.
Эмулирует он, на прямую работает, не важно, важно то, что это кривая херабора сделанная для того,
чтобы запускать приложухи для другой ОС, и это уже как-бы должно намекать, что многое будет работать через жопу.

Цитата:

Отлично, путь джедая. Если у кого-то есть проблемы с твоей игрой - эта игра не для него. По любому он сам виноват.
Ну допустим он попытается запустить на Mac ОС под очередным *неэмулятором*, не симулятором, не чегототамлятором, тоже я виноват буду?

Эта игра разрабатывается под Windows 7-9-10.
Не под линукс, не под андройд, не под айос,
не под консоли, не для фотоаппаратов, калькуляторов, и не для микроволновых печей.
Windows онли. Я не Epic Games, я один человек, который выбрал
одну платформу, и занимаюсь кодингом по выходным (иногда). Прошу отнестись с пониманием.


У всех линуксеров, что я ранее знал, всегда была винда, так-как винда штука нужная. Почему игнорируешь её?


Цитата:

Сообщение от Arton (Сообщение 317229)
Win7 x64 SP1 FX6100 GTX1050
Полёт нормальный.

Хотел проверить по быстрому на линуксе, не вышло.
Менеджер приложений сказал archive.ubuntu.com не отвечает. Протон в стиме тоже не захотел.
Хз как всё это настраивать.

  • В бою управляешь нападающем монстром? о_О
  • Бой закончить нельзя?
  • Если во время движения нажать масштаб, кубик сразу останавливается — странное поведение.

1. Пока в сцене боя нет понятия свой\чужой, все монстры твои.
Это как раз на очереди на реализацию.
2. Закончить бой нельзя, ещё не реализовано, только выход из игры.
3. Масштабировать нужно колесом мыши,
масштаб на стрелки я сделал для себя, так-как у меня сломано колесо мыши.
Просто на этих кнопках висит ещё один код, который я оставил себе как шпаргалку, он то и останавливает куб.

Судя по отзыву у тебя всё работает как надо, спасибо,
очередной раз доказано что всё норм.

ant0N 25.05.2020 10:33

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Arton (Сообщение 317229)
Хотел проверить по быстрому на линуксе, не вышло.
Менеджер приложений сказал archive.ubuntu.com не отвечает. Протон в стиме тоже не захотел.
Хз как всё это настраивать.

Просто через Вайн. Если его нет нужно установить.
Правой кнопкой мыши по приложению и должен появиться пункт "открыть с помощью wine"


Цитата:

Сообщение от Crystal (Сообщение 317230)
А ещё там написано:
Эмулирует он, на прямую работает, не важно, важно то, что это кривая херабора сделанная для того,
чтобы запускать приложухи для другой ОС, и это уже как-бы должно намекать, что многое будет работать через жопу.

Там такое не написано. Это лишь больная фантазия тех, кто слышал о вайне и линуксе в целом только из бородатых анекдотов.

Цитата:

Сообщение от Crystal (Сообщение 317230)
Ну допустим он попытается запустить на Mac ОС под очередным *неэмулятором*, не симулятором, не чегототамлятором, тоже я виноват буду?

Я где-то говорил что ты виноват?

Цитата:

Сообщение от Crystal (Сообщение 317230)
У всех линуксеров, что я ранее знал, всегда была винда, так-как винда штука нужная. Почему игнорируешь её?

Потому что я не играю в игры на юнити, для остального винда не нужна.

Randomize 25.05.2020 14:57

Ответ: I.D.S. MONSTERS
 
Стоит добавить, что игры на Unity3D у меня всегда отлично работали под вайном.
Даже такое ощущение, что только они и могут нормально в нём работать.

Цитата:

Сообщение от Crystal (Сообщение 317226)
Гет компонент и креатмеш присутствуют только в сцене боя

Ни суть в какой сцене, важно, что в методе Update. Это нежелательно.

Crystal 25.05.2020 18:10

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Randomize (Сообщение 317232)
Стоит добавить, что игры на Unity3D у меня всегда отлично работали под вайном.
Даже такое ощущение, что только они и могут нормально в нём работать.


Ни суть в какой сцене, важно, что в методе Update. Это нежелательно.

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

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

Какой фпс на линуксе у тебя выдаёт моё последнее демо?

Randomize 25.05.2020 22:37

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317233)
Какой фпс на линуксе у тебя выдаёт моё последнее демо?

Номинальный. Тормозов нет.

Crystal 31.05.2020 23:30

Ответ: I.D.S. MONSTERS
 
Вложений: 1
1. Переделана система выделения монстра,
я больше не сравниваю расстояние координат падения луча с координатами монстра.
2. Возвращена подмога монстра, теперь в сцене боя снова можно встретить от 1 до 3 монстров.
3. Прикручено управление персонажем в сцене боя, работает если мы решили принять участи в бою лично.
4. Создана генерация текстурной развертки для сетки движения, и наложена кислотно-зелёная текстура.
5. Новый элемент интерфейса - Создана панель шорткатов для сцены боя.
Пять ячеек равных количеству слотов переносимых персонажем монстров.
В ячейки подгружаются иконки монстров, по умолчанию у нас в кармане
уже давно в первой ячейке лежит монстр МАТ, он и загружается.
Панель автоматически масштабируется под размеры экрана.
Сама панель нужна будет для призыва монстров на поле боя в следующем билде.

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

Билда: ТЫК

Crystal 08.07.2020 16:26

Ответ: I.D.S. MONSTERS
 
Вложений: 2
С переездом булки утеряна инфа о том, что я создал
систему призыва монстров из кармана игрока, снова
расписывать как и что работает не буду, скриншот ниже.

Добавил панель скиллов, базу скиллов, при клике на монстра
появляется та самая панель, где мы можем выбрать атаку.
Сама система боя ещё не реализована, самих скиллов нет.

Незаметных правок механик тоже милард,
я стремлюсь к максимальной автоматизации и самозагрузкам,
чтобы по минимуму настраивать объекты в ручную кодом в скриптах.
Уже сейчас многое создаётся цифрами в инспекторе, без лишнего кодинга.

Билд: https://yadi.sk/d/V3qxKdw5SowXIA

Юзать только режим, где игрок сражается лично,
режимом нахождения в сторонке я ещё не занимался,
там вероятны ошибки, и не функциональность части механик.

P.s. Под постом не отображаются миниатюры загруженных изображений.

Crystal 08.07.2020 18:04

Ответ: I.D.S. MONSTERS
 
Для багг репортеров, пофикшены двойные действия
при нажатии на элементы UI. Тобишь если над монстром
например UI, и тыкая в элемент UI мышью никаких действий
по отношению к объектам под UI осуществляться
не будет, монстр случайно не выделится, и не шагнёт.

Решение простое:

Код:

                if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject() == false)

Arton 19.09.2020 11:48

Ответ: I.D.S. MONSTERS
 
DRV-13.2

Вроде всё работает.

Управление конечно не интуитивно.

Crystal 19.09.2020 18:29

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Arton (Сообщение 317565)
DRV-13.2

Вроде всё работает.

Управление конечно не интуитивно.

Я бы сказал непривычно. Я решил делать чисто своё всё,
общего с другими подобными играми только - идея *ловим монстров*.

Летом отдыхал, проектом не занимался, щас вернулся пару раз в неделю к кодингу.

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

На очереди в реализацию НР монстров, и их убийство.

P.s. Огромное время разработки занимает отлов багов
и их исправление, я бы сказал 95% времени, самое печальное,
что много что приходится по несколько раз переписывать с нуля.
Я делаю это до тех пор, пока функции не начнут работать идеально.
Так же стараюсь максимально всё оптимизировать, и писать код так,
чтобы он был универсальным, чтобы минимум всего делалось
вручную. Вот как например те же скиллы, не придётся на каждого монстра
всё кодить отдельно, скиллы просто на него вешаются, любые.
Много самозагрузок в коде, много массивов.

Crystal 19.09.2020 19:12

Ответ: I.D.S. MONSTERS
 
Решил посчитать размер текущего проекта,
так чисто интереса ради. На данный момент:

36 скриптов.
4720 строк кода.
13 ассетов
2 сцены
18 текстур
2 музыки
1 звуковой эффект

Crystal 21.09.2020 20:58

Ответ: I.D.S. MONSTERS
 
Решил записать второй девблог, чтобы был:


Arton 22.09.2020 18:15

Ответ: I.D.S. MONSTERS
 
Может тебе запасные скрипты и эксперименты с материалами в отдельном проекте проводить?

Давно так делаю, у меня даже с Блица осталось куча папок где чисто эксперименты были, которые потом можно было вырезать и применить в общем коде.

Попробуй для микрофона простой шумодав включить, или обработать потом.

Crystal 22.09.2020 20:55

Ответ: I.D.S. MONSTERS
 
Рискнул купив новые наушники с подозрительным микрофоном, он оказался говном,
его ничто не вылечит. Просто надо купить предыдущую модель.

Зачем в отдельном проекте проводить, если эти скрипты для текущего?
Они же цепляются к тому что здесь функционирует.
Папка лежит, жрать не просит )

ABTOMAT 22.09.2020 21:12

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317585)
Рискнул купив новые наушники с подозрительным микрофоном, он оказался говном,
его ничто не вылечит. Просто надо купить предыдущую модель.

Зачем в отдельном проекте проводить, если эти скрипты для текущего?
Они же цепляются к тому что здесь функционирует.
Папка лежит, жрать не просит )

Норм варик по-бичу — заказать на Алике микрофон-прищепку за ~$5-10.
При записи подносить близко ко рту и говорить громко.
Качество получается норм.
Это наилучшее качество, которое можно получить при данном порядке затрат.

Следующий уровень — это уже ёмкостные микрофоны с внешним питанием, но они стоят уже на порядок дороже.

Crystal 22.09.2020 22:01

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ABTOMAT (Сообщение 317586)
Норм варик по-бичу — заказать на Алике микрофон-прищепку за ~$5-10.
При записи подносить близко ко рту и говорить громко.
Качество получается норм.
Это наилучшее качество, которое можно получить при данном порядке затрат.

Следующий уровень — это уже ёмкостные микрофоны с внешним питанием, но они стоят уже на порядок дороже.

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

ABTOMAT 22.09.2020 23:15

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317587)
Моя мечта микрофон студийный какой-нибудь с поп фильтром,
но я всё никак не могу его купить, по тому что из меня тянут
деньги мои грёбаные машины. В джип за год вложил 300 тыс (

Едрить ты автомобилист! А я вот недавно мотоцикл уделал, общий нанесённый ущерб по минимальным оценкам ~2000р (если всё по бичу делать), и я-то думал, что это неприятность.

Crystal 23.09.2020 01:11

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от ABTOMAT (Сообщение 317588)
Едрить ты автомобилист! А я вот недавно мотоцикл уделал, общий нанесённый ущерб по минимальным оценкам ~2000р (если всё по бичу делать), и я-то думал, что это неприятность.

Неприятность, когда у тебя коробка передач разваливается например )))
А 2000 это так ) Это у меня в неделю на бензин уходит )))

А теперь по теме.
Визуальное решение отображения жизней найдено,
по сути это то, о чём сказано в девблоге,
но с небольшим приукрашиванием,
частично реализовано, в недалёком будущем покажу.
Решение довольно странное, непонятно на сколько удобное,
и как это воспримет игрок )
Но реально хотелось уйти от банальной красной полоски,
хотя решение к ней всё же близкое.

Crystal 02.10.2020 23:59

Ответ: I.D.S. MONSTERS
 
Монстрам добавлено здоровье.
К здоровью привязана последняя версия моего хелсбара.
Добавлен первый скилл наносящий урон монстрами монстрам.
Теперь монстр может сдохнуть и оставить свой трупик.
Труп монстра можно уничтожить.
Заменены шейдеры местами, и некоторые текстуры.
Добавлены звуки удара, получения урона, уничтожения трупа,
перемещения по сетке.

Текущий билд: ТУТ

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

Воевать можно пока в режиме "Сражаться".
ИИ ещё отсутствует, ручное управление монстрами.
Монстров можно наспавнить сколько угодно.
Возвращение в открытый мир из сцены боя не реализовано.

Crystal 04.10.2020 00:26

Ответ: I.D.S. MONSTERS
 
Вложений: 1
Пока никто не реагировал на пост, в игре появились
вылетающие из монстра цифры с нанесённым по нему уроном.
У монстров появилась сила, которая умножается на мощность скилла.
Параметров силы у монстра два, это минимальная и максимальная,
при ударе выбирается случайное число от минимума до максимума.
Появился уровень удачи в процентах, позволяющий
выдать больший урон, при срабатывании удачи урон
увеличивается на сумму от 10 до 70 процентов от мощности силы
монстра перемноженной на мощность скилла.

На данном скриншоте монстру при ударе не выпала удача,
шанс которой у него был всего 30%, и сила удара была почти
минимальной, ведь при минимуме в 10 силы и максимуме в 15,
и при мощности скилла в 10 монстр выдал 102 урона,
а это значит сила удара была 10.2

Добавил:
БИЛД

Crystal 05.10.2020 06:07

Ответ: I.D.S. MONSTERS
 
Вложений: 1
Официальный примитивный логотип игры.
Это как понимаете этакий сборный значок имблетов монстров,
в одном глазу которого перевёрнутый крест
являющийся символом религии игрового мира,
где поклоняются богу по имени "Ихний".
(Ихний, считают приверженцы религии, это бог наславший монстров).

ARA 05.10.2020 12:55

Ответ: I.D.S. MONSTERS
 
Цитата:

Сообщение от Crystal (Сообщение 317685)
Официальный примитивный логотип игры.
Это как понимаете этакий сборный значок имблетов монстров,
в одном глазу которого перевёрнутый крест
являющийся символом религии игрового мира,
где поклоняются богу по имени "Ихний".
(Ихний, считают приверженцы религии, это бог наславший монстров).

А также нужна вторая религия, которая считает, что Ихнего не существует, а есть только православный Их.

Crystal 05.10.2020 14:32

Ответ: I.D.S. MONSTERS
 
Второй есть, и его зовут "Евонный".
Никаких реальных религий не будет,
Все совпадения случайны.
Названия богов такие сами понимаете
не с проста, это такой юморочек.

Crystal 09.10.2020 00:58

Ответ: I.D.S. MONSTERS
 
Появилась прокачка монстров до 25 уровня.
Имеется стандартный бар отображающий прогресс по накоплению экспы.
Отображается уровень монстра в определённом окошке.
Билд не компилю один фиг не тестите.

Crystal 10.10.2020 16:22

Ответ: I.D.S. MONSTERS
 
Разработана система массух (скиллы бьющие по площади).
Реализован и визуализирован второй скилл (ЭЛЕКТРОШОК), он как раз массуха.
Добавлен визуальный эффект при получении уровня монстром
(жёлтые огоньки вылетают из него). Звук тоже проигрывается.

Свежий билд : ТЫГ



Crystal 13.10.2020 00:20

Ответ: I.D.S. MONSTERS
 
1. Разработана и внедрена система пошаговых сражений на 3 стороны.
2. Добавлена кнопка пропуска/завершения хода.
3. Добавлены звуки перехода хода, к кому перешёл, такой и звук.
4. Добавлен маркер помечающий того монстра, чей сейчас ход.
5. Добавлен информирующий текст ( чей ход).
6. Добавлена функция возврата на предыдущую сцену.

ИИ всё ещё отсутствует, врагом управляет игрок.
Присутствует френдли фаер. Игрок неуязвим. (куб).

БИЛД


Crystal 23.10.2020 21:09

Ответ: I.D.S. MONSTERS
 
Подлечил глаза от воспаления, возвращаюсь по чуть чуть к кодингу.
Сцена боя окончательно слилась со сценой открытого мира,
и генерируется на 15 пунктов ниже, в данный момент это
уже второй вариант генерации сцены боя, и он меня устраивает.
Теперь геймплей зациклен, тобишь после победы над монстром
мы продолжаем игру в открытом мире.


Часовой пояс GMT +4, время: 08:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot