image.png917 Кб, 1200x675
Официальный сайт: https://unity.com/ru Документация: https://docs.unity3d.com/Manual/index.html Урок 994942 В конец треда | Веб
Официальный сайт: https://unity.com/ru
Документация: https://docs.unity3d.com/Manual/index.html
Уроки: https://unity3d.com/ru/learn/tutorials
Форум: https://forum.unity3d.com
Магазин ассетов: https://assetstore.unity.com

На Unity сделано много замечательных игр: Zenless Zone Zero, V Rising, Hearthstone, VRChat, Escape from Tarkov, Valheim, Pathfinder, Cuphead, Genshin Impact, Subnautica, Albion Online, Endless Space, Beat Saber, Boneworks, Rust, Блицкриг 3, Pillars of Eternity, Tyranny, Kerbal Space Program и многие другие.

Главным преимуществом Unity перед другими движками является его простота для одиночной разработки. Не нужно иметь целую компанию девелоперов, чтобы сделать хорошую игру. Если ты один или имеешь небольшую команду и хочешь сделать хорошую игру без претензий на ААА, то Unity станет лучшим выбором. Тем не менее, даже крупные корпорации зачастую выбирают для своих игр именно Unity.

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

Какие у Unity слабые стороны?
Сложность в создании фотореалистичной графики. Для графики "как в Crysis" рекомендуется взять другой движок. Хотя Unity вполне способен выдавать не уступающую любым другим движкам картинку, это требует определённого навыка от разработчика.

На каких языках я могу писать скрипты для Unity?
Поддерживается написание скриптов на C# 9.0
https://docs.unity3d.com/Manual/CSharpCompiler.html

Какие есть готовые решения для создания мультиплеерной игры?
https://www.photonengine.com
https://mirror-networking.com
https://playfab.com

На каких платформах работают созданные с помощью Unity игры?
Windows, Linux, MacOS, SteamOS, Android, iOS, Windows Phone, PlayStation4, Xbox One, WebGL, Oculus Rift и многие другие. Полный список можно найти на официальном сайте. Таким образом, игры Unity работают на десктопах, на смартфонах, планшетах, приставках, в браузерах, VR-очках и некоторых других системах.

Часто вижу скриншоты с красивой природой на Unity. Как такое создать?
Очень просто! В Unity встроены удобные инструменты для создания террейна и SpeedTree для создания деревьев и готовая реализация ветра - не нужно ничего писать или скачивать и подключать плагины - ландшафт в Unity создаётся в пару кликов.

Что нужно уметь делать для создания полноценной игры, кроме Unity-разработки?
Кроме непосредственной разработки игры на Unity, требуется также уметь создавать 3D модели (3ds Max, Blender, ZBrush), 2D рисунки (GraphicsGale, Aseprite, Piskel), текстуры (Substance Designer, NeoTextureEdit), музыку (FruityLoops, Ableton). Не обязательно учить это всё - например, в 2D играх не нужны 3D модели, а музыка необходима далеко не всегда. Также вы можете скачивать элементы для ваших игр на бесплатных сайтах. Если у вас есть деньги, то все необходимые элементы можно заказать у фрилансеров на https://www.fl.ru/ (русскоязычный) или https://www.upwork.com/ (англоязычный).

Бесплатен ли Unity?
Можно свободно скачивать, использовать и продавать готовые игры на Unity с лицензией Personal - это абсолютно бесплатно! Но на бесплатной версии при запуске игры будет появляться короткий стартовый ролик "Made with Unity", а также ваши доходы ограничены 100 000 долларов в год. Для снятия этих ограничений нужно приобретать платные версии лицензий Unity. В конечном итоге, платные варианты используются лишь крупными компаниями с огромными доходами, тогда как обычные разработчики в большинстве своём используют бесплатную Personal лицензию.

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

Обучение языку C# книги на русском языке:

1. C# для чайников Автор книги – Джон Пол Мюллер
2. Программирование на C# для начинающих 2е части Автор: Алексей Васильев
3. Head First. Изучаем C# 4е издание Авторы: Эндрю Стиллмен, Дженнифер Грин
4. Unity и C#. Геймдев от идеи до реализации Автор: Джереми Гибсон Бонд
5. Язык программирования C# 7 и платформы .NET и .NET Core Авторы: Филипп Джепикс, Эндрю Троелсен

Для людей абсолютно не знакомых с движком есть 3и основные книги на русском языке:

1. Разработка игр на Unity 2018 за 24 часа Майка Гейга
(Знакомство с движком, изучение редактора, создание 4х простых игр практически без кода, отличное пособие для полных новичков).
2. Изучаем C# через разработку игр на Unity. 5-е издание Харрисон Ферроне
(Пошаговое освоение всех базовых знаний по программированию на языке С# в редакторе юнити, создание одной игры стрелялки от первого лица, написание искусственного интеллекта врага, книга переведена не совсем корректно и порой встречаются не просто опечатки, а серьёзные неточности перевода.)
3. Unity в действии. Мультиплатформенная разработка на C#. 3-е межд. издание Хокинг Джозеф
(Правильное построение архитектуры кода для сложных проектов, углублённое изучение программированию на C#, создание 4х полноценных игр на движке, обязательно нужно скачать код проектов, так как в книге он местами уже устарел.)

Шапка: https://pastebin.com/JGUAcbwj

Прошлый тред: >>980548 (OP)
2 994968
какой всратый перекат
3 994972
>>4942 (OP)

>сделано много замечательных игр: Zenless Zone Zero


дальше не читал
4 994973
>>4968
спросонья проебался немного
burnice.mp418,9 Мб, mp4,
720x480, 1:30
5 995086
>>4972
что-то не нравится?
Sampler chess square error.jpg107 Кб, 1266x780
6 995282
Подскажите, почему сэмплер аппроксимирует текстуру с подобными артефактами? Это оптимизация кода сэмплера для ускорения, или неточности плавающей запятой, или какие-то особенности работы GPU? Есть ли способ сэмплировать без этих артефактов?
7 995364
>>4942 (OP)

>Но на бесплатной версии при запуске игры будет появляться короткий стартовый ролик "Made with Unity"


Уже не актуально
------------.mp48,8 Мб, mp4,
720x1280, 0:59
8 995879
Visual studio или Visual studio code? Что сейчас лучше для Юпити?
9 995888
>>5879
VSC, но он забагованый с Unity
Лучше всего Rider Commnity
10 995999
Сап, не очень понимаю логику как такую фишку можно сделать в юнити. Для пояснения, визульная новелла с авточтением, где новый текст появляется каждые 5-10 секунд, или по щелчку мыши
Ожидание в секундах можно сделать через WaitForSeconds, щелчок мыши тоже можно отловить.
Но не могу понять а как это совместить, чтобы еще щелчок мыши, отменял корутину которая ждет секунды
11 996000
>>5999
coroutine = StartCoroutine(...)
StopCoroutine(coroutine)

Также это реализуемо через async await, в том числе с помощью UniTask.

И в целом у тебя должно бвть понимание, что это можно реализовать и без каких-либо корутин и асинк авейта, а чисто апдейтом переменной таймера в Update, но такое решение разумеется будет не очень годным.
17212238162030.png1,3 Мб, 1024x1024
12 996019
В чем разница между Image и UI Image? Полгода назад начал делать карточный игорь с интерфейса (меню, кнопочки, это вот все) и как-то в нем все и сделал. Теперь вся игра это как один гигантский интерфейс с дохулионом UI Image в нем. каких-то проблем с производительностью нет, но может она была бы раз в 10 лучше если бы делал все в Image? Нет ли каких-то подводных с этим. Сейчас вот хочу начать другой проект и тоже хочу его также заделать в интерфейсе, т.к. уже привык.
13 996024
>>6019
Скинь скрин, что за UiImage?

> Теперь вся игра это как один гигантский интерфейс с дохулионом UI Image в нем. каких-то проблем с производительностью нет, но может она была бы раз в 10 лучше если бы делал все в Image?


Когда любой элемент в канвасе меняется - весь канвас перерисовывается. Поэтому с целью производительности есть смысл по разным канвасам всё распиливать.

А с точки зрения юзабельности и удобства - ещё и по разным префабам всё раскидать, возможно даже по разным сценам
14 996026
>>5999
Можешь хоть через инвок сделать.
У тебя есть номер текущего текста, допустим он сразу
int t = 124;
И контрольная переменная которая изначально равна 0.
int t_control;

В апдейте:
If (t_control != t)
{ t_control = t; Invoke("ChangePage", 10f); }

ChangePage()
{
If (t_control == t)
{
t += 1;
... // тут активируй следующий текст, и т.к. теперь t_control != t , то в апдейте будет запущен ивок для следующей смены текста
}
else
{
// тут нихуя нет, просто ничего не делаешь, т.к. t_control стал неравен t из-за нажатия мышкой. она поменяла страницу и инициировала очередной инвок в апдейте
}
}

// это метод для мышки
PickMouse()
{
t += 1;
... // тут активируй следующий текст
}
14 996026
>>5999
Можешь хоть через инвок сделать.
У тебя есть номер текущего текста, допустим он сразу
int t = 124;
И контрольная переменная которая изначально равна 0.
int t_control;

В апдейте:
If (t_control != t)
{ t_control = t; Invoke("ChangePage", 10f); }

ChangePage()
{
If (t_control == t)
{
t += 1;
... // тут активируй следующий текст, и т.к. теперь t_control != t , то в апдейте будет запущен ивок для следующей смены текста
}
else
{
// тут нихуя нет, просто ничего не делаешь, т.к. t_control стал неравен t из-за нажатия мышкой. она поменяла страницу и инициировала очередной инвок в апдейте
}
}

// это метод для мышки
PickMouse()
{
t += 1;
... // тут активируй следующий текст
}
15 996028
>>6026
Не надо так делать.
Если ты с кем-то на проекте заюзаешь инвок, то ебало разобьют сразу.

А если ещё и вот именно так, то ещё и обоссут.
16 996035
>>6024
Правой кнопкой в иерархии вызови меню, там есть UI (вторая снизу) и в ней уже Image.
17 996039
>>6028

>Не надо так делать.


Что не так, если делать в своем проекте? Кроме того, то это быстро, надежно и предельно понятно?

>на проекте заюзаешь инвок


Если ты на ебаной галере, где прогеры меняются раз в неделю и никто уже нихуя не понимает, откуда что вызывается и зачем проекте, то да. Тогда каротинами, и не забудь пару раз обмазать все это гет-сетами, чтобы кто-нибудь случайно не залез.
18 996041
>>6035
Вроде надо было делать игру в 3Д пространстве, просто создав плоские 3Д объекты, наклеить на них текстуры карт и выложив их на одной плоскости. А интерфейс типа только для интерфейса. А я в нем захуячил всю игру, т.к. удобнее было
19 996042
>>6026
да, через корутину уже сделал
Появилась другая хрень, что если в коце цикла булево переводить обратно в фалс сразу после окончания, то он переодически два прохода подряд хуярил, пришлось в начале цикла тоже дописать чтобы ставил, хрен знает почему

foreach(GameObject /////////)
{
canContinue = false;
///
yield return new WaitUntil(() => canContinue);
canContinue = false;
}
20 996043
>>6039
У инвока?
1. Название текстом(решается через nameof)
2. Нет контроля за лайфтаймом инвока
3. Нулевая расширяемость, более сложная логика требующая большего погружения в контекст
4. Непонятно нахуя его юзать, когда есть
>>6026

> В апдейте:


> If (t_control != t)


> { t_control = t; Invoke("ChangePage", 10f); }



> ChangePage()


> {


> If (t_control == t)


> {


> t += 1;


> ... // тут активируй следующий текст, и т.к. теперь t_control != t , то в апдейте будет запущен ивок для следующей смены текста


> }


> else


> {


> // тут нихуя нет, просто ничего не делаешь, т.к. t_control стал неравен t из-за нажатия мышкой. она поменяла страницу и инициировала очередной инвок в апдейте


> }


> }



> // это метод для мышки


> PickMouse()


> {


> t += 1;


> ... // тут активируй следующий текст


> }



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

А если я сделаю навигацию по страницам в любую сторону потом? А если добавлю ускорение текста на пробел? А если сделать добавить галочку - включить/выключить автоскролл?

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

Я вот вообще не понимаю прикола сложной логике в угоду скорости, когда даже не видно профита, в своих проектах пишу ровно также как на работе, я хз нахуя писать а, b, _t, if (r+1 < y /5) r+=2 и прочую ебалу.

Почему бы не сделать просто
IEnumerator AutoScrollCoroutuine()
{
yield return Wait ...

SetNextText();

SetNextAutoScroll();
}

private void SetNextAutoScroll()
{
StopCoroutine(_autoScroll);
_autoScroll = StartCoroutine(AutoScrollCoroutine);
}

void Click()
{
SetNextText();
SetNextAutoScroll();
}

И сразу всё понятно, всё на естественном язвке почти, около нулевоц контекст надо в голове держать и 0 вопросов а что если.
20 996043
>>6039
У инвока?
1. Название текстом(решается через nameof)
2. Нет контроля за лайфтаймом инвока
3. Нулевая расширяемость, более сложная логика требующая большего погружения в контекст
4. Непонятно нахуя его юзать, когда есть
>>6026

> В апдейте:


> If (t_control != t)


> { t_control = t; Invoke("ChangePage", 10f); }



> ChangePage()


> {


> If (t_control == t)


> {


> t += 1;


> ... // тут активируй следующий текст, и т.к. теперь t_control != t , то в апдейте будет запущен ивок для следующей смены текста


> }


> else


> {


> // тут нихуя нет, просто ничего не делаешь, т.к. t_control стал неравен t из-за нажатия мышкой. она поменяла страницу и инициировала очередной инвок в апдейте


> }


> }



> // это метод для мышки


> PickMouse()


> {


> t += 1;


> ... // тут активируй следующий текст


> }



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

А если я сделаю навигацию по страницам в любую сторону потом? А если добавлю ускорение текста на пробел? А если сделать добавить галочку - включить/выключить автоскролл?

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

Я вот вообще не понимаю прикола сложной логике в угоду скорости, когда даже не видно профита, в своих проектах пишу ровно также как на работе, я хз нахуя писать а, b, _t, if (r+1 < y /5) r+=2 и прочую ебалу.

Почему бы не сделать просто
IEnumerator AutoScrollCoroutuine()
{
yield return Wait ...

SetNextText();

SetNextAutoScroll();
}

private void SetNextAutoScroll()
{
StopCoroutine(_autoScroll);
_autoScroll = StartCoroutine(AutoScrollCoroutine);
}

void Click()
{
SetNextText();
SetNextAutoScroll();
}

И сразу всё понятно, всё на естественном язвке почти, около нулевоц контекст надо в голове держать и 0 вопросов а что если.
21 996046
>>6043

>1


это локальная задача, просто похуй. если опечатка, то не будет работать - сразу найду и поправлю

>2


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

>3


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

>4


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

If (t_control != t) { t_control = t; Invoke("ChangePage", 10f); }

ChangePage() { If (t_control == t) { t += 1; NextText(); } }

PickMouse() { t += 1; NextText();}

>А если я сделаю навигацию по страницам в любую сторону потом? А если добавлю ускорение текста на пробел? А если сделать добавить галочку - включить/выключить автоскролл?



Просто ты задроченная галерная мартыха, которую так часто били палками продакт-манагеры, что она пытается предусмотреть все, даже если это там в принципе не нужно.
А я - челове-творец собственных проектов, который знает, что к нему завтра не прибежит пидарас-манагер, хуево понявший техзадание от забугорного барина, с криком - а, бля, все надопеределать!
Если я делаю так - значит это оптимально и допустимо для меня. если нет, то я сам же себя потом накажу пределками. Но такого практически никогда не бывает. Поскольку я думаю дольше 2х минут прежде чем начать что-то кодить. Если я написал код таким образом, то я точно, блеать знаю, то никакого "ускорения текста на пробел" в этом месте никогда не будет. А если мне будет нужна прокрутка назад, то я добавлю еще две строки где будет присутствовать почти те же самыt строки только с t -=1;
22 996049
>>6046

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


Ну какие продакты? Это чисто адекватный прикид что в игре может понадобится в будущем.

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


Хз, я никогда не работал на аутсорсе, только в продукте, а если что-то надо переделать(в связи с фидбеком) - это штатная ситуация, которую ты делаешь не с горелой жопой потому что "должны быть готово вчера", а в нормальном режиме, как обычное итерационное улучшение. И на своем проекте тоже самое.

> Если я написал код таким образом, то я точно, блеать знаю, то никакого "ускорения текста на пробел" в этом месте никогда не будет.


Ну я не знаю, значит это ты слишком спланированный какой-то. Что угодно если делаешь сам, у тебя всегда будет какое-то шатание в плане того что нужно, по мере появления нового фидбека(в том числе от себя)
23 996058
>>6049
Ты работаешь в условной команде и такой подход в составе команды правильный, что каждый на своем месте все предусматривает.
Если же ты делаешь проект в одно лицо, то разу должен прикидывать, какие вещи критически важны и могут потребовать изменений в дальнейшем, а какие второстепенны и для них нужен только базовый функционал. Без умения отсекать вторичное, ты никогда не сделаешь соло-проект из-за банальной нехватки времени. Поэтому в соло-проекте предпочтительны 3 работающие строчки кода, вместо 20 "таких как нужно".
Так же нет никаких блокировок доступа к данным, потому-что если ты будешь их писать, то реально ебанешься или во время написания или, когда начнешь что-то править
24 996067
>>6058

> Без умения отсекать вторичное, ты никогда не сделаешь соло-проект из-за банальной нехватки времени. Поэтому в соло-проекте предпочтительны 3 работающие строчки кода, вместо 20 "таких как нужно".


Так это ты 20 строчек написал с неочевидной логикой, а у меня 3 и вышло с корутиной и прозрачной работой, кек.

Не знаю как ты, но как по мне любой моло проект это тоже самое, что и не соло проект, если ты делаешь его больше месяца, и потом ты точно также будешь вспоминать где там у тебя что и как работает.
25 996073
>>5999
Привет, есть куча опыта как раз с такой частью, т.к сам делал пару новел.
Реализовывал это так:
Есть таймер который запускается при вызове, рядом каждую 0.1 сек печается новая буква, если буквы в переменной закончились, таймер останавливает и при нажатии передается вызов дальше, если же игрок нажал на текст то весь текст переносится в переменую и таймер так-же останавливается.
Все это дело у меня занимало немного апдейта, проблем ноль, работает идеально.
Обновить тред
« /gd/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

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