![](images/chestnut/misc/left.gif) |
Постмор Истории успешного завершения проекта.
Разрабы рассказывают, как к успеху шли. |
24.02.2020, 21:41
|
#46
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Итак, по своему же принципу из блитца, научил движок
визуализировать координатную сетку мешем.
Сколько клеток, столько полигонов, один полигон
состоит из двух триангл.
В будущем на нужный полигон будем натягивать
необходимую в данный момент текстуру клетки.
Билд выкладывать смысла не вижу, вы там просто
очередную плоскость увидите.
Код создания сетки полигонами:
![](images/chestnut/misc/code_html.gif)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetkaCreator : MonoBehaviour
{
public int SetkaScaleZ = 10; //Размер сетки по оси "Z".
public int SetkaScaleX = 10; //размер сетки по оси "X".
public int SetcaPloshad; //Площадь сетки.
//Статичные переменные для отсчёта в циклах создания клеток сетки.
public int Z = 0;
public int X = 0;
public int U = 0;
void Start()
{
//Расчёт площади сетки.
SetcaPloshad = SetkaScaleZ * SetkaScaleX;
//Создаём меш.
Mesh Setka = new Mesh();
//Подключаем меш фильтр.
MeshFilter SetkaFilter = GetComponent<MeshFilter>();
//Применяем мешфильтр к мешу.
SetkaFilter.mesh = Setka;
//Циклы создания сетки исходя из её размера по оси "z" и оси "x" а так же её площади.
for (Z = 0; Z < SetkaScaleZ; SetkaScaleZ--)
{
for (X = 0; X < SetkaScaleX; SetkaScaleX--)
{
for (U = 0; U < SetcaPloshad; SetcaPloshad--)
{
//Создаём вектор вершин с массивом из четырёх штук.
Vector3[] Vershini = new Vector3[4]
{
//Пишем в масси координаты вершин опираясь на размер сетки по её осям.
new Vector3(0,0,0), new Vector3(SetkaScaleX,0,0), new Vector3(0,SetkaScaleZ,0), new Vector3(SetkaScaleX,SetkaScaleZ,0)
};
//Создаём массив с трианглами.
int[] Bermubes = new int[6];
Bermubes[0] = 0;
Bermubes[1] = 2;
Bermubes[2] = 1;
Bermubes[3] = 2;
Bermubes[4] = 3;
Bermubes[5] = 1;
//Создаём массив с текстурнымикоординатами.
Vector2[] TextureCoordinates = new Vector2[4]
{
new Vector2(0,0) , new Vector2(1,0) , new Vector2(0,1) , new Vector2(1, 1)
};
//Задаём вершины мешу.
Setka.vertices = Vershini;
//Создаём трианглы меша.
Setka.triangles = Bermubes;
//Создаём uv развёртку.
Setka.uv = TextureCoordinates;
}
}
}
}
void Update()
{
}
}
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
25.02.2020, 17:27
|
#47
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Для меня лично хреновенькие новости.
Юнити оказался более убогим инструментом, чем мне думалось.
К сожалению в нём нет никакой встроенной функции, чтобы
программно натягивать текстуры на выбранный полигон.
Совсем нет! Можно цвет вершин менять, как в блитце, но
это простите пещерный век. Мою задачу может решить
только самодельный шейдер, т.е. самому лично написать.
Шейдеры это у нас (HLSL, GLSL, Cg, ASM), ни того ни другого,
ни третьего, ни четвёртого я не знаю, и всандалить кучу времени
на изучение данного вопроса для создания мать его одного эффекта
всего лишь, я не могу. Такими темпами я буду игру создавать
вплоть до полной колонизации галактики человечеством.
Меняем стратегию. У меня родилось 3 варианта, которые я рассматриваю:
1. Вырезаем ненужные или нужные полигоны из меша сетки,
при этом у нас будет 2 сетки, на одной тайловая текстура
проходимых клеток, на второй непроходимых.
2. Не режем полигоны, а разворачиваем их нормали в противоположную
сторону от камеры, так же всё в связке с 2 сетками.
3. Создаём меш из клеток нужной формы, и ставим на нужные
координаты поверх сетки, наносим на него тайловую текстуру
клеток непроходимости.
Я пока не знаю что дешевле, вырезать дырки в меше,
разворачивать нормали, или генерить каждый раз новый
небольшой меш.
Но в любом случае все эти варианты дешевле, чем создавать
каждую клетку отдельным мешем, вы только вдуууумайтесь
какая жопа будет, если я решу создать поле размером 100 на
100 клеток отдельными мешами, этот вариант точно не вариант.
P.s. Ещё один вариант-не вариант это генерить текстуру сетки.
отрисовывая на ней клетки проходимости и непроходимости,
и перенатягивать на меш-сетку. Нунах.
|
(Offline)
|
|
25.02.2020, 19:49
|
#48
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
![](images/chestnut/misc/citation.gif)
Сообщение от Crystal
Для меня лично хреновенькие новости.
Юнити оказался более убогим инструментом, чем мне думалось.
К сожалению в нём нет никакой встроенной функции, чтобы
программно натягивать текстуры на выбранный полигон.
Совсем нет! Можно цвет вершин менять, как в блитце, но
это простите пещерный век. Мою задачу может решить
только самодельный шейдер, т.е. самому лично написать.
Шейдеры это у нас (HLSL, GLSL, Cg, ASM), ни того ни другого,
ни третьего, ни четвёртого я не знаю, и всандалить кучу времени
на изучение данного вопроса для создания мать его одного эффекта
всего лишь, я не могу. Такими темпами я буду игру создавать
вплоть до полной колонизации галактики человечеством.
Меняем стратегию. У меня родилось 3 варианта, которые я рассматриваю:
1. Вырезаем ненужные или нужные полигоны из меша сетки,
при этом у нас будет 2 сетки, на одной тайловая текстура
проходимых клеток, на второй непроходимых.
2. Не режем полигоны, а разворачиваем их нормали в противоположную
сторону от камеры, так же всё в связке с 2 сетками.
3. Создаём меш из клеток нужной формы, и ставим на нужные
координаты поверх сетки, наносим на него тайловую текстуру
клеток непроходимости.
Я пока не знаю что дешевле, вырезать дырки в меше,
разворачивать нормали, или генерить каждый раз новый
небольшой меш.
Но в любом случае все эти варианты дешевле, чем создавать
каждую клетку отдельным мешем, вы только вдуууумайтесь
какая жопа будет, если я решу создать поле размером 100 на
100 клеток отдельными мешами, этот вариант точно не вариант.
P.s. Ещё один вариант-не вариант это генерить текстуру сетки.
отрисовывая на ней клетки проходимости и непроходимости,
и перенатягивать на меш-сетку. Нунах.
|
Любое изменение в меше означает, что надо будет заново формировать индексный и вершинный буферы и передавать их на видеокарту, поэтому в принципе одинаково.
Сколько у тебя будет клеток? Если 50х50 — делай тупо отдельным GameObject'ами и не трать время на premature-оптимизацию.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.02.2020, 22:22
|
#49
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от ABTOMAT
Любое изменение в меше означает, что надо будет заново формировать индексный и вершинный буферы и передавать их на видеокарту, поэтому в принципе одинаково.
Сколько у тебя будет клеток? Если 50х50 — делай тупо отдельным GameObject'ами и не трать время на premature-оптимизацию.
|
Размер поля будет увеличиваться прямо-пропорционально
увеличению класса монстров в бое. На финальном боссе
точно будет около 100 на 100.
Как я писал ранее:
Монстры будут классифицированы по типу угрозы с их стороны.
всего семь классов:
7. Божественный
6. Титанический
5. Демонический
4. Слоновый
3. Львиный
2. Собачий
1. Мышиный
|
Размер поля боя будет высчитываться исходя из типа угрозы,
будем смотреть кто самый крутой в бое, и под него подгонять поле.
Решил визуализировать выделение созданием отдельного меша.
Начал уже писать скрипт, на базе уже существующего генератора меша,
надо доработать. Через несколько дней надеюсь будет билда.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
01.03.2020, 22:51
|
#50
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
В данный момент выкладка билды смысла не имеет,
решил запилить отчёт девблогом:
Код:
![](images/chestnut/misc/code_html.gif)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetkaDvijControl : MonoBehaviour
{
//Сетка движения юнита.
//-------------------------------------------------------------------------------------------------------------------------------------------
public int SetkaDvijCreator = 0;
public GameObject SetkaMobile;
public GameObject TipaMonster;
public float SetkaScaleZ = 10;
public float SetkaScaleX = 10;
public float SetkaDvijScaleZ = 5; //Размер сетки по оси "Z".
public float SetkaDvijScaleX = 5; //размер сетки по оси "X".
public float SetcaDvijPloshad; //Площадь сетки.
//Статичные переменные для отсчёта в циклах создания клеток сетки.
public int ZDvij = 0;
public int XDvij = 0;
public int UDvij = 0;
public Vector3 Pickposition;
public float MonsterHoditX;
public float MonsterHoditZ;
public float vx;
public float vz;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (SetkaDvijCreator == 0)
{
SetkaDvijCreator = 1;
Pickposition = TipaMonster.transform.position;
MonsterHoditX = SetkaDvijScaleX / 2f;
MonsterHoditZ = SetkaDvijScaleZ / 2f;
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX, 0, Pickposition.z - MonsterHoditZ);
//Регулируем размер сетки выделения и её позицию относительно краёв поля
// Если сетка выползла за левый край игрового поля, подрезаем её на количество выползающих клеток, и на столько же сдвигаем
if (Pickposition.x - MonsterHoditX < 0)
{
vx = Pickposition.x - MonsterHoditX;
SetkaDvijScaleX = SetkaDvijScaleX + vx;
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX - vx, 0, Pickposition.z - MonsterHoditZ);
}
// Если сетка выползла за правый край игрового поля, подрезаем её на количество выползших клеток
if (Pickposition.x + MonsterHoditX > SetkaScaleX)
{
vx = (Pickposition.x + MonsterHoditX) - SetkaScaleX;
SetkaDvijScaleX = SetkaDvijScaleX - vx;
}
// Если сетка выползла за нижний край игрового поля, подрезаем егё на количество выползающих клеток, и на столько же сдвигаем
if (Pickposition.z - MonsterHoditZ < 0)
{
vz = Pickposition.z - MonsterHoditZ;
SetkaDvijScaleZ = SetkaDvijScaleZ + vz;
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX, 0, Pickposition.z - MonsterHoditZ - vz);
}
// Если сетка выползла за верхний край игрового поля, подрезаем её на количество выползших клеток
if (Pickposition.z + MonsterHoditZ > SetkaScaleZ)
{
vz = (Pickposition.z + MonsterHoditZ) - SetkaScaleZ;
SetkaDvijScaleZ = SetkaDvijScaleZ - vz;
}
//------------------------------------------------------------------------------------------------------------------------------------
Mesh SetkaDvij = new Mesh();
//Подключаем меш фильтр.
MeshFilter SetkaDvijFilter = GetComponent<MeshFilter>();
//Применяем мешфильтр к мешу.
SetkaDvijFilter.mesh = SetkaDvij;
//Расчёт площади сетки.
SetcaDvijPloshad = SetkaDvijScaleZ * SetkaDvijScaleX;
//Создаём меш.
//Циклы создания сетки исходя из её размера по оси "z" и оси "x" а так же её площади.
for (ZDvij = 0; ZDvij < SetkaDvijScaleZ; SetkaDvijScaleZ--)
{
for (XDvij = 0; XDvij < SetkaDvijScaleX; SetkaDvijScaleX--)
{
for (UDvij = 0; UDvij < SetcaDvijPloshad; SetcaDvijPloshad--)
{
//Создаём вектор вершин с массивом из четырёх штук.
Vector3[] Vershini2 = new Vector3[4]
{
//Пишем в масси координаты вершин опираясь на размер сетки по её осям.
new Vector3(0,0,0), new Vector3(SetkaDvijScaleX,0,0), new Vector3(0,SetkaDvijScaleZ,0), new Vector3(SetkaDvijScaleX,SetkaDvijScaleZ,0)
};
//Создаём массив с трианглами.
int[] Bermudes2 = new int[6];
Bermudes2[0] = 0;
Bermudes2[1] = 2;
Bermudes2[2] = 1;
Bermudes2[3] = 2;
Bermudes2[4] = 3;
Bermudes2[5] = 1;
Vector2[] TextureCoordinates2 = new Vector2[4]
{
new Vector2(0,0) , new Vector2(SetkaDvijScaleX,0) , new Vector2(0,SetkaDvijScaleZ) , new Vector2(SetkaDvijScaleX, SetkaDvijScaleZ)
};
//Задаём вершины мешу.
SetkaDvij.vertices = Vershini2;
//Создаём трианглы меша.
SetkaDvij.triangles = Bermudes2;
SetkaDvij.uv = TextureCoordinates2;
SetkaDvij.RecalculateBounds();
SetkaDvij.RecalculateNormals();
SetkaDvij.RecalculateTangents();
}
}
}
}
}
}
}
|
(Offline)
|
|
02.03.2020, 00:47
|
#51
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Вот так по симпатичней уже.
Напомню в рендере всего 2 меша с 2 текстурами (если не считать капсулу монстра).
Вполне дёшего по моему. Если делать все клетки отдельными мешами,
то в кадре было бы на 123 меша больше, т.е. в 62,5 раза больше мешей.
P.s. Всё-таки билду решил приложить: ТЫК
Нажатие пробела переносит нас в сцену боя, в сцене боя нажатие пробела создаёт сетку хождения монстра.
|
(Offline)
|
|
02.03.2020, 23:54
|
#52
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Пост оффтопный.
Я много видел плагиата на вселенную покемонов,
но что-бы на столько нагло, в первый раз: ТЫЫЫК
Вообще ни стыда не совести, все монстры здесь
это покемоны из официальной вселенной, и имеют некоторые
незначительные отличия, ну не так уши загнуты,
или на них одежда надета. А чо так можно было?
Даже музыка в игре, это каверы на музыку из покемонов.
Сцука да вот даже картинка, на которой в наглую срисованы
как минимум Чаризард, Бульбазавр, и Вартотл:
Оригиналы:
А это блин например вообще ни разу не пикачу скрещенный с райчу?
Оригиналы:
Вот у них хантэр, чармандэр, и дратини например:
![](https://www.creagames.com/images/marketing/mps_landing_cbt/cs1.png) ![](https://www.creagames.com/images/marketing/mps_landing_cbt/dn1.png)
Но зовут их конечно каспес, дино, и дракоша.
А оригиналы вот:
Дратини и Драгонэир
Я не понимаю, в чём проблема придумать СВОИХ монстров блэт?
Для меня например не было никакой проблемой придумать какого-нибудь дуплуса, который прикреплён к посту,
так в чём проблема у таких плагиаторов? Полное отсутствие фантазии, или попытка надурить детишек выдавая себя за то, чем не являются?
У меня всегда бомбит, когда я вижу клоны, не в плане копирования механик, а тупо клоны, типа как штаны ADIBASS.
![](https://pbs.twimg.com/media/DZ9K_5BUMAAjGPz.jpg)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.03.2020, 00:16
|
#53
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
Пост оффтопный.
Я многого видел плагиата на вселенную покемонов,
но что-бы на столько нагло, в первый раз: ТЫЫЫК
Вообще ни стыда не совести, все монстры здесь
это покемоны из официальной вселенной, и имеют некоторые
незначительные отличия, ну не так уши загнуты,
или на них одежда надета. А чо так можно было?
Даже музыка в игре, это каверы на музыку из покемонов.
Сцука да вот даже картинка, на которой в наглую срисованы
как минимум Чаризард, Бульбазавр, и Вартотл:
А это блин например вообще ни разу не пикачу?
Вот у них хантэр, чармандэр, и дратини например:
![](https://www.creagames.com/images/marketing/mps_landing_cbt/cs1.png) ![](https://www.creagames.com/images/marketing/mps_landing_cbt/dn1.png)
Но зовут их конечно каспес, дино, и дракоша.
Я не понимаю, в чём проблема придумать СВОИХ монстров блэт?
![](https://www.meme-arsenal.com/memes/c467903d4a699288ec09cc94955fbb0e.jpg)
|
На самом деле эти ребята по очень тонкому льду ходят, потому что Нинтенда на адвокатов тратит чуть ли не больше, чем на собственно разработку. Я бы с Нинтендой (как и с Диснеем) так шутить не стал. Если это дело станет более-менее зарабатывать, то обратит на себя внимание Нинтенды, и те их засудят. А в американском суде побеждает тот, у кого больше денег на адвокатов, а Нинтенда на них бабок не жалеет.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
03.03.2020, 00:33
|
#54
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от ABTOMAT
На самом деле эти ребята по очень тонкому льду ходят, потому что Нинтенда на адвокатов тратит чуть ли не больше, чем на собственно разработку. Я бы с Нинтендой (как и с Диснеем) так шутить не стал. Если это дело станет более-менее зарабатывать, то обратит на себя внимание Нинтенды, и те их засудят. А в американском суде побеждает тот, у кого больше денег на адвокатов, а Нинтенда на них бабок не жалеет.
|
Да я даже посмотрел бы как их отымеют в суде, и похлопал бы в ладоши.
По тому что глядя на такой высер, появляется лишь желание обоссать лица авторам плагиата.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.03.2020, 21:23
|
#55
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Что-то взрослая жизнь бьёт временем по щекам.
Первый раз за 3 дня нашёл полтора часа по кодить.
Нашёл страшную недоработку сетки монстра,
если одновременно сетка выползала за обе координаты игрового
поля ниже 0, то сетка подрезалась, но не смещалась по Х вправо,
а на оборот уезжала влево. Решил проблему добавлением этого участка кода:
// Выравниваем сетку, когда её координаты вылезают за 0 по обеим осям
if (Pickposition.x - MonsterHoditX < 0 && Pickposition.z - MonsterHoditZ < 0)
{
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX - vx, 0, Pickposition.z - MonsterHoditZ - vz);
}
Ну так же я тут читал, что такое префабы, и с чем их едят.
Частично поглотил информацию, и научился клонировать
своих монстров в нужном месте одной строчкой кода.
Я считаю это прогресс для меня, лол )
В блитце это дело делалось через типы, а в юнити явно проще всё.
Щас нужно будет сделать выделение монстра мышкой через луч,
потом генератор монстров на карте, где мы персонажем бегаем,
чтобы контакт с ними перекидывал нас на сцену боя.
Сделать систему свой-чужой, и пошаговый бой, вот пока
такие планы на ближайшее будущее.
После реализации вышеописанного данную наработку
можно уже официально будет считать игрой.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.03.2020, 21:23
|
#56
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сегодня можно было плотно по программировать,
или посмотреть две новые серии ходячих мертвецов.
В общем серии оказались полным говном ))
Однако, сделал выделение монстров кликом мыши.
Пришлось подзапариться с тем, как сделать чтобы
выделялся только один, а также подзапариться
с удаленем сетки уже выделенного монстра.
Альфа вариант успешно функционирует )
В общем как сделать, чтобы не все префабы выделились
при щелчке по одному из них, а только нужный?
Проверить его координаты!
Берём координаты префаба монстра, пускаем луч,
сравниваем позицию префаба по осям X и Z с
точкой падения луча. Если координаты префаба больше
или равны координатам пика, то из координат префаба
вычитаем координаты пика, ну и записываем результат
по обеим осям в соответствующие переменные.
Так-как у нас размер сетки 1 на 1, то проверяем
числа в данных переменных, если они меньше чем 1.01,
значит префаб находится в клетке куда мы луч пускали,
префабу по этим координатам сетку мы и создадим.
Участок кода отвечающий за определение пикнутого лучом монстра:
Pickposition = TipaMonster.transform.position;
if (Pickposition.x >= PickRay.point.x)
{
mx = Pickposition.x - PickRay.point.x;
}
else
{
mx = PickRay.point.x - Pickposition.x;
}
if (Pickposition.z >= PickRay.point.z)
{
mz = Pickposition.z - PickRay.point.z;
}
else
{
mz = PickRay.point.z - Pickposition.z;
}
if (mx < 1.01 && mz < 1.01)
{
А насчёт удаления сетки, когда мы куда-то в другое место пикнули,
то удалять пришлось меш из мешфильтра, а не весь гейм обджект,
я сначала пытался гейм обджект удалять, и новый из префаба вызывать,
но то была проблемная хрень, удалить меш из мешфильтра умное решение.
Удаляем так:
if (SetkaDestroyer == 1 && SetkaDvijCreator == 3)
{
SetkaDvijCreator = 0;
SetkaDestroyer = 0;
}
if (SetkaDestroyer == 1)
{
SetkaDvijCreator = 3;
Destroy(GetComponent<MeshFilter>().mesh);
SetkaDvijScaleZ = 5;
SetkaDvijScaleX = 5;
}
Если нужна билда, выложу по запросу, но думается мне что никому нах не надо )))
Вот весь код на случай если кто ну очень любопытный.
Предупреждаю, может втсречаться мусор, и неправильные комментарии,
так-как я увлекаюсь самокопипастой, и ваще комментить уже впадлу стало.
![](images/chestnut/misc/code_html.gif)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SetkaDvijControl : MonoBehaviour
{
//Сетка движения юнита.
//-------------------------------------------------------------------------------------------------------------------------------------------
public int SetkaDvijCreator = 0;
public Camera Camera; //Камера конечно
public GameObject SetkaMobile;
public GameObject TipaMonster;
public Object SetkaDvij;
public int SetkaDestroyer = 0;
public float SetkaScaleZ = 10;
public float SetkaScaleX = 10;
public float SetkaDvijScaleZ = 5; //Размер сетки по оси "Z".
public float SetkaDvijScaleX = 5; //размер сетки по оси "X".
public Vector3 RaycastPickCoordinates; //Конечные координаты падения луча в рейкасте на коллайдер
public string RaycastObjNow; // Текстовая переменная, содержит имя объекта коллайдер которого попал под луч
public float SetcaDvijPloshad; //Площадь сетки.
//Статичные переменные для отсчёта в циклах создания клеток сетки.
public int ZDvij = 0;
public int XDvij = 0;
public int UDvij = 0;
public Vector3 Pickposition;
public float MonsterHoditX;
public float MonsterHoditZ;
public float vx = 0f;
public float vz = 0f;
public float mx;
public float mz;
public float mDx;
public float mDz;
void Update()
{
//Сам луч, начинается от позиции камеры и направлен в сторону мыши
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//Структура луча, нужна для получения информации из Raycast
RaycastHit PickRay;
//Пускаем луч
Physics.Raycast(ray, out PickRay);
//Если нажата ЛКМ
if (Input.GetMouseButtonDown(0))
{
if (SetkaDestroyer == 1 && SetkaDvijCreator == 3)
{
SetkaDvijCreator = 0;
SetkaDestroyer = 0;
}
if (SetkaDestroyer == 1)
{
SetkaDvijCreator = 3;
Destroy(GetComponent<MeshFilter>().mesh);
SetkaDvijScaleZ = 5;
SetkaDvijScaleX = 5;
}
//Если запустили луч
if (Physics.Raycast(ray, out PickRay))
{
//Получаем координаты пика на коллайдере
RaycastPickCoordinates = new Vector3(PickRay.point.x, PickRay.point.y, PickRay.point.z);
//Пишем в RaycastObjNow и дебаггер конкретно во что воткнулся луч
RaycastObjNow = PickRay.collider.name;
//Если луч попал в плейн
if (RaycastObjNow == "Capsule")
{
//Обнуляем RaycastObjNow
RaycastObjNow = "NiHuYa";
}
Pickposition = TipaMonster.transform.position;
if (Pickposition.x >= PickRay.point.x)
{
mx = Pickposition.x - PickRay.point.x;
}
else
{
mx = PickRay.point.x - Pickposition.x;
}
if (Pickposition.z >= PickRay.point.z)
{
mz = Pickposition.z - PickRay.point.z;
}
else
{
mz = PickRay.point.z - Pickposition.z;
}
if (mx < 1.01 && mz < 1.01)
{
if (SetkaDvijCreator == 0)
{
SetkaDvijCreator = 1;
SetkaDestroyer = 1;
Pickposition = TipaMonster.transform.position;
MonsterHoditX = SetkaDvijScaleX / 2f;
MonsterHoditZ = SetkaDvijScaleZ / 2f;
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX, 0, Pickposition.z - MonsterHoditZ);
//Регулируем размер сетки выделения и её позицию относительно краёв поля
// Если сетка выползла за левый край игрового поля, подрезаем егё на количество выползающих клеток, и на столько же сдвигаем
if (Pickposition.x - MonsterHoditX < 0)
{
vx = Pickposition.x - MonsterHoditX;
SetkaDvijScaleX = SetkaDvijScaleX + vx;
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX - vx, 0, Pickposition.z - MonsterHoditZ);
}
// Если сетка выползла за правый край игрового поля, подрезаем её на количество выползших клеток
if (Pickposition.x + MonsterHoditX > SetkaScaleX)
{
vx = (Pickposition.x + MonsterHoditX) - SetkaScaleX;
SetkaDvijScaleX = SetkaDvijScaleX - vx;
}
// Если сетка выползла за нижний край игрового поля, подрезаем её на количество выползающих клеток, и на столько же сдвигаем
if (Pickposition.z - MonsterHoditZ < 0)
{
vz = Pickposition.z - MonsterHoditZ;
SetkaDvijScaleZ = SetkaDvijScaleZ + vz;
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX, 0, Pickposition.z - MonsterHoditZ - vz);
}
// Если сетка выползла за верхний край игрового поля, подрезаем её на количество выползших клеток
if (Pickposition.z + MonsterHoditZ > SetkaScaleZ)
{
vz = (Pickposition.z + MonsterHoditZ) - SetkaScaleZ;
SetkaDvijScaleZ = SetkaDvijScaleZ - vz;
}
// Выравниваем сетку, когда её координаты вылезают за 0 по обеим осям
if (Pickposition.x - MonsterHoditX < 0 && Pickposition.z - MonsterHoditZ < 0)
{
SetkaMobile.transform.position = new Vector3(Pickposition.x - MonsterHoditX - vx, 0, Pickposition.z - MonsterHoditZ - vz);
}
//------------------------------------------------------------------------------------------------------------------------------------
Mesh SetkaDvij = new Mesh();
//Подключаем меш фильтр.
MeshFilter SetkaDvijFilter = GetComponent<MeshFilter>();
//Применяем мешфильтр к мешу.
SetkaDvijFilter.mesh = SetkaDvij;
Debug.Log("Создали SetkaDvij");
//Расчёт площади сетки.
SetcaDvijPloshad = SetkaDvijScaleZ * SetkaDvijScaleX;
//Создаём меш.
//Циклы создания сетки исходя из её размера по оси "z" и оси "x" а так же её площади.
for (ZDvij = 0; ZDvij < SetkaDvijScaleZ; SetkaDvijScaleZ--)
{
for (XDvij = 0; XDvij < SetkaDvijScaleX; SetkaDvijScaleX--)
{
for (UDvij = 0; UDvij < SetcaDvijPloshad; SetcaDvijPloshad--)
{
//Создаём вектор вершин с массивом из четырёх штук.
Vector3[] Vershini2 = new Vector3[4]
{
//Пишем в массив координаты вершин опираясь на размер сетки по её осям.
new Vector3(0,0,0), new Vector3(SetkaDvijScaleX,0,0), new Vector3(0,SetkaDvijScaleZ,0), new Vector3(SetkaDvijScaleX,SetkaDvijScaleZ,0)
};
//Создаём массив с трианглами.
int[] Bermudes2 = new int[6];
Bermudes2[0] = 0;
Bermudes2[1] = 2;
Bermudes2[2] = 1;
Bermudes2[3] = 2;
Bermudes2[4] = 3;
Bermudes2[5] = 1;
Vector2[] TextureCoordinates2 = new Vector2[4]
{
new Vector2(0,0) , new Vector2(SetkaDvijScaleX,0) , new Vector2(0,SetkaDvijScaleZ) , new Vector2(SetkaDvijScaleX, SetkaDvijScaleZ)
};
//Задаём вершины мешу.
SetkaDvij.vertices = Vershini2;
//Создаём трианглы меша.
SetkaDvij.triangles = Bermudes2;
SetkaDvij.uv = TextureCoordinates2;
SetkaDvij.RecalculateBounds();
SetkaDvij.RecalculateNormals();
SetkaDvij.RecalculateTangents();
}
}
}
}
else
{
SetkaDvijScaleZ = 5;
SetkaDvijScaleX = 5;
}
}
}
}
}
}
Смотреть мой форумный блог полезно тому, кто соберётся например своих героев меча и магии на юнити написать,
я иду к этой механике, только она будет сложнее. Так что, не пропускайте )
Ах да, монстры из префабов вызываются сейчас так:
void Start()
{
Instantiate(TipaMonster, new Vector3(1.5f, 0, 2.5f), Quaternion.identity);
Instantiate(TipaMonster, new Vector3(5.5f, 0, 5.5f), Quaternion.identity);
Instantiate(TipaMonster, new Vector3(9.5f, 0, 9.5f), Quaternion.identity);
}
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
06.03.2020, 02:08
|
#57
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
Сегодня можно было плотно по программировать,
или посмотреть две новые серии ходячих мертвецов.
В общем серии оказались полным говном ))
|
Благодаря тому, что ты стал постить прогресс в своём проекте, я решил "а чё я лох штоле" и тоже свой проект достал из пыльного ящика и тоже покодил.
Как в старые-добрые времена, когда чувствовал себя лохом, что посоны на форуме чё-то кодят а ты нет. ![Laught](images/smilies/DDD.gif)
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
|
06.03.2020, 05:36
|
#58
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от ABTOMAT
Благодаря тому, что ты стал постить прогресс в своём проекте, я решил "а чё я лох штоле" и тоже свой проект достал из пыльного ящика и тоже покодил.
Как в старые-добрые времена, когда чувствовал себя лохом, что посоны на форуме чё-то кодят а ты нет. ![Laught](images/smilies/DDD.gif)
|
Похвально. Сложно найти в себе силы что-то делать.
Я вот 10 лет почти искал. Бабы, мотоциклы, автомобили,
онлайн игры, работа, сон в конце концов, не до проектов.
Столько идей нереализованных. Деградировал,
многое упустил в геймдеве. 3DMAX тоже открывал в
2012 году наверно последний раз, по этому в этом проекте
я начну изучать блендер. Пока мы тут жили жизнью обычного
человека, некоторые форумчане продолжили начинания,
и уже живут жизнью необычного, так что надо брать пример.
Ещё для меня хорошим примером стал "Крис Хант", он 12 лет
разрабатывал Kenshi, и всё-таки релизнул, и она начала неплохо
продаваться. До сих пор кстати игру дорабатывает, и продаёт.
ТЫЫЫК
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.03.2020, 00:47
|
#59
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: I.D.S. MONSTERS
Блин всё-таки этот сраный юнити, да в связке с сишарпом, адище то ещё.
Я сказал что префабы делают всё легче, чем типы в блитце? Забудьте!
Это ад какой-то! Нет, не когда ты в префабах деревья да камни харнишь.
а когда у тебя там боты мать их.
Я тут дошёл до типов, слоёв, триггеров, и т.д. и это мне чуть пукан всё
не порвало, на сколько всё по ублюдски сделано!
Однако, прогресс:
1. Монстры теперь выполнены текстурой на плоском кваде,
который всегда поворачивается на камеру (щас не до моделинга).
И вот с этим поворачиванием я намаялся, всё никак не мог заставить
одновременно всех ботов на камеру смотреть, всё решил в
итоге параметр "This", кто знает, тот поймёт.
2. Теперь монстры имеют радиус обзора, реализованный через триггер,
который отслеживает слой игрока, и если коллайдер игрока залез
в триггер, монстр начинает за ним бежать. У монстра есть отсчёт
времени бега, а также контроль зоны видимости. Пока игрок
в зоне видимости, монстр за ним будет бежать, как только мы
из зоны выйдем, монстр будет бежать по таймеру, который закончится.
Убежать вполне реально.
3. Есть ещё один триггер, это уже на подход монстра вплотную проверка идёт,
чтобы перекинуть нас на сцену боя.
На сцене боя пока можно только по выделять монстров.
----
На самом деле на словах не так много реализовано, но игра уже состоит
из 14 скриптовых файлов, кучи объектов, переменных.
А эти млять триггеры, да слои мне таких проблем насоздавали,
что абсолютно во всём предыдущем коде есть изменения.
В общем ловите билду ТЫК , и тестите. Жду репорты о багах.
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Crystal за это полезное сообщение:
|
|
09.03.2020, 20:53
|
#60
|
Бывалый
Регистрация: 10.06.2011
Адрес: В горах
Сообщений: 849
Написано 331 полезных сообщений (для 853 пользователей)
|
Ответ: I.D.S. MONSTERS
Сообщение от Crystal
Блин всё-таки этот сраный юнити, да в связке с сишарпом, адище то ещё.
Я сказал что префабы делают всё легче, чем типы в блитце? Забудьте!
Это ад какой-то! Нет, не когда ты в префабах деревья да камни харнишь.
а когда у тебя там боты мать их.
Я тут дошёл до типов, слоёв, триггеров, и т.д. и это мне чуть пукан всё
не порвало, на сколько всё по ублюдски сделано!
.
|
Как же я тебя понимаю... Третий месяц пошел как я работаю с юнити, стулья прогорают один за другим. Но чувствую, это только вершина айсберга.
Вот даже не могу сказать что в юнити сделано хорошо, чтобы без оговорок
__________________
Абсолютли!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:32.
|