Это копия, сохраненная 4 ноября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Прошлый тред: >>796855 (OP)
Официальный сайт: https://unity3d.com/ru
Документация: https://docs.unity3d.com/ru/current/Manual/index.html
Уроки: https://unity3d.com/ru/learn/tutorials
Форум: https://forum.unity3d.com/
Магазин ассетов: https://unity3d.com/ru/asset-store
UnityWiki: http://wiki.unity3d.com/index.php/Main_Page
На Unity сделано много замечательных игр - Valheim, Genshin Impact, Subnautica, Albion Online, Endless Space, Beat Saber, Boneworks, Rust, Блицкриг 3, Pillars of Eternity, Tyranny, Kerbal Space Program и многие другие. Главным преимуществом Unity перед другими движками является его простота для одиночной разработки. Не нужно иметь целую компанию девелоперов, чтобы сделать хорошую игру. Если ты один или имеешь небольшую команду и хочешь сделать хорошую игру без претензий на ААА, то Unity станет лучшим выбором. Тем не менее, даже крупные корпорации зачастую выбирают для своих игр именно Unity.
FAQ
- Какие у Unity сильные стороны?
- Простота разработки, удобный инструментарий, кроссплатформенность, богатая документация, огромное сообщество.
- Какие у Unity слабые стороны?
- Сложность в создании фотореалистичной графики. Для графики "как в Crysis" рекомендуется взять другой движок. Хотя Unity вполне способен выдавать не уступающую любым другим движкам картинку, это требует определённого навыка от разработчика.
- На каких языках я могу писать скрипты для Unity?
- На выбор два языка - C# и UnityScript. UnityScript - это что-то среднее между JavaScript и ActionScript. Выбирай язык по своему вкусу, они оба вполне удобны, но помни, что большинство примеров написано на C#.
- Для каких жанров подходит Unity?
- Для абсолютно любых! Жанр ограничивается лишь фантазией разработчика (и его умением писать скрипты, разумеется). Можно создавать и РПГ, и стратегии, и слэшеры. Можно делать VR-проекты или Minecraft-подобные песочницы.
- На каких платформах работают созданные с помощью Unity игры?
- Windows, Linux, MacOS, SteamOS, Android, iOS, Windows Phone, PlayStation4, Xbox One, WebGL, Oculus Rift и многие другие. Полный список можно найти на официальном сайте. Таким образом, игры Unity работают на десктопах, на смартфонах, планшетах, приставках, в браузерах, VR-очках и некоторых других системах.
- Часто вижу скриншоты с красивой природой на Unity. Как такое создать?
- Очень просто! В Unity встроены удобные инструменты для создания террейна и SpeedTree для создания деревьев и готовая реализация ветра - не нужно ничего писать или скачивать и подключать плагины - ландшафт в Unity создаётся в пару кликов.
- Что такое стартер киты?
- Starter Kit - это набор скриптов и префабов, а зачастую и графических элементов для игры. Они призваны облегчить разработку игры определённого жанра и как правило разбиты по жанрам (Action-RPG Starter Kit, RTS Starter Kit, 3D Shooter Starter Kit, Space Game Starter Kit, VR Starter Kit и так далее). Также бывают стартер киты различных игровых элементов, не связанных с геймплеем (Nature Starter Kit с дополнительными природными объектами, Medieval Starter Kit со средневековыми объектами и так далее). По сути, стартер киты выполняют в разработке игры ту же роль, что и фреймворки в программировании. Однако стоит отметить, что использование геймплейного стартер кита принуждает разработчика изучать большое количество чужого кода и чужой структуры для внесения своих изменений и полноценного использования. В связи с этим большинство разработчиков предпочитает писать почти всё с нуля, получая полное понимание работы своей игры. Новичкам крайне не рекомендуется начинать знакомство с 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# можно узнать на интерактивных курсах здесь:
https://dotnetcademy.net/CSharp/Beginner
или в текстовом туториале здесь:
https://www.tutorialspoint.com/csharp/csharp_quick_guide.htm
Для изучения основ UnityScript выучи вначале основы JavaScript:
https://learn.javascript.ru/
Помни, что далеко не все элементы JS есть в US. Чтобы понять, в чём разница между этими двумя языками, прочти эту статью:
http://wiki.unity3d.com/index.php/UnityScript_versus_JavaScript
Помни, что тебе достаточно одного языка из двух и учить их оба одновременно не нужно.
- Движок
Если ты уже умеешь использовать язык, то можно приступать непосредственно к изучению движка. Крайне рекомендется купить/скачать книгу Unity in action (Unity в действии). В ней подробно описываются множество возможностей движка.
http://www.ozon.ru/context/detail/id/34792570/
Также посмотри на видеотуториалы с официального сайта:
https://unity3d.com/learn/tutorials
Если же ты не любишь видеотуториалы (или не понимаешь разговорный английский) и предпочитаешь текст, то посмотри здесь:
http://catlikecoding.com/unity/tutorials/
Тут крайне подробно описан процесс разработки и приведены примеры кода. Эти туториалы универсальны и описывают множество различных частей игры, от работы с текстурами до генерации карты мира. А вот в этом туториале описыватся разработка двухмерной игры с видом сверху:
https://www.raywenderlich.com/61532/unity-2d-tutorial-getting-started
Это будет полезно, даже если ты планируешь разрабатывать трёхмерную игру. Ни в коем случае нельзя обойти вниманием этот сборник туториалов:
https://noobtuts.com/unity
В нём подробно описывается процесс пошагового создания разных игр - двухмерных и трёхмерных.
Разумеется, все эти туториалы охватывают лишь часть возможностей Unity. Самый надёжный способ выучить Unity - это начать делать игру и по мере разработки гуглить непонятные моменты.
Для людей абсолютно не знакомых с движком и программированием на C# есть 3и основные книги:
1. Разработка игр на Unity 2018 за 24 часа Майка Гейга
(Знакомство с движком, изучение редактора, создание 4х простых игр практически без кода, отличное пособие для полных новичков).
2. Изучаем C# через разработку игр на Unity. 5-е издание Харрисон Ферроне
(Пошаговое освоение всех базовых знаний по программированию на языке С# в редакторе юнити, создание одной игры стрелялки от первого лица, написание искусственного интеллекта врага, книга переведена не совсем корректно и порой встречаются не просто опечатки, а серьёзные неточности перевода.)
3. Unity в действии. Мультиплатформенная разработка на C#. 2-е межд. издание Хокинг Джозеф
(Правильное построение архитектуры кода для сложных проектов, углублённое изучение программированию на C#, создание 4х полноценных игр на движке, обязательно нужно скачать код проектов, так как в книге он местами уже устарел.)
Шапка: https://www.writeurl.com/publish/qzgktisltkskaitem6aa
1680x1050, 0:45
пчел, твою задачу можно упрощать сколько угодно, но пока ты не воспользуешься своей головой ты не решишь её. у тебя 9 классов образования то уже есть, надеюсь? не забыл ещё что такое синусы, косинусы?
например навскидку можно сделать так. натянуть квадратную координатную сетку на полусферу ололо. чтобы такое написать не надо быть умным, достаточно не быть тупым.
https://mega.nz/file/48l3EbrL#1ftsSfIyVRrakMl05AKoZJoBMUWiZCnX7KLtiy7tgpw
вообще я помню что там можно это сделать нормально и не через жопу чтобы на краях красиво растягивалось, но я не помню как. ну и ладно, может в треде напомнит кто.
а вообще просто открой и почитай
https://en.wikipedia.org/wiki/Spherical_coordinate_system
после кружечки кофе.
а хотя лол я и сам конч. нахуй все эти лерпы, что за хуйню я понаписал. пускай инпут от -1 до 1 лучше будет. так красивей и понятней.
>пчел, твою задачу можно упрощать сколько угодно, но пока ты не воспользуешься своей головой ты не решишь её. у тебя 9 классов образования то уже есть, надеюсь? не забыл ещё что такое синусы, косинусы?
А токсичным уебаном быть обязательно? Не все пердолятся с Юнити также долго как ты, это не повод раздувать такое ЧСВ.
Есть платформа, которая должна отталкивать игрока под углом перпендикулярным платформе, то есть, если платформа под углом 45 градусов, то и игрок будет отталкиваться под этим же углом.
Не подскажете куда копать, чтобы понять как это реализовать?
Поищи на сцене интернет менеджер у него будет настройка с ip, компы также должны быть в одной локальной сети или хост иметь белый ip.
По гайду посмотри официальное от самого фишера. Либо к примеру юнитиковское по интернет обджектам, по сути всё работает +- одинаково.
Есть разные подходы и решения, в том числе бесплатные. Но прежде чем лезть в сетевую игру лучше как минимум посмотреть и разобраться в туторах, и прочитать доки. Лично для себя я сделал сервер арендованный на хостинге, клиенты подключаются, чекаются, у каждого клиента создаётся статик мир, и идёт дальнейшая игра.
Благодарю, так понял с наскока вообще не получится никак))
обязательно. токсичность к месту - способ коммуникации. я плавно перешёл от мистических ротаций к тригонометрии которую ололо в школе проходят и она не требует опыта геймдева.
и да, разумеется у меня есть ответы не требующие тригонометрии, но давая их я буду ещё токсичней.
>>02866
лол а как ты узнаешь о наличии платформы то. уж наверняка физоном? физон в юнити возвращает НОРМАЛЬ. это то что тебя интересует.
https://docs.unity3d.com/ScriptReference/RaycastHit-normal.html
Проблема в том, что при разном ФПС враг убивается с разной скоростью. Есть идеи как работать с частицами "фреймонезависимо" ? Пробовал FixedUpdate и ParticleSystem.Simulate, не помогает.
Может реализовать механику урона по другому?
>Использую частицы в игре (струю из частиц), у частицы в скрипте количество наносимого урона и функция коллизии с врагом.
Ты там каждую частицу триггрешь на урон? Совсем не умный?
Вот представь если у тебя огонь состоит из 1000 частиц при коллизии с противником одновременно может сработать от десятка до сотни частиц и в апдейте возникнут сотни сообщений о попадании, как думаешь фпс в таком намного понизится или не изменится?
Делай один триггер с огнём и не выпендривайся.
несколько путей, либо ты имеешь подписку во вьюшке игрока OnCollisionStay и в нужный кадр получаешь нормаль коллизии, либо юзаешь систему с SphereCastNonAlloc, с ограничениями по маске, которая запускается по триггеру, находит нужный RaycastHit и берет его нормаль. Второй способ предпочтительнее, так как не аллоцирует
По порядку.
Ты конвас выбрал?
Правильно привязал эти кнопки?
Разрешение я надеюсь ты выбрал фиксированное, а не как ёбанный даун со свободным разрешение пилишь UI элементы?!
на канвасе вот такие настройки, мэтч убавил в 0 и всё пофиксилось, пиздец просто
Согласен, способ очень плохой.
Пытаюсь сделать что-то похожее на миниигру как на первом видео, думал как это лучше реализовать, в голову пришло только пускать частицы с навешенным скриптом нанесения урона и функцией коллизии.
А как это сделать лучше? Может пускать какую-то кривую из рейкаста или ещё что-то? Хотелось бы конечно чтобы партикли были чисто визуальным эффектом
1040x746, 0:07
вот это видео. пускать струю желтой жидкости в водолазов пока она не залепит им глаза!!!
лол ну а как ещё кроме как пускания рэйкаста. если хочешь чтобы он был кривой просто пусти несколько подряд. ничего не мешает тебе пустить рэйкаст на небольшую длину, запомнить где он закончился и пустить оттуда следующий в цепочке плюс гравитация.
>>03187 (Del)
Блять, так вот на что эта проститутка жаловалась, а пишет про первый аргумент почему-то. Всё-таки статика зло. Спасибо.
Ответь еще на вопросик, а то чёт гугл хуйню выдаёт. Я не хочу создавать новый вектор, а просто засунуть отсылку к уже существующему вектору в перменную, как это сделать?
> Ответь еще на вопросик, а то чёт гугл хуйню выдаёт. Я не хочу создавать новый вектор, а просто засунуть отсылку к уже существующему вектору в перменную, как это сделать?
Покажи код, куда ты это хочешь сделать.
да собственно никак. структуру можно передать по ссылке в метод через ref кейворд и пожалуй все. если тебе понадобилась ссылка на структуру, то что-то ты таки делаешь не так.
Альтернативный вариант создать хэш-таблицу с вектором и дистанцей и остортировать её по дистанциям. Но по-моему это оверкилл? Я просто хотел пройтись циклом по списку, и сохранять отсылку на вектор с минимальной дистанцией.
не парсо. "создание" структуры и работа с ней быстрее чем создания объекта и разыменование указателей.
List<Vector3> positions = ...;
positions.Select(i => new { pos = i, sqrDist = i.SqrMagnitude }).Min(i => i.sqrDist).pos;
не помню сходу как SqrMagnitude пишется, уточни. суть в том что корень операция трудоемкая и его желательно избегать, для подобной задачи достаточно квадрата расстояния.
если у тебя там трансформ(ну т.е. задача найти ближайший объект по их позиции) а не просто вектор то делай список трансформов
чуть проебался да
var position = transform.position;
var transforms = new List<Transform>();
var closest = Select(i => new { transform = i, sqrDist = (position -i.position).SqrMagnitude }).Min(i => i.sqrDist).pos;
если нужен список для дальнейшего использования вместо Min сделай ToList() (а то и Sort(i => i.sqrDist).ToList() - тогда первый будет ближайшим)
зы. linq - страшная штука, главное не увлекаться
>SqrMagnitude
>If you only need to compare magnitudes of some vectors, you can compare squared magnitudes of them using sqrMagnitude (computing squared magnitudes is faster).
Всё, нашёл в документации сам
ибо не возводить в квадрат а не брать корень.
формула расстояния sqrt((a.x - b.x)^2 + (a.y - b.y)^2 + (a.z - b.z)^2)
>формула расстояния sqrt((a.x - b.x)^2 + (a.y - b.y)^2 + (a.z - b.z)^2)
Так вот зачем Ирина Ивановна нам эту хуйню на геометрии преподавала, сука тупая, могла бы и сказал что в разработке игор пригодится
>sqrDist = (position -i.position).SqrMagnitude
На это ругается
> cannot assign method group to anonymous type property
Как фиксить? Уже дохуя чего перепробовал.
Хочу ебашить адовые видосы, можно ли это делать в юнити (насколько я понял, там всё через синемашину) и не будет ли это попыткой сожрать кактус? Или мне уебывать в другой софт? Допустим, что все нужные ассеты у меня есть, а я хочу из этого сделать "катсцену". Только катсцену, без самой игры.
На фотореализм строго похуй.
Це свойство. Захакал вот так. Это норм практика?
>Select(i => new { transform = i, sqrDist = Vector3.SqrMagnitude(position -i.position) }).Min(i => i.sqrDist).pos
Теперь сижу пержу почему выдаёт флоат значение, расчехлил дебаггер, и пока не вкуриваю, но вернусь к вопросу только вечером. Спасибо.
Select формирует последовательность значений анонимного типа трансформ/расстояние
Min берет из данной последовательности минимальное значение по указанному параметру(расстоянию)
от него ты уже берешь свойство.
по сути эта строчка синтаксический сахар для
private class _temp
{
public Transform transform { get; set; }
public float sqrDist { get; set; }
}
Transform FindMinDist(List<Transform> transforms, Vector3 postition)
{
_temp min = null;
foreach (var i in transforms)
{
// .Select
var next = new _temp {transform = i, sqrDist = Vector3.SqrMagnitude(postition - i.position)};
// .Min
if (min == null || next.sqrDist < min.sqrDist)
next = min;
}
//.transform
return min?.transform;
}
мы не пишем отдельную функцию для единственного действия и не заводим под него вспомогательный тип.
да. это уже что бы совсем чистый код, иначе если пустой список выдаст нре(в линкью запросе тоже, так как нету ?)
Понял, спасибо.
я слишком стар для этого вашего визуального окнодроча. хотя смог вдуплить шейдеры только благодаря ему
цель - двигать объект к точке
система которая считает в какую сторону двигать
система которая применяет модификаторы скорости
система которая проверяет не дошли ли и "обрезает" вектор если таки да, что бы не перескочить цель.
система которая таки двигает объект
не бойтесь создавать "лишние" системы на каждый пук, говорили они, сначала в глазах рябит а потом приходит понимание что можно вклинится в любую точку между системами и добавить новый функционал не трогая старый.
Короче кому не насрать, я заебался искать почему то линк выражение мне выдавало хуйню и переписал в пикрил, и так как мне это всё нужно было чисто чтобы протестировать кое-что, я своего добился и иду дальше. В чём я не прав?
Если всё устраивает то ок. Но в реальных проектах за такое уебут в лицо и обоссут.
Да я индюк-одиночка, но конечно красиво кодить всё равно хочется, да.
ну собсно обычный поиск минимума.
небольшой нюанс. не делай ToList() по таргетам. просто убери его - все будет работать так же, но не будет лишнего выделения памяти и итерации по списку. селект создает запрос но не выполняет его. т.е. прохода по списку не происходит. тулист его таки "выполняет". имеет смысл если ты этот отфильтрованный список потом используешь более одного раза, что бы не ходить по полному списку каждый раз.
>юзает SqrMagnitude ЧТОБ БЫСТРА БЫЛО ОПТИМИЗОН
>тут же юзает Linq
>тут же юзает foreach с листом
Ты долбоеб кстати.
> >тут же юзает Linq
Если без тулиста, то ваще поебать же, там нечему много памяти аллоцировать и ебать гц, а сама скорость выполнения вряд станет даже малейшей проблемой на практике.
Я тут прогуглил, может он к тому что форич менее оптимизонный чем обычный фор. Тогда можно упороться и вмесо листа массив юзать еще.
Там тот же массив внутри, при проходе проц также в кеш подгрузит следующие элементы по идее, ну это если у нас не референсные типы само собой.
Массив то массив, но судя по всему если я задам больше 4 элементов, то он начнёт затратный алгоритм ресайза.
Ну тогда да, но я явно так не делаю
В курсе что лист отличается от массива и фор с листом работает в 2 раза медленнее чем фор с массивом?
и воопше на асемблере писать надо! а лучше сразу машинными кодами, что бы экономить на времени компиляции
Нихуя, каким образом массив проебал листу, если лист это массив по сути?
ебать тупнул, ещё и думаю, хули так долго то. Но теперь чёт не то, походу
держите
Скорее всего, такая хуйня, потому что в foreach для листа IL разворачивает диспоуз после цикла
Я выбрал Юнити именно потому что у него репутация движка, который позволяет не самым сильным программистам типа меня криво, косо, через жопу, но реализовать, пускай и лагающую, но игру, которая даже может выстрелить за счёт уникального геймплея. В чём я не прав?
во всём прав и не ебёт, что думают с++петухи со своими указателями на указатели указывающие на void
Пока ты так думаешь - никогда не сможешь его сделать.
лол, довн, геймплей - это совокупность механик, таким образом почти любая игра уникальна геймлеем
Уникальных механик не существует, также не существует уникальной совокупности механик.
Что то хуйня, что это, стоимость по производительности примерно равна 0. Сделай теперь больше элементов и какие-нибудь реалистичные операции над каждым элементом, чтобы не тупа проход был.
Ну или я сам сделаю как освобожусь нах.
>Уникальных механик не существует, также не существует уникальной совокупности механик.
Долбоёб? Когда впервые появился тот же Портал у него что ли не уникальная механика порталов была?
Бля, да он наверное из тех, кто говорит "все сюжеты были написаны ещё в античности"
>уникальная механика порталов
Я в эти порталы еще в 2000 году лазил чтоб хилки у акары закупать, ебать ты дура пориджевая.
Хуесос ты всерьез не различаешь портал который тупо локацию меняет с порталом, который буквально имитирует неевклидовое пространство?
Фактически та же смена локации, не более. И за 8 лет от выхода кваки 3 до выхода портала никто так и не понял всего потенциала этой идеи.
>Фактически та же смена локации, не более
А в портале что? Кроме своей жопы еще можно куб протолкнуть? Смена локации куба, гениальная механика, новое слово в жанре.
Ну не толсти. Эта механика оказалась настолько плодородной, породила кучу способов применения и множество головоломок, что хватило на 2 серии и несколько фанатских дополнений.
Вроде уникальность обсуждали, а не количество серий и дополнений. Давай количество серий кал оф дути подсчитаем, или атсасина. Видимо их механика оказалась гораздо плодороднее тухлых порталов.
сделал такое, но всё равно все эти тесты хуйня, потому что нужно рассматривать каждый отдельный случай (предполагается ли динамика, известны ли размеры заранее, будут использоваться ссылочные или значимые типы и т.д)
[Benchmark]
public void ListFor()
{
List<int> list = new List<int>(1000);
for (var index = 0; index < list.Capacity; index++)
{
list.Add(10);
list[index] += index;
}
int sum = 0;
foreach (var i in list)
{
sum += i;
}
Console.WriteLine(sum);
}
[Benchmark]
public void ArrayFor()
{
int[] array = new int[1000];
int sum = 0;
for (var index = 0; index < array.Length; index++)
{
array[index] = 10;
array[index] += index;
sum += array[index];
}
Console.WriteLine(sum);
}
[Benchmark]
public void ListForeach()
{
List<int> list = new List<int>(1000);
for (var index = 0; index < list.Capacity; index++)
{
list.Add(10);
list[index] += index;
}
int sum = 0;
foreach (var i in list)
{
sum += i;
}
Console.WriteLine(sum);
}
[Benchmark]
public void ArrayForeach()
{
int[] array = new int[1000];
for (var index = 0; index < array.Length; index++)
{
array[index] = 10;
array[index] += index;
}
int sum = 0;
foreach (var i in array)
{
sum += i;
}
Console.WriteLine(sum);
}
сделал такое, но всё равно все эти тесты хуйня, потому что нужно рассматривать каждый отдельный случай (предполагается ли динамика, известны ли размеры заранее, будут использоваться ссылочные или значимые типы и т.д)
[Benchmark]
public void ListFor()
{
List<int> list = new List<int>(1000);
for (var index = 0; index < list.Capacity; index++)
{
list.Add(10);
list[index] += index;
}
int sum = 0;
foreach (var i in list)
{
sum += i;
}
Console.WriteLine(sum);
}
[Benchmark]
public void ArrayFor()
{
int[] array = new int[1000];
int sum = 0;
for (var index = 0; index < array.Length; index++)
{
array[index] = 10;
array[index] += index;
sum += array[index];
}
Console.WriteLine(sum);
}
[Benchmark]
public void ListForeach()
{
List<int> list = new List<int>(1000);
for (var index = 0; index < list.Capacity; index++)
{
list.Add(10);
list[index] += index;
}
int sum = 0;
foreach (var i in list)
{
sum += i;
}
Console.WriteLine(sum);
}
[Benchmark]
public void ArrayForeach()
{
int[] array = new int[1000];
for (var index = 0; index < array.Length; index++)
{
array[index] = 10;
array[index] += index;
}
int sum = 0;
foreach (var i in array)
{
sum += i;
}
Console.WriteLine(sum);
}
первый метод не тот скопировал
public void ListFor()
{
int sum = 0;
List<int> list = new List<int>(1000);
for (var index = 0; index < list.Capacity; index++)
{
list.Add(10);
list[index] += index;
sum += list[index];
}
Console.WriteLine(sum);
}
так уже, просто самому стало интересно, насколько леоесц, который я чаще всего использую для логики, оправдано юзается с форычем
Скажем так - глубоко похер пока сложность этой операции О(1). будет иметь смысл если у тебя глубина вложения циклов уходит к земному ядру. Если уж совсем хочешь упоротся в производительность и заодно остаться на екс - переходи на дотс. Они как раз большой апдейт запилили, почти релиз кандидат. И дело не в апдейте а в базовой заточке на многопоточность и низкоуровневую оптимизацию.
>глубина вложения циклов
Простое правило - если тебе требуется больше двух, то ты скорее всего хуйню делаешь, и даже с двумя хорошенько подумай и полистай существующие алгоритмы, потому что есть шанс того что ты сейчас захуяришь квадратичный алгоритм, когда уже давно придумали логарифмичный для тех же целей.
Ну я приблизительно это и имел в виду.
а что в дотс поменяли, кстати? там екс чтоли на финишную прямую выходит? или более полезные хуйни? не трогал их год
> там екс чтоли на финишную прямую выходит?
+ убрали зоопарк базовых систем и джобов. оставили только базовые IJobEntity и SystemBase которые могут все, что могли старые по отдельности
+ добавили "вариадик апдейт" системы, которым можно выставить время апдейта напрямую или до окончания джобов. ну т.е. туда можно загонять долгоиграющие асинхронные задачи.
+ расширили поддержку редактора. галочка "конверт ту энтити" вместо соответвующего мб, лучшая поддержка префабов, интерфейс где можно смотреть и менять энтити как го в рантайме, дебаг систем с отключением и пофреймовым выполнением, профайлер под дотс и прочая по мелочи.
- убрали анимации и звук до версии 0.51 (эта 0.50)
зы. на отквоченное так и не ответил, за 0.51 уже планируется как релиз кандидат.
спасибо за пересказ. хуёво что не добавили до сих пор анимации и звук, конечно. вот про префабы интересно стало, надо будет глянуть. я раньше своей хуйни городил в скриптабл обжектах для того чтобы связывать префабы и ентити, но теперь оно видимо само как-то умеет это делать?
интересно не добавляли ли больше фич с DynamicBuffer и многопоточностью. мои предыдущие попытки сделать инвентарь на екс работающий в многопотоке превращались в какой-то пидец.
> предполагается ли динамика, известны ли размеры заранее, будут использоваться ссылочные или значимые типы и т.д
Поебать же вообще, во всех сценариях поведение абсолютно одинаковое будет, вся разница листа только в том, что это тот же массив с оберткой сверху и с подготовленными функциями для удобства, и в случае с фор ич дополнительнач аллокация под иенумератор(так ведь?), но эт хуйня. Как мы видим - оно всё ваще почти ничего не стоит.
ну, да, функции для удобства, в том числе увеличение объёма при переполнении, с массивом придётся такое писать самому, плюс существуют IReadOnlyList, которые при доступе к чтению не дают так же и воздействовать на элементы, в отличие от обычного листа и массива, но на этапе рефакторинга проще подставить ридонлилист вместо листа, чем вместо массива
> но на этапе рефакторинга проще подставить ридонлилист вместо листа, чем вместо массива
Не пон. Ридонли лист же нужен ток для инкапсуляции, и скорее всего ты изначально когда классв проектируешь - понимаешь к чему должен быть доступ извне, а к чему нет
по опыту могу сказать, что есть те, кто с опытом 1+ года работы с c# не слышали про ридонли листы вообще и думают, что readonly List<> сам по себе обеспечивает безопасность листа, ну и, бывают разные случаи, не у всех есть опыт сразу что-то на этапе проектирования предусмотреть
Сап юнитач посоветуй годный тутор по созданию, сттатичекского и динамического тумана войны?
Яндекс выдаёт или старые туторы со старыми версия юнити или такую дичь за которую личне мне было бы стыдно.
https://yandex.ru/search/?clid=2285101&text=Unity+fog+of+war&lr=39
Я смог сделать туман войны только для 2д и выглядит он не совсем.
Работаю не забесплатно, но первые пару звуков могу сделать безвозмездно, чтобы у тебя сложилось понимание о том чего от меня ждать. Потом либо договариваемся либо желаем друг другу удачи и интересных проектов
А портфолио есть чтобы я примерно прикинул что ты можешь не нагружая тебя почём зря?
Да! Вот фрагмент портфолио, саунд редизайн катсцен из Dark Souls 3. https://www74.zippyshare.com/v/431YTOch/file.html
Опыт работы со звуком 7 лет, большую часть в музыкальной сфере, год в сфере кино и вот последний год в геймдеве
https://www.youtube.com/watch?v=GaNVrRRdqbY
Как мне растянуть текстуру, сверху, чтобы была как бы крышка, а то меш виден изнутри
никак, юнити тебе не 3д редактор, чтобы уметь в полигоны, можешь попробовать юзать клипер с дополнительным объектом в виде своей "крышки"
Ну есть же всякие геометрические шейдеры, они разве на такое не способны?
Спасибо
Еще погугли, когда-то давно юзал такой который сам залеплял дырки, название уже не помню.
Понял, спасибо.
ноуп, ну можешь на почту написать
По идее есть опция бесшовного переключения на заданную картинку после видео. Видел в других движках.
Это что ты реализовал? Что за велосипед? Уверен что до тебя это уже не сделали более элегантно?
288x176, 0:03
спрайтовую анимацию на шейдерах в экс
Делай игры для души а не за деньги.
как же повезло, что гейбушка максимально сторонится политоты и продолжает выплачивать
Ну, он лично не запрещал, да. Его заставили. От этого не легче.
Похоже не хватает градиента при переходе в туман
У меня есть объект со скриптом. Если я переменную задаю в скрипте (допустим значение 1), а потом ее же в самом юнити в свойствах объекта (допустим значение 10), то в итоге используется значение 10. Это типа так и нужно? То что руками вбил в свойствах имеет бОльший приоритет? Я думал при запуске должно из скрипта подтягиваться.
это значение по-умолчанию. т.е. оно появляется когда ты только вешаешь скрипт на объект. на уже существующем сохраняются те что наменял в инспекторе.
В том что в него встроен нормальный язык программирования. Одного этого пункта достаточно чтоб даже не смотреть в сторону нереального кала.
Лапшетаскатели только рассказывают какие плюсы охуенные, но пользуются исключительно блюпринтами.
Анон, если ты в таком же лимбо - просто возьми и начни. Ты охуеешь как бесполезны все эти курсы, если ты не делаешь шаблонное говно. Как только появляются нестандартные задачи сперва теряешься, но потом через упорство и гуглинг, просмтр документации и роликов находишь решение, меняешь его под себя и начинаешь по-настоящему знакомиться с движком. Охуенно, жаль что не начал раньше.
>и начинаешь по-настоящему
Не забудь подсчитать сколько раз будешь НАЧИНАТЬ прежде чем сделаешь законченную игру.
Да похуй, я рад что уже хотя бы ставлю сам себе задачи и решу их решения и набиваю опыт в юнитях. Я морально готов к тому что моё виденье окажется говном и я начну делать что-то другое. Но пока за месяц я только убеждался в том что оно верное и самое главное - исполнимое.
йоуу.. забей. лучше усыпи малого. земля пухом пупсику
если это реально ускоряет разработку - то да, но я эту хуету даже не тестил, боюсь
отличный язык. очень гибкий и многофункциональный. есть одна маленькая проблема за полвека развития он оброс таким диким количеством костылей, костылей к костылям и странных основанных на давно забытых концепциях решений что выучить и использовать его нормально весьма и весьма проблематично. т.е. вместо разработки 3/4 времени будет уходить на борьбу с синтаксисом, непонятными ошибками и попытками разобраться что нахуеверченно в трехэтажных шаблонах стандартных библиотек.
ах да и синтаксис. в виду того что все новые фичи громоздились сверху старательно сохраняя старые для совместимости, тест программы состоит процентов на 90 из знаков пунктуации, каждый под свою задачу. вот даже банальное взятие поля у классы может выглядить как var.field, var->field, var::field в самых простейших случаях. а если начинаться закапываться в указатели то все ухудшается все быстрее и быстрее
>Можно ли будет переманить туда человека, которые знает c# и паттерны на уровне бога?
Нельзя, потому что это по сути то же программирование, которое уступает в плотности расположения информации коду, ибо часто то что можно описать одной-двумя строчками там требует йоба-конструкции на весь экран.
Наоборот это потенциальный инструмент для заманивания нюфаков в программирование.
>вместо разработки 3/4 времени будет уходить на борьбу с синтаксисом, непонятными ошибками и попытками разобраться что нахуеверченно в трехэтажных шаблонах стандартных библиотек.
Это называется знакомство с языком, по первой так в любом языке будет. На за какой язык нельзя сесть и начать хуярить как на родном.
ну да. проблемма в том что для крестов этот "период знакомства" затянется на годы, а за это время выйдет еще пара стандартов которые добавят еще костылей на изучение которых понадобится новый "период знакомства"
Тебе же не нужно взять весь язык, а только весьма ограниченный набор для разработки твоей игры, узнавать новый будешь по мере появления надобности в новых фичах.
в крестах? где столько способов выстрелить себе в ногу?
>Или это отмычка для людей с непрограммистким уровнем мышления?
Таскание лапши отличается от написания кода ручками только визуально, ну и по времени - пока ВИЗУАЛЬНЫЙ ПРОГРАММИСТ ищет в списке нужные операции для вычисления выражения 2 + 2, обычный уже половину игры напишет.
Визуал скриптинг удобен когда нужна наглядность - например в редакторах шейдеров, правда из лапши обычно жуткое говно генерируется.
Ну то, что нагенерилось и переписать не проблема. Для шейдеров удобна именно визуализация, ибо работаем с визуальной информацией. Можно посмотреть результат на каждом шагу сразу, без чего отладка шейдера довольно муторный процесс. С кодом же этот аргумент не работает.
Какой рендер использовать, URP или стандартный? Где лучше производительность?
Потому что он теперь стандартный, юнитеки сами советуют им пользоваться. Вообще если планируешь играться с шейдерами, то юрп тебе точно нужен будет.
Только вывезут ли слабые девайсы такое? Скажем, где без УРП 20 фпс, будет ли с УРП те же 20?
Учитывая что УРП тебе просто даёт более широкие настройки, ты всё еще сможешь сделать для более слабых девайсов настройки попроще.
>>04209
Да поебать на указатели, дженерики в крестах - это просто кошмар, если бы они были адекватные, то язык был бы юзабелен.
Ну и бонусом - отсутствие вменяемой документации внутри кода и совершенно конченный стл, который ты должен заучить, чтобы адекватно использовать.
А вот в шарпе вообще поебать, ебалом по клаве ударил, и иде тебе сразу варианты подкидывает, все хорошо проименовано, у всего описание написано, вот тебе словарь, вот тебе хешсет...
Ну и что очень важно - в шарпе куча новых удобных фишек, с которыми писать код просто кайф, язык длч людей короче
Найс, ты же надеюсь инстансишь все дубли и массивы повторяющихся объектов, а не кнтр+с и кнтр+в?
Что-то да, что-то нет. В идеале редактор должен сканировать папку с ассетами и добавлять различные элементы спрайта персонажа автоматически. Чтобы потом безболезненно добавлять новые элементы, аксессуары и тп.
вроде вот ещё топовые
https://assetstore.unity.com/packages/tools/ai/a-pathfinding-project-pro-87744
https://assetstore.unity.com/packages/tools/utilities/easy-save-the-complete-save-data-serialization-system-768
https://assetstore.unity.com/packages/tools/particles-effects/highlight-plus-134149
Благо дарю
UnityScript же не поддерживается вроде, не?
Нет, уже какое-то время.
Лет 5 как не поддерживается.
я юнити никогда в жизни не открывал, но может там просто сравнивается направление и координаты аквалангиста, и если они соотносятся (струя попадает) то у аквалангиста просто переменная увеличивается и графон ему очки покрашивает?
И можно ли в нем генерить фоны для экономии на художнике?
Вон, написано что SpeedTree позволяет создавать ландшафты (я так понимюа 3Дшные).
Такой ландшафт - это по сути трехмерный фон?
Смотря что у тебя в новелле будет, но я бы взял rpg maker(в основном на нем делают) или gamemaker(хотя, наверное, нет разница с юнити).
Проще всего на первом будет. Если цель - тупо визуальная новелла, мне кажется, нет смысл юнити брать
Ну можешь скрипт на это сделать. Проще всего - просветить луч из камеры в курсор(или мочу) и треггирить коллижн
>Как я понимаю, есть отличия от того, что было в 2019
В самих шейдерах отличий нет, возможно есть разница в инструментах типа редактора шейдеров. Тебе надо учить сами шейдеры, их будешь делать ты а не редактор.
Спасибо. У меня была такая проблема: в 19 (старше, не помню) студии написал мелкий шейдер. Но когда пытался перенести его в 21, то ничего норм не работало, ибо как-то по-другому юнити начала работать с шейдерами.
Что это значит? Может быть такое, что начал использоваться другой(высокоуровневый) язык, который все равно компилится синтаксис, на котором работают шейдеры? (по какоу коррктному названию гуглить?)
Ну возможно ты в 2022 создавал проект не на стандартном рендере как в 2019, а в URP или HDRP, там действительно разница есть. У стандартного (Built in) рендера давно ничего не менялось.
Спасибо!
Есть смысл отдельно в HDRP вникать или нужно после того, как просто с шейдерами понятнее станет?
Лучше сначала на стандарном рендере подрочиться, он проще. В новых рендер пайплайнах свои приколы, туда опытные то не спешат перекатываться. Тебе как новичку надо для начала просто основы понять.
Можешь это покурить, тут с картинками
https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html
https://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html
Спасибо большое!
Есть еще доступ к курсу https://www.udemy.com/course/unity-shaders/,
видимо, его буду тыкать
Если у тебя новела с уймой мини игр, то стоит подумать о юнити, если сорт читалки, то бери ренпи и не выпендривайся.
Но в ренпай можно же характеристик вести и предметы сохранять?
И отношения фракций еще. Короче, тупо переменные и массивы.
В доки доки играл? Там на чистом пайтоне всё что угодно закодить можно, вплоть до удаления файлов девочек из ревности другой девочки.
История такая: я раньше работал только на game maker studio ну и тыкал pygame. Меня убедили, что это детсад и надо переходить на юнити. Вот сажусь сегодня, смотрю туториалы и меня всё больше накрывает волна непонимания. Почему, чтоб просто передвинуть объект я не могу написать "x+=1", а должен мучаться с transform? Что за монстр этот аниматор? Почему я не могу просто сказать, чтоб объект сменил свой спрайтлист на другой, а должен истыкать 100500 кнопочек и чекбоксов в этом аниматоре?
В конце концов, почему я просто не могу нарисовать кодом картинку на экране?
Это я тупой и так реально удобне или что? Или мне попадаются такие туториалы?
Хз как ты там "работал" на гамаке догадываюсь что ни одной игры не сделал, но если написать transform.Translate(1,0,0) это для тебя мучение, то тебе лучше заняться по жизни чем-то другим.
Юнити эт детсад, переходи на анрил
Везде трансформы не только на юнити, это норма.
Вообще полноценный движок тем и отличается, что можешь делать очень многое, но придётся и вникать доого.
> В крестах нет говнодженериков, в крестах охуенные компайл-тайм темплейты
А до компиляции я ебу какие методы в моем классе должны быть, чтобы оно работало?
Вот в шарпе все просто - сразу пишешь в дженерике какие интерфейсы класс должен реализовывать или подтипом чего должен быть и заебись! И в свою очередь, юзая чужой дженерик, сразу видишь, какие интерфейсы твой тип должен реализовывать.
> В шарпе поприятней апи, но не надо драматизировать.
Намного приятнее!
> Что за шизу ты пишешь? Какую документацию напишешь такая и будет.
Ну вот в том же стле ниче не прописано приходится в убогие онлайн доки лезть. Себе то понятно, что я что угодно могу написать.
> Охуеть, поставь современную иде для крестов, например vs code и у тебя будет то же самое.
Ага, только проблема со стилем именования, и опять же - некоторые вещи только в компайл тайме покажет.
И да, я не говорю что на С++ ваще нельзя писать - конечно можно, просто поддержка кода и скорость того, как ты разбираешься с чужим кодом(когда юзаешь какую-нибудь новую библиотеку в том числе) - гораздо меньше, чем в том же C#. А знаменитые костыли крестов заставят ещё переодически проебывать немало количество времени - ньюфагам вообще пизда, а олдам просто нужно лишний раз держать их в голове и отвлекаться от основных задач.
Поэтому, ящитаю С++ оправдан только для развития уже имеющихся проектов на С++, либо там где без него никак(и то я не шарю что там со скалой, растом, и че там ещё с хорошей производительностю есть...), либо тогда, когда надо дохуя программистов набрать(потому что С++еров немало)
К трансформам то я привынуть могу, но вот действительно нет никакого метода нарисовать изображение кодом? Потому что даже сделать такую простую вещь, как отрисовать инвентарь для меня обернулось целым событием
> Почему, чтоб просто передвинуть объект я не могу написать "x+=1", а должен мучаться с transform
Разделение объекта на компоненты это более чем логично.
Там не только "x" есть но локальное х например, а еще ротация и скейл.
А ещё есть RectTransform и там другое.
> В конце концов, почему я просто не могу нарисовать кодом картинку на экране?
>>04983
> но вот действительно нет никакого метода нарисовать изображение кодом? Потому что даже сделать такую простую вещь, как отрисовать инвентарь для меня обернулось целым событием
Можешь, но рисовать картинки кодом - хуета идея почти всегда, тем более для инвентаря. Почему бы готовый ui не использовать, не повесить кнопки с картинками в лейаут какой-нибудь?
Я еще много чего не знаю, потоиу сужу только по тому, с чем столкнулся
Мне не нравится работать с UI по нескольким причинам:
1) куча телодвижений в интерфейсе движка. Приходится истыкать кучу кнопочек, вместо пары строк кода.
2) мне пока непонятно каким образом этот интерфейс можно будет динамически изменять. Хочется легко менять внешний вид интерфейса, количество столбцов на одной странице, их масштаб, расположение и т.д
3) становится сложно ориентироваться в интерфейсе движка из-за такого количества всякого хлама.
> 1) куча телодвижений в интерфейсе движка. Приходится истыкать кучу кнопочек, вместо пары строк кода.
Ну надо покопаться, изучить как оно работает, да
> 2) мне пока непонятно каким образом этот интерфейс можно будет динамически изменять. Хочется легко менять внешний вид интерфейса, количество столбцов на одной странице, их масштаб, расположение и т.д
Лейауты для этого сделаны. Растягиваешь лейаут - и он растягивает и перемещает все внутренние элементы
>Приходится истыкать кучу кнопочек, вместо пары строк кода.
Это какие ты UI парой строк кода писал, "hp: 100"? Так это hello world а не UI.
Примерное понимание есть на уровне: Вот щас фпс упало с 120 до 80 значит плохо. В курсе за кол-во материалов, статику и оклюжен.
Может кто знает где такую инфу нарыть? Как раз знакомому 3дшеру подкину. Понимаю что это больше относится к 3д моделированию, но работаю с ним в юньке.
>xочется легко менять внешний вид интерфейса
>парой строк кода
Эм, даже в упрощённом синтаксисе ренпи у меня ушло на полноценный интерфейс 2к строк кода. В юнити потребуется ещё больше, но это и есть цена управляемости каждого элемента ui.
Уймы параметров разметок, трансформов, анимации, динамичные блоки, разнообразный функционал - всё это требует понимания и отражения в коде.
новый гуй очень не удобен в плане кода. одни рект трансформы чего стоят.
старый гуй делается чисто кодом, но сейчас эти описания только в тулзах редактора используется вроде бы.
Как мне получить список всех активных (галочка в свойствах) объектов определенного типа на сцене?
> В юнити потребуется ещё больше, но это и есть цена управляемости каждого элемента ui.
Нахуя?? Там всё визуально настраивается без кода
Определенного типа? FindObjectsOfType<Тип>().Where(obj => obj.activeSelf).ToArray()
> но делать каждый кадр в Update проверку на расстояние стрёмно
Делай проверку в FixedUpdate. Ничего стрёмного в этом нет. Тем более в юнити уже давно добавили методы проверки, которые не выделяют память.
640x360, 0:10
Так то в киберпанке нормально работали с полигонами.
От этого кислотно контрастного дизайна ассоциации с пикрил наружной рекламой.
Солидарность славянских дизайнеров?
Самое простое и быстрое это vfx. Чуть сложнее это своим шейдером.
Пиши шейдер. Если текстурная развертка у куба подходит можно нацепить на куб второй материал с прозрачной текстурой оранжевого цвета и двигать ее оффсетом (это васянский способ), но у стандартного куда развертка не подходящая.
делой шейдоры, они очень простые, главное вкотится
https://www.youtube.com/watch?v=auglNRLM944
Затем, что ты настолько тупой, что не можешь выучить простейший язык который даже пендосы со средним IQ в 40 поголовно знают
честно хз, быстрый гуглеж выдал статью на хабре как сделать подсветку выделенного объекта(вроде неплохая) и несколько видео
не скажу что бы понил, но судя по всему для параметра, который отвечает за наложение надо брать мировые координаты.
там есть варианты с текстурными(привязаные к uv), локальными(к отдельному мешу) и мировые(не зависимые) тут походу взяты локальные что бы моделька закрашивалась от ног до головы не смотря на то как повернута.
Там оно по дефолту false
осторожнее с прон играми, это пиздец
Hello,
After review, we will not be able to ship your game on Steam. While we strive to ship most titles submitted to us, we found that this title features themes, imagery or descriptions that we won’t distribute.
Regardless of a developer's intentions with their product, we will not distribute content that appears, in our judgment, to depict sexual conduct involving a minor.
While every product submitted is unique, if your product features this representation -- even in a subtle way that could be defined as a "grey area" -- it will be rejected by Steam.
For instance, setting your game in a high-school but declaring your characters are of legal age would fall into that category and be banned.
This app has been banned and cannot be reused. Re-submissions of this app, even with modifications, will not be accepted.
Проследуй нахуй, одебилевший перверт
Да не, видимо, не в этом дело. Меня не положение префаба относительно земли волнует, а то, что префаб не движется вместе с навмешем, движется пустой дочерний объект префаба, на котором навмеш стоит
збыл скрин
На сцене нажми F, камера отъедет так чтоб было видно объект целиком. Это работает на любом объекте и на канвасе тоже.
Сейчас у меня в скриптах активно все, что на скринах, плюс это:
EnemyManager enemyManager;
NavMeshAgent enemyNavMeshAgent;
Rigidbody rb;
[SerializeField] private Transform movingTo;
private void Awake()
{
rb = GetComponentInParent<Rigidbody>();
enemyManager = GetComponentInParent<EnemyManager>();
}
// Update is called once per frame
void Update()
{
enemyManager.enemyNavMeshAgent.destination = movingTo.position;
}
Так я пытаюсь передать управление на навмеш, тупо одна строка на движение, она работает на простом кубе, но не работает на моем префабе (4 скрин). Видимо что-то конфликтует с новым скриптом.
Я не прописывал этот код внутри срипта на первом скрине, потому что destination жалуется на enemyNavMeshAgent, якобы его нет внутри enemyManager. Он там есть, иначе бы не работало вообще ничего с самого начала. Когда новый скрипт добавил на объект с навмешем и обращался к нему, ошибок не возникало, но движется не префаб, а пустой объект. Если не понятно, попробую объяснить что-то еще раз
Советую на ютабе посмотреть, на самом деле там очень просто понимается когда на примере показывается.
rigidbody повесь на родителя, я не уверен, лень проверять, вообще странно ставить агента куда-то в чаилды, если это основной компонент сущности, но ригидбоди обозначает, что объект со всеми его вложениями - единый, поэтому должно работать
Он на родителе. Попробую короче перенести навмеш туда же и переписать обращения к навмешу в скриптах
Вчера на собесе сказал, что мне проще вектор на матрицу поворота-переноса-масштаба умножить или попросту вложить перемещаемый объект в пивот вращения и вращать пивот, а не через кватернион.
кватернионы воопше довольно ебанутая абстрактная хуйня, которую проблематично "понять". но значительно упрощает все расчеты вращений посему широко используется
Что-то я нахуевертил, не понимаю даже что. Переставил навмеш на родителя закомментировал одну строку enemyNavMeshAgent.transform.localPosition = Vector3.zero, которая, как я понимаю, мешает навмешу улететь в ебеня, но сейчас она стала наоборот отправлять префаб в ебеня на координату 0.0.0. Отключил и моб ПОШЕЛ блядь. При том, что я даже не прописал еще за кем ему идти. Он просто пошел по навмешу, как ему положено, избегая препятствия, ища короткий маршрут. Потом я естественно прописал enemyManager.enemyNavMeshAgent.destination = movingTo.position и destination по-прежнему жаловался, что ему надо быть в скрипте на объекте с навмешем, это понятно. Не понятно почему моб идет, если нет скрипта на движение. Очень блядь странно, но работает
А разве не должна .transform.localPosition = Vector3.zero за нулевую координату считать центр объекта, на котором находится?
clampedPositon = Vector3.ClampMagnitude((sharik.position + speed) - kubik.position, 3.0f);
sharik.position = kubik.position + clampedPositon;
Вращение идёт почти как надо, за исключением того что сейчас поворот куба никак не влияет на угол орбиты шарика, мне грубо говоря нужно чтобы центр круга, вокруг которого кружит шарик, всегда смотрел ровно в "ебало" кубу. Пикрил нарисовал как мог.
Раз пять прочитал и у меня вопрос, ты сам-то читал че написал? Шарик вращается вокруг куба, нада шобы круг вокруг которого вращается шарик был ебалом к кубу. Пиздец. Тебе че надо то ебаный икебастос, чтобы орбита шара менялась в зависимости от углов наклона куба чтоли? Еще хуйню какую-то нарисовал.
>Тебе че надо то ебаный икебастос, чтобы орбита шара менялась в зависимости от углов наклона куба чтоли?
Да, вот та же схема вид сверху.
Так получай направление куба и клампом со сглаживанием
поварачивай. Очень похоже по аналогии с синемашин камерой. Вскрой стандартный 3д контроллер от юников, там в коде глянь, уверен то что ты ищешь.
Ну да. Если я хочу, например, прицепить один объект ровно в нулевую координату второго, а че?
фу, какая гадость
Пчел что ты делаешь...
Это реализуется как и любой другой интерфейс: У тебя есть канвас с этим делом. Он включается когда активируешь предмет, и выключается когда заканчиваешь работу с предметом, всё.
Тебе без разницы какие предметы активны, где. У тебя Канвас(UI) отдельный компонент от гейм обжетков.
Так же за это всё дело отвечает какой нибудь менджер работы, куда поступает событие что вот игрок попытался использовать предмет, откроем ему UI. Сами же данные по предмету могут храниться как в нём же и тогда ссылка на него получается при взаимодействие, или же в пулле.
О О П
О
П
> Так же за это всё дело отвечает какой нибудь менджер работы, куда поступает событие что вот игрок попытался использовать предмет, откроем ему UI
У меня вся игра в UI, нет физических обьектов. Все в канвасе. Типа вкладку с печкой закрыл и все обьекты выключены, просчет работы в печке остановлен. Не понимаю как это все залинковать и вынести в невыключаемый обьект и потом присунуть обратно при открытии печки.
Еще раз, в чём проблема иметь отдельный канвас под печку, который будет не зависим от любых других объектов? Ты же в курсе ui и игра это не зависимые друг от друга вещи.
Просчёт и логика у тебя идёт в ядре игры, а не на элементах интерфейса.
Можешь объяснить логику как это работает? Я чёт с этими векторами запутался. Если можешь - с картинками.
А других вариантов нет? В 3д максе помню можно выбирать "тип" Накладывания текстуры, и один из них она просто кидается без привязки к скеллингу тела.
Как вы вообще тогда на прямоугольник равномерную кладку кирпичей делаете?
анрил энжин 5 скачай, может там 3д есть.
>Как вы вообще тогда на прямоугольник равномерную кладку кирпичей делаете?
Текстура должна быть seamless и тогда нормас всё натягивается. Погугли как их делать.
>>06005
Понял в чём моя проблема была. Суть в том что поворачивал шарик я при помощи мышки, а координаты от мышки брал только X и Y, а ось вокруг которой крутится шарик задаётся координатой Z, а так как она всегда была равна нулю, то и хули я удивлялся что при повороте куба шар продолжал наяривать вокруг той же оси.
Работает:
public Text ammoInMag;
public Text reservedAmmo;
Не работает, пишет что нет референса к TextMeshProUGUI:
public TextMeshProUGUI ammoInMag;
public TextMeshProUGUI reservedAmmo;
Стандартный текст от юнити шакалится как шакал. Мне надо, чтобы скрипт сам циферки писал в две строки, патроны регулировал
Компонент текста и текстмешпро это абсолютно разные тексты, не совместимые. Повесь в интерфейсе текстмешовский текст и его уже можно засунуть в поле TextMeshProUGUI, "обычный" текст ты туда не засунешь.
Есть два компонента текста, вот их и спользуй.
У легаси текста это Text.text="Твой текст";
У текстмешпро это TextMeshProUGUI.text="Твой текст";
Я подался в разработку в первую очередь потому что заебался ждать пока кто-то сделает что-то подобное - хочу проверить сложно ли это сделать и каково в это будет играть, потому что в голове это может казаться охуенным, но на деле быть калом. Естественно в тайне имею манямечты что игра продастся миллионами копий, но понимаю что такой исход маловероятен. А вы?
Не знаю>>06415
Я нищий и не хочу работать в техподдержке говна, люблю хорроры, очень не люблю многие теперешние хорроры. Считаю жанр истекает кровью и бьется в припадке, а спрос не падает. Ну а так как я в ужасах люблю упор на атмосферу, думаю лучше вернуть жанр в это направление, но не так, чтобы игрок симулировал ходьбу и смотрел сримеры.
Мое мнение, второй аутласт хорошо балансирует на атмосфере и геймплее, первый как ни странно чуть хуже, но вислблоуер топ по напряжению. Не помню как называлась игра, это было что-то типа браузерного флеша с графоном пс1. Там дядя с гамбургером ехал по лесу на велике куда-то и каждую новую петлю во времени, атмосфера становилась неприятнее в хорошем смысле, а звук так вообще жути нагонял. В бладборне мне очень понравился звук боссов, особенно Паарл — для меня его визги чересчур реальны, мне очень некомфортно от него. Поэтому звук в хорроре играет самую важную роль, визуалом можно пожертвовать, но не в писксель.
Chilla's Art делает хорошие атмосферные хорроры, не сильно геймплейные, как по мне, но на напряжении и саспенсе красиво играет. Развязки вялые, но мне нравятся. Я за агрессию и страх в хоррорах, не только за напряжение.
Бабки, бабки, сука, бабки. Само собой
1184x756, 0:23
Редактор кое-как заработал. Теперь нужно то же самое для одежды делать.
Художник пока деньги не просит, но надолго ли..
Просто ему нравится рисовать голеньких девочек :3
Хотя он и в первом случае не определён. Для одного значения "x" на окружности может быть два значения "y" c разными знаками.
void Reload()
{
if (remainingAmmo >= 40)
{
ammoInMagazine = ammoInMagazine + 40;
remainingAmmo = remainingAmmo - ammoInMagazine;
}
else
{
ammoInMagazine = ammoInMagazine + remainingAmmo;
remainingAmmo = 0;
}
У меня 40 патронов в обойме, 120 с собой. Когда обойма пустеет, перезаряжаюсь и добавляю 40 патронов в обойму. Запас патронов уменьшается на 40, соответственно. Получается уже 40 и 80.
А если у меня 24 патрона в обойме, 120 с собой, я перезаряжаюсь, у меня выходит 64 патрона в обойме, 80 с собой. Само собой мне не надо, чтобы в обойме было больше 40 патронов, а к 24 добавилось лишь 16. Первым делом пришло на ум:
if (ammoInMagazine > 40)
ammoInMagazine = 40;
Но так лишние просто исчезают, а как дать шарпу понять, что у меня есть лишние цифры и мне их надо в другое место — хз. Или может есть что попроще для перезарядки?
Если лень с формулами думать, то сделай пару проверок
Если бы я знал, я бы спрашивал тут?
Ладно, твоя токсичность навела меня на мысль и я додумался таки
void Reload()
{
if (remainingAmmo >= 40 && ammoInMagazine == 0)
{
ammoInMagazine = ammoInMagazine + 40;
remainingAmmo = remainingAmmo - ammoInMagazine;
}
else if (remainingAmmo >= 40 && ammoInMagazine < 40)
{
int extras = 40 - ammoInMagazine;
ammoInMagazine = ammoInMagazine + extras;
remainingAmmo = remainingAmmo - extras;
}
else if (ammoInMagazine < 40 && remainingAmmo < 40 && remainingAmmo != 0)
{
int extras = ammoInMagazine - 40;
ammoInMagazine = ammoInMagazine - extras;
remainingAmmo = remainingAmmo + extras;
if (remainingAmmo <= 0)
remainingAmmo = 0;
}
}
Ладно, твоя токсичность навела меня на мысль и я додумался таки
void Reload()
{
if (remainingAmmo >= 40 && ammoInMagazine == 0)
{
ammoInMagazine = ammoInMagazine + 40;
remainingAmmo = remainingAmmo - ammoInMagazine;
}
else if (remainingAmmo >= 40 && ammoInMagazine < 40)
{
int extras = 40 - ammoInMagazine;
ammoInMagazine = ammoInMagazine + extras;
remainingAmmo = remainingAmmo - extras;
}
else if (ammoInMagazine < 40 && remainingAmmo < 40 && remainingAmmo != 0)
{
int extras = ammoInMagazine - 40;
ammoInMagazine = ammoInMagazine - extras;
remainingAmmo = remainingAmmo + extras;
if (remainingAmmo <= 0)
remainingAmmo = 0;
}
}
Этой мой уровень, по-другому не умею еще
Какую-то залупу нагородил. У тебя половина условий дублируется. Нахуй тебе отдельный иф на ноль и не ноль патронов, если блок когда 40- остатки обоабатывает обе ситуации?
У меня появляется отрицательное число патронов и при перезарядке оно добавляет еще 40 патронов в обойму
Откуда у тебя появляется отрицательное число, если ты из максимального количество в обойме должен вычесть текущее, откуда у тебя там минус может быть лол, если текущее максимум равно максимальному?
Раз в год и палка стреляет.
Чел ты видимо не понял. У тебя про первый иф спрашиваю и следующий за ним елсе иф. Зачем тебе отдельныц иф для 0 патронов в обойме, если код добавить к лбойме разницу между максимальным значением и текущем обрабатввает оба результата?
Как ты собрался игры делать когда не можешь в голове прикинуть все нужные проверки логические для банальной перезарядки оружия?
Да и вообще, зарядить патроны в минус, а потом сделать вид что такого не было и вывести все в ноль это конечно не нормально.
Вместо этого должен быть код, который сравнивает количество недостающих патронов в магазине, с количеством оставшихся в кармане и если последних меньше прибавлять к магазину это меньшее число и не будет у тебя минусов, а код обработки отрицательных чисел твой немного обкакунькался
Корень из(1-0.78x0.78)
Потому что 0.78 это косинус по определению, а синус квадрат + косинус квадрат =1
Это оказалось тяжело, но я попытался упростить скрипт насколько мог:
void Reload()
{
if (ammoInMagazine < 40 && remainingAmmo >= 40)
{
int extras = 40 - ammoInMagazine;
ammoInMagazine = ammoInMagazine + extras;
remainingAmmo = remainingAmmo - extras;
}
else if (ammoInMagazine < 40 && remainingAmmo < 40)
{
int extras = 40 - ammoInMagazine;
if ((remainingAmmo - extras) > 0)
{
remainingAmmo = remainingAmmo - extras;
ammoInMagazine = ammoInMagazine + extras;
}
else
{
ammoInMagazine = ammoInMagazine + remainingAmmo;
remainingAmmo = remainingAmmo - (extras + (remainingAmmo - extras));
}
}
Это оказалось тяжело, но я попытался упростить скрипт насколько мог:
void Reload()
{
if (ammoInMagazine < 40 && remainingAmmo >= 40)
{
int extras = 40 - ammoInMagazine;
ammoInMagazine = ammoInMagazine + extras;
remainingAmmo = remainingAmmo - extras;
}
else if (ammoInMagazine < 40 && remainingAmmo < 40)
{
int extras = 40 - ammoInMagazine;
if ((remainingAmmo - extras) > 0)
{
remainingAmmo = remainingAmmo - extras;
ammoInMagazine = ammoInMagazine + extras;
}
else
{
ammoInMagazine = ammoInMagazine + remainingAmmo;
remainingAmmo = remainingAmmo - (extras + (remainingAmmo - extras));
}
}
>код, который сравнивает количество недостающих патронов в магазине, с количеством оставшихся в кармане и если последних меньше прибавлять к магазину это меньшее число и не будет у тебя минусов
Все по канонам, че не так? Патроны в обойме и кармане сравниваются, разница вычитается из кармана в обойму, отрицалова больше нет, нулей нет
void Reload()
{
if (_ammoInMagazine >= _magazineCapacity || _remainingAmmo <= 0) return;
int ammoTransfer = Math.Clamp(_magazineCapacity - _ammoInMagazine, 0, _remainingAmmo >= _magazineCapacity ? _magazineCapacity : _remainingAmmo);
_ammoInMagazine += ammoTransfer;
_remainingAmmo -= ammoTransfer;
}
Брат, братан, братишка.... У тебя 3 переменные. Максимальное количество патронов в магазине, текущее количество патронов в магазине, количество патронов в кармане. Из максимального количества в магазине вычитаешь текущее. Записываешь это число в новую переменную. Затем сравниваешь его с количеством патронов в кармане и если их хватает, то к патронам в магазине плюсуешь это число и вычитаешь из патронов в кармане. Если оно больше чем патронов в кармане, то эту переменная равна оставшимся в кармане, плюсыешь ее к патронам в магазине, а в кармане будет 0. Что ты там нахуевертил больше 40 меньше 40?
>Math.Clamp
Насколько эффективна эта операция? Просто если его иф-конструкция работает быстрее этой хрени это будет смешно.
Если это тонкота то моё почтение. Если ты просто дебил то попробую тебя заверить что по сравнению со всем остальным юнитиговном просирающимся каждый кадр какой-то сраный кламп в функции релоад если что-то и нагружет, то только твою мамашу проститутку дополнительной работой.
Я смотрю ты настоящий юнити-разработчик, щедро раскидываешь функции из библиотек словно хлебороб при посеве, ведь хули, тут одна функция ничего не сделает, там ничего не сделает, повторить N раз и игра лагает, ну и хуй с ней, не разбираться же в каждом таком вызове функции, пускай лагает, для юнити это норма.
Двачую этого >>06727 господина. Так и быть для тебя разжую. Бог дал тебе юнити и мозг самому затестить, но тебе лень. Ты можешь засунуть всю свою игру в апдейт и даже это не будет её просаживать.
Основные траблы которы жрут цп и гцп - Это графика и физика.
Твой говно код, если уж совсем не крутит какие то невообразимые создания и чеки массивов в апдейте просаживает общую кпд ну максимум на 5-10%, это прям макс.
Конечно если у тебя становится сотни объектов где у них в апдейтах что-то крутится, то да уже надо оптимизировать, но это уже другая история.
Я вижу ты настоящий долбоеб, если собрался оптимизировать процедуру которая будет вызываться в худшем случае раз в n секунд, и то если ты клон кримсонленда собрался делать. Кстати вызов Reload() сам по себе ТОРМОЗИТ, так что его надо инлайном делать.
Тебя никто ничего не просил и не попросит, так как ты ни один собес с такими познаниями не пройдешь. Вообще хочется представить ебало мамкиного оптимизатора который в юнити на шарпе вычисляет расстояния в квадрате ЧТОБ БЫСТРА БЫЛО. Наверное он в шейдерах тоже меняет клампы на ифы.
Нормально ты их попустил лол. По делу, так сказать.
Ты судя по всему еще ни один собес не прошёл если думаешь что там самое главное это знания, лол.
Да ты никуда судя по всему не собираешься устраиваться. Джуном можно устроиться будучи практически нулевым, говорю с опыта.
Сейчас пошел второй месяц как я изучаю основы движка на примере различных Microgames, иду полностью по обучалке learn unity и как я понимаю, то там второй этап уже будет непосредственно завязан на кодинге C#? Как он там, толковый или же С# нужно будет отдельно на сторонних ресурсах дрочить, на learn unity огрызок будет? Как вообще оцениваете все эти Pathways на unity learn для полных самоучек? Возможно ли с них толково обучиться ремеслу геймдева или же то такое?
ты в интерфейсе редактора разобрался? если да то всё начинай делоть игру, появятся какие-то вопросы, то гуглишь на английском, всё
Я считаю что если не задерживаться и приходить по 2-3 миссии за неделю то вполне неплохой ознакомительный курс. Креатив кор скипать не советую, ибо там рассказывают про юрп, шейдеры, редактор шейдеров, анимации - лучше имхо всё это знать. Как пройдёшь прыгай в разработку своего проекта.
Та я так-то и не собираюсь ничего скипать, а хочу полностью со всем обучением ознакомиться, тут вопрос в другом - не проебую ли я в пустую время на обучение в learn unity, может для непосредственно работы в геймдеве в качестве разработчика unity все идут по какому-то другому пути или learn unity - это база?
Я довольно дохуя проходил курсов по юнити и pathways считаю очень неплохим для ознакомления, вот только он мог быть сильно короче имхо. Плюс видосы с трансами и неграми где они рассказывают какую-то хуйню про свой опыт я лично нашёл бесполезными.
Лол, я на подобных видосах, когда они начинают рассказывать свой "жил-был" агрессивно перематываю и только таким макаром эти видосы осиливаются.
Я в какой-то момент просто прекратил смотреть и нажимал кнопку "пройдено" не глядя.
>вместо того чтоб делать игры смотрят видосики для дебилов
Ебала вкатывальщиков представили?
Там даётся неплохая база, чтобы ты просто знал куда в случае чего лезть и что гуглить. Сужает вопросы типа "как заставить объект светиться" до конкретного вопроса "как создать светящийся шейдер в юрп" и так далее.
>"как заставить объект светиться"
Правильный ответ: скачать ассет. Но хуй, теперь у нас есть 500 человек которые могут перетянуть лапшину из одного места в другое, но нет ни одного игродела.
>Правильный ответ: скачать ассет.
На каждый случай ассетов не наберётся. Если ты не делаешь совсем дженерик парашу то придётся учиться делать что-то самому.
В коде реализовал такое:
Координата "x" плавно меняется с 1 до -1.
Координата "z", рассчитывается по формуле, которую мне скинули пацаны выше: y = sqrt(r^2 - x^2). Радиус у меня 1.
Крутится, но почему-то ускоряется ближе к конце. Видео немного fps урезало, поэтому не очень заметно, наверное, но ускорение точно есть.
Есть что-то, что я упустил? Вроде ж все четенько, по формуле
852x480, 0:06
Через синус и косинус координаты находи, двигай угол на дельтатайм. Ты нагородил говна которое тебе не нужно вообще.
>но так же почему то есть ускорение.
Потому что координата "x" у тебя зависит от времени линейно, а координата "z" – нелинейно.
Лолблядь, так тут ещё дебил. Лучше бы реально хоть с БАЗОЙ ознакомился для начала прежде чем кукарекать на кого-то в треде, создатель хуев. Даже такой хуйни не знает.
Используй Quaternion.AngleAxis()
я точно не знаю, можно спалить или нет, но даже если и спалят то что дальше? разрабам ассетов делать нехуй, сидеть мониторить игры и из магазина не выкинут из-за этого
1100x452, 0:06
Я наверное тупой, но объясните, как заставить двигаться элементы на платформе как бы.
Как бы игрок имеет Rigidbody и платформа тоже, но почему она его не двигает?
Уже и материалы с фриквенси поделал, и всё такое, не понимаю
> Со своих миллиардных прибылей сможешь выделить 20 баксов на покупку спижженых ассетов?
Да я не против, но с российских карт не оплатить. Можно купить через посредников, но у посредников то другие имена и карты, в чём тогда разница между ворованным ассетом с файлопомойки и купленным другим человеком из другой страны, который переслал мне этот ассет?
просто скажи, что у друга диск брал
>в чём тогда разница между ворованным ассетом с файлопомойки
Тем что ты сможешь доказать факт покупки лицухи. Тут спор ни о чём, у тебя игры то нет и неизвестно когда будет. Ассет он из РФ оплатить не может, а бабло со стима получать может.
Долго ли и сложно будет переписывать\править свои шейдеры?
Недолго, различия больше визуальные по синтаксису (были одни названия функций/типов, стали другие), а по логике практически нет. Переписывал легаси имаге эффект на постпроцессинг, там тоже на HLSL надо перепиливать чтоб работало. Не сказать что было очень сложно.
OnCollisionEnter - у игрока появляется родитель, платформа.
OnCollisionExit - у игрока пропадает родитель.
void OnTriggerEnter(Collider other)
player.canInteract = true;
void OnTriggerStay(Collider other)
{
if (Input.GetKeyDown("e"))
{
Interact();
}
}
void Interact()
{
Debug.Log("player has interacted with object");
shooting.remainingAmmo = shooting.remainingAmmo + 80;
Destroy(gameObject);
}
void OnTriggerExit(Collider other)
player.canInteract = false;
player - другой скрипт с булевой canInteract
В принципе, это вся часть кода, которая отвечает за подбор, другое опустил. Технически работает как должен, я жму "E" в зоне тригера, gameObject с патронами пропадет, в кармане +80 патронов. Но по какой-то причине, которую я не осознаю, нажатие "Е" не с первого раза, иной раз и не с десятого, удаляет коробку и дает патроны. Проверял булеву, она меняет true и false как нужно, задержек нет, ошибок с ней нет, а вот if (Input.GetKeyDown("e")) { Interact(); } видимо тупит. В чем может быть проблема?
Хотя вроде бы я понял, дело все же в player.canInteract было. Я на входе и выходе из тригера поставил, но по сути булевая никак не влияет на Interact(), ее ведь нет в методе OnTriggerStay даже. Поменял на:
void OnTriggerEnter(Collider other)
player.canInteract = true;
void OnTriggerStay(Collider other)
{
if (Input.GetKeyDown("e") && player.canInteract == true)
{
Interact();
}
}
void Interact()
{
shooting.remainingAmmo = shooting.remainingAmmo + 80;
Destroy(gameObject);
player.canInteract = false;
}
void OnTriggerExit(Collider other)
player.canInteract = false;
По-моему нет больше задержек, но я не уверен
Вроде как OnTriggerStay и прочие Stay, а также FIxedUpdate вызывается через физический движок, а он по дефолту 25 раз в секунду отрабатывает а не все 60. То есть ты жмешь кнопку, а в этот момент OnTriggerStay был на кулдауне и нажатие не отработается. Нажатия кнопок надо чекать каждый кадр в методе Update.
если уж не можешь по другому, запускай шкуратину при входе, а не он тригер стэй
"классический" тайлмеп делается мешем из квадов и UV координатами тайла в атласе. звучит страшно, но делается элементарно
вот древнее видео что нагуглилось.
https://www.youtube.com/watch?v=haelMvLyqDQ
древнее - потому что сейчас юзают встроенный грид/тайлмеп который сделает все за тебя. но тут можно делать не плоские тайлмепы а если и повозится с шейдерами то можно и всякого интересного намутить
Простой способ через приоритет Depth с игрой со слоями.
Такой же простой через синемашину брэйн.
Ассет скачай.
Либо планкой с текстурой. 3д моделью. Шэйдером.
Планка изи. Модель жрать будет. Шэйдер лучшее, но надо писать.
Ну я сделал спрайт/текстуру, которая шатается туда - сюда шейдером, но все равно уебищно. Такое чувство, что просто не могу нарисовать норм траву. Деревья норм выглядят, трава - уебищно
2) чтобы делать ландшаыт, горы и тп, нужны сторонние инструменты?
Это скорее про годот. Вроде игры разрабатываешь, но игр не выходит.
> чтобы делать ландшаыт, горы и тп, нужны сторонние инструменты?
Терреин же. Встроен в Юнити по дефолту.
1. На том, что знаешь. Выучишь блендер, станет проще в блендере.
2. Можно в юнити сделать. Можно в блендере, если лоу поли ландшафт
> Можно в блендере, если лоу поли ландшафт
есть ассет кстати, вроде неплохой https://assetstore.unity.com/packages/tools/terrain/polaris-2021-low-poly-mesh-terrain-editor-196648
накатал вчера, но чет не захотело отправлятся.
добавлю технических подробностей для разьяснения.
рисовать все кучей отдельных объектов - ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ плохая идея. современные видеокарты очень мощный инструмент для паралельных вычислений с тысячами "ядер". проблема в том что эти все ядра могут делать одновременно только одну задачу(очень упрощенно, но сойдет). т.е. условно говоря пока ты посылаешь на отрисовку один объект, тот же условный тайл, который квад, т.е. 4 вертекса, ты задействуешь 4 "ядра" для расчета вертексов, потом количество ядер соответствующее количеству пикселей объекта. остальные скучают. посему что отрисовка 1 большого сложного объекта что отрисовка 1 простенького маленького займет одинаковое время при прочих равных условиях(одинаковый материал), посему тыща(а это всего лишь тайлмап 100х100) отдельных объектов займет в тыщу раз больше времени чем одна цельная сложная карта. просто потому, что у тебя видеокарта все это время будет загружена на доли процента. это называется "draw call" - запрос на отрисовку. цель тут - максимально сократить количество этих самых запросов. современные движки стараются максимально это оптимизировать через инстансинг и обьединение мешей с одинаковым материалом. т.е. если в юнити стоит галочка у материала "инстантиэнт" то оно постарается максимально объединить все в один драукол, что обычно работает, но иногда не так как могло бы. ну и ессно требует отдельных расчетов.
Ну я вот щас начал разбираться. Для базовых вещей достаточной школьной программы. Для более сложных - нет, но я видел курс на udemy по математике для геймдева, там от векторов до квартенионов, думаю его пройти
Спасибо! В целом представлял про параллельные вычисления видяхи, но надо еще почитать
В блендере есть генераторы всяких камней, травы, деревьев и прочих однотипных объектов на геонодах. Как это работает можешь увидеть в куче видосов.
https://www.youtube.com/watch?v=5qBl0ocM0ik
Хочу пока как хобби для себя заняться кое чем на юнити, если эт важн в данном контексте.
Может быть эти курсы даже не как полезная по сути, но как мотивирующая хуйня хорошо работает? А то зная себя я всё растяну до максимума без каких-либо поинтов по целям.
написал в старый тред и сижу сутки ждут ответа, пиздец
Если не жалко денег, самоё лучше что есть по кпд это заплатить их пчелику который тебе пару вечеров будет рассказывать про юньку.
Далее по списку бесплатные курсы от юников.
Далее видео плейлисты аля делаем игру с нуля от известных челиков.
Ну и на дне как раз платные курсы, инфоцыгани и подобный шлак.
В таком же духе читаю манул блендера.
Ни разу не пожалел. Много чего полезного. И хотя с юнити уже пару лет работаю, я только из ютубчика брал инфу, ну и сам иногда лазил в манул.
Например?
Мой опыт в разных областях показывает, что курсы как формат скорее не работают, чем работают.
Причина - всё слишком завязано на контекст. Поэтому с ходу возникает много проблем которые не описаны в курсах, но которые тем не менее легко гугляться.
Как итог ты можешь сэкономить время и деньги, гугля то что нужно в конкретный момент. Лучше вместо курсов прочитать внимательно документацию, это избавляет от множества шишек.
Двачую, нужно на конкретных задачах подгугливать решения.
Я после универа подал на тестировщика с пометкой "хочу быть разрабом", мне сразу предложили тестовое задание на Юнити, я за 2 недели с гуглом-ютубом сделал (типа, отсюда взял управление, отсюда взял спам и поведение ботов, отсюда взял миникарту), меня взяли.
В итоге за год на 40 проектах со всеми возможными ситуациями столкнулся как с точки зрения фич и скриптов, так и с точки зрения плагинов аналитики-рекламы и оптимизации проекта (мсы, бачи, оперативка)
Задача немного расплывчатая, но попробуй представить skill и stat просто как набор данных. Не класс, а структура данных без логики. И далее у тебя есть уже система/паттер стратегия в виде класса, который производит расчёты на основе текущих значений skill и stat. Если тебе нужно для интерфейса вывести новые значения, то просто вызываешь некий метод Refresh, который означает, что данные изменились.
Так тут же всё ясно как божий день. Производишь перерасчёт формулы как только что-то меняется зависимое в ней.
Герой перераспределил навыки - Обновляй. Повесили дебаф - Обновляй и т.п. Надел предмет - Обновляй.
Иф ю хомлес, джаст бай э хаус
сделай ход конем.
https://pastebin.com/RxQbm7q6
храни "версию" статов и пересчитывай скилы когда версия не совпадает
Чтото жуткий говно код, оверкилл со скритаблом и нумераторами для такой задачи которая решается одним скриптом на объекте.
Класс character, в нем допустим филд dex класса stat и несколько филдов класса skill, зависимых от dex. В классе stat метод add в нем помимо увеличения самого стата прописать вызов метода recalculate из каждого зависимого от dex скилла. Я планировал делать так, но пока нет компа под рукой, чтобы проверить.
А зачем тебе хранить конкретное значение и обновлять его? считай каждый раз по формуле.
[SerializeField] int ЛВ;
[SerializeField] int СЛ;
int допОчкиБезОружия; //прокачка навыка
public int Без оружия => 65 % + (1 % x (ЛВ+СЛ)/2) + допОчкиБезОружия;
[Header("Ammo")]
public TMPro.TextMeshProUGUI patroshki;
void Update()
{
if (Input.GetKeyDown("e") && player.canInteract == true)
{
Interact();
}
}
virtual void OnTriggerEnter(Collider other)
{
if (player == null)
{
player = other.gameObject.GetComponent<PlayerMovement>();
shooting = other.gameObject.GetComponentInChildren<Shooting>();
}
if (player != null)
{
interactableImage.SetActive(true);
patroshki.gameObject.SetActive(true);
player.canInteract = true;
}
}
virtual void OnTriggerExit(Collider other)
{
if (player == null)
{
player = other.gameObject.GetComponent<PlayerMovement>();
shooting = other.gameObject.GetComponentInChildren<Shooting>();
}
if (player != null)
{
interactableImage.SetActive(false);
patroshki.gameObject.SetActive(false);
player.canInteract = false;
}
}
virtual void Interact()
{
shooting.remainingAmmo += 80;
Destroy(gameObject);
//player.canInteract = false;
}
В общем, когда я жму "Е" происходит интеракт с патронами, они плюсуются в карман. Проблема с ошибками, которые интеракт спамит в консоль, если "Е" нажата вне радиуса тригера коробки с патронами (см 1 скрин). Если игрок хотя бы раз окажется в зоне тригера коробки, эта самая коробка не будет спамить в консоль никогда, поэтому на скрине одна из ошибок меньше спамилась. Я так понял, что тригер коробки детектит скрипт PlayerMovement на игроке, получает свой референс и перестает срать в консоль, что тригеру не знает кому отдаться. Я правильно понял? Как это поправить, если мне надо на тригер ентер детектить скрипт игрока для интеракта?
[Header("Ammo")]
public TMPro.TextMeshProUGUI patroshki;
void Update()
{
if (Input.GetKeyDown("e") && player.canInteract == true)
{
Interact();
}
}
virtual void OnTriggerEnter(Collider other)
{
if (player == null)
{
player = other.gameObject.GetComponent<PlayerMovement>();
shooting = other.gameObject.GetComponentInChildren<Shooting>();
}
if (player != null)
{
interactableImage.SetActive(true);
patroshki.gameObject.SetActive(true);
player.canInteract = true;
}
}
virtual void OnTriggerExit(Collider other)
{
if (player == null)
{
player = other.gameObject.GetComponent<PlayerMovement>();
shooting = other.gameObject.GetComponentInChildren<Shooting>();
}
if (player != null)
{
interactableImage.SetActive(false);
patroshki.gameObject.SetActive(false);
player.canInteract = false;
}
}
virtual void Interact()
{
shooting.remainingAmmo += 80;
Destroy(gameObject);
//player.canInteract = false;
}
В общем, когда я жму "Е" происходит интеракт с патронами, они плюсуются в карман. Проблема с ошибками, которые интеракт спамит в консоль, если "Е" нажата вне радиуса тригера коробки с патронами (см 1 скрин). Если игрок хотя бы раз окажется в зоне тригера коробки, эта самая коробка не будет спамить в консоль никогда, поэтому на скрине одна из ошибок меньше спамилась. Я так понял, что тригер коробки детектит скрипт PlayerMovement на игроке, получает свой референс и перестает срать в консоль, что тригеру не знает кому отдаться. Я правильно понял? Как это поправить, если мне надо на тригер ентер детектить скрипт игрока для интеракта?
17 строка это if (Input.GetKeyDown("e") && player.canInteract == true)
блядь какой же двачь уебанский форум с точки зрения переписки, ни редактуры сообщения, ни верстки нормальной, пиздец просто. Лишь в b срать удобно
ну так тут нулом может быть только плаер, который нул потому что ты получаешь его в тригере. или получай его заранее(скрипт на чем висит?) или проверяй на нул
if (Input.GetKeyDown("e") && player?.canInteract)
ну и canInteract == true же. каждый раз когда кто-то так пишет умирает котенок
Так я вроде бы понял о чем ты. То есть пока у меня null в player, коробка не может достать true или false из canInteract, потому что не от куда доставать. Ок, встает на места. А как совместить player? и && тогда? Пишет, типа несовместимы операторы && и bool?.
А че не так с player?canInteract == true — так работает теперь, когда проверяю на null player. У меня же canInteract по умолчанию false, пока я не в тригере
покажи, а то чет телепатия барахлит сегодня
все время забываю что ?. возврашает нулабл бул, который иф не сьедает. а прописанная операция сравнения вызывает преобразование в простой бул.
> А че не так с player.canInteract == true
это мерзость
настолько, что в данном случае, когда надо приводить нулабл т.е. имеет смысл, я бы все равно написал
if(player != null && player.canInteract && input....)
суть в том что булы не нужно сравнивать с булевыми константами. это просто бессмыслено. потому что в результате ты получишь туже булеву константу. это как прибавлять 0 или умножать на 1.
а тебе нужно player хранить?
не проще проверять у коллайдера не навешен ли не его геймобджект скрипт Player?
>А че не так с player?canInteract == true
скорее всего он ратует за player?canInteract == true
> А как совместить player? и && тогда?
зы просто обычно использую ?. для проверки на цепочки нулов
типа вместо
if(a != null && a.b != null && a.b.c != null)
можно написать
if(a?.b?.c != null)
в теории можно использовать ?? оператор
if(player?.canInteract ?? false && ...)
но опять тут для наглядности лично я предпочитаю разбить на проверку плайера и кенинтеракт отдельно а ?? использовать больше для чего-то типа дефолтных значений при инициализации типа
public class foo
{
public int bar;
public foo(foo other) {bar = other?.bar ?? 0;}
}
if (player != null && player.canInteract && Input.GetKeyDown("e")) работает, с этой стороны не подумал. Спасибо.
>>07755
Да я не знаю нужно ли, я просто пользуюсь теми способами, которые знаю. Я знаю, что у меня булевая есть в другом скрипте и булевые можно проверять удобно в ифах. Так и вышло. Может потом и другие способы мне начнут больше нравится, пока использую что под рукой.
>>07757
Сразу так и не впитаю, сложные конструкции для меня
какая же хуета для пориджей, скоро наверное всякие свыч конструкции сократят до двух символов
Что вы как эти, в трай-кетч оберните всё и поехали
еще в 8й версий шарпа
int a;
var b = a switch {
0 => "Ноль",
< 0 => "Отрицательное",
(> 0) && (< 10) => "Цифра",
< 100 => "Две цифры",
_ => "МНОГА!"
};
Хоть это и не UniRX, но реально соей пахнуло
Что это за конструкции уровня фламинго? Год не кодил, там разве не нужно вставить просто название функции?
https://dictionary.cambridge.org/ru/словарь/англо-русский/quit
> Accepting to quit the current game closes this game and cancels the remaining commitments of the game.
пчел ты...
ну не знаю как ты, а я бывало проябывал ссылки, когда забыл сохранить и ловил краш или просто редактор не сохранял
1)Подписываешь странно, достаочно имя метода
2) лучше serialized field вместо поиска объекта по имени
зачем делать это в рантайме?
повесил скрипт на панельку с меню, назначил екшены с неё кнопками. всё.
> Основные траблы которы жрут цп и гцп - Это графика и физика.
Этот шарит, причем для ньюфагов уточню - графика в том числе жрёт и ресурсы цп, особенно если пренебрегать дефолтными советами по оптимизации.
И я даже больше скажу - современные компы такие мощные, что даже если ты по полной обосрёшься с физикой и графикой, они всё равно вытянут твой инди проект, поэтому лучше просто игру делать, чем тратить силы на +1% фпсов, да даже на +100% - поебать, если их приемлимоб
Но это на компе, а на мобилках это критично и надо всё настроить сразу адекватно.
>>06755
Смотря сколько тебе их надо каждый кадр. Я пока не видел, чтобы с этим проблема была.
Если так хочешь по-оптимизировать - ебош ецс, раскидывай всю логику по всем потокам. Это хотя бы даст реальный профит, по сравнению с ёбнутыми оптимизациями коллов функции. Да и вообще нахуй тогда си шарп и юнити нужны, надо на С++ ебошить!
Ты не формочки в студии шлепаешь, которая в конструкторе подправит код когда ты контролу меняшь имя. В юнити такого нет, там уже определено как надо делать - через поля. У объектов свой айдишник и если менять названия или иерархию объектов то ничего не проебется, а если ты пиздец какой умный и решил сэкономить место в окне инспектора юнити, то потом будешь с пробитой жопой бегать дебажить где у тебя там нуллреференс вылез.
>появилось ощущение уверенности в работе
Я тоже когда-то пытался в юнити, но потом осознал, что она мне не нужна. А с синим роботом появилось ощущение уверенности в работе очень быстро, рекомендую. Всё равно ты за полгода ничего существенного не сделал, правильно понимаю? Нечего терять, так что смело переходи на сторону добра. У нас есть сырки (на гитхабе, ммм).
wololo~
>Всё равно ты за полгода ничего существенного не сделал, правильно понимаю?
Да, но ты то со своим роботом за всю жизнь ничего существенного не сделаешь, так что я спокоен.
>С какого момента у вас появилось ощущение уверенности в работе с юнити
как начал делать свою первую игру на юнити, так и появилась
Ответ "всем" тебя не устроит, поэтому начну с простого: юнити лучше годота в производительности. В тред миллион раз кидали годотные пропуки в примитивных 2д играх, буковки проперживающиеся каждая в отдельном дравколе и другие прелести движка от хуана. 2д физику годота можно даже не упоминать.
Спрашивай еще, поможем
У меня там оказывается слой исчез по которому должен был рэйкаст проходить.
Пока я это выяснил успел переписать всё вот так и заработало как надо.
пикча отвалилась
Относительно логично было бы сделать противнику триггер для удара. И тогда через треггерентер+OnTriggerStay
Могут возникнуть проблемы, если несколько триггеров перекрывают друг-друга.
Ты можешь написать: shooting.remainingAmmo += 80;
Если проблема в этом, ну и вообще по-хорошему класс player сам должен проверять, находится ли он в триггере с каким-нибудь тегом interact
Извините, почему в юнити не завезли трение? У материалов же есть трение, но оно не влияет на соседние предметы.
И КАК Я САМ ДО ЭТОГО НЕ ДОДУМАЛСЯ
События плохо сочетаются с циклом обновления игры, когда надо что-то обновить или получить какие-то данные внутри апдейта.
События имеют смысл только для отношений нескольких к нескольким объектам. Например, когда у тебя 10 кнопок и чтобы не перебирать все 10 кнопок, лучше сделать событие нажатия кнопки. Когда отношения 1 к 1 типа игрока и HUD для него, то в событиях нет никакого смысла.
> плохо сочетаются с циклом обновления игры
Эт как? Что конкретно плохо?
> когда надо что-то обновить или получить какие-то данные внутри апдейта
Кидается событие, все подписчики получают его и обновляют данные.
> События имеют смысл только для отношений нескольких к нескольким объектам. Например, когда у тебя 10 кнопок и чтобы не перебирать все 10 кнопок, лучше сделать событие нажатия кнопки.
А если ты захочешь поменять реализацию того или другого? А если захочешь добавить кнопки добавить объекты?
>Когда отношения 1 к 1 типа игрока и HUD для него, то в событиях нет никакого смысла.
Есть - они убирают жёсткую зависимость, за счёт этого проще что-то менять и дебажить.
Что-то кинуло событие, что-то обработало, сама зависимость делается через какого-нибудь посредника, будь то условный ui manager или eventbus
> по-хорошему класс player сам должен проверять, находится ли он в триггере с каким-нибудь тегом interact
Ну да, вообще так логичнее выглядит. Есть небольшая проблема, если я кучу коробок с патронами сложу в кучу, они за одно поднятие все собираются, потому что все в зоне интеракта. Не то, чтобы меня это так уж огорчало, но представления не имею как реализовать. Мне кажется, как-то связывать с радиусом зрения игрока и показом предмета интеракта (ну типа "нажмите "Е" для взятия") только, когда игрок лицом к предмету. Не по моим мозгам
>>08268
> Ты можешь написать: shooting.remainingAmmo += 80;
Да, я щас так пишу, да и писал в принципе. В тот момент я затупил как обычно, написал не += / -= как должно быть, а наоборот видимо =+ / =-, поэтому результат был иной, и я переписал как точно должно работать, пусть не коротко.
Попробовал изобразить про что я. Слева вид со стороны, справа вид от камеры игрока. Синим указаны предметы, которые игрок видит на экране, но они не взаимодействуют с ним, потому что не в квадрате интеракта. Оранжевым - предмет, с которым можно взаимодействовать, он в квадрате интеракта.
>Эт как? Что конкретно плохо?
Это как ввод сделан через опрос Input.GetButtonDown() потому что так удобнее внутри Update() проверять ввод
Эти гении идиотизма кстати додумались в новой системе ввода сделать ввод событиями. Я так и не смотрел эту новую систему.
>Кидается событие, все подписчики получают его и обновляют данные.
Получаешь данные, сохраняешь в переменную, чтобы внутри Update() потом их прочитать и обновить? Так лучше сразу эти данные дернуть откуда надо
Зачем тебе события изменения количества патронов, например, если в компоненте hud можно просто проверять изменились патроны или нет?
Новый блокбастер от создателя "как сделать так, чтобы круг всегда поворачивался ебалом к кубу".
var c = Camera.main;
if (Physics.Raycast(c.transform.position, c.transform.forward, out RaycastHit hit) && Input.GetKeyDown(KeyCode.E)) {
Debug.Log($"CHTOTO NASHEL {hit.collider.name}");
}
> Эти гении идиотизма кстати додумались в новой системе ввода сделать ввод событиями. Я так и не смотрел эту новую систему.
Я смотрел, она норм, но я под телефоны пилю, поэтому мне она не нужна.
> Получаешь данные, сохраняешь в переменную, чтобы внутри Update() потом их прочитать и обновить? Так лучше сразу эти данные дернуть откуда надо
Зачем в переменную?
Делаем подписку +=UpdateValue;
А сама эта функция и делает обновление
void UpdateValue(int value)
{
//обновляем нах
}
Не нужно никакие переменные для прошлого значения вводить, не нужно каждый кадр это прокручивать - а только по мере обновления все будет меняться.
> Зачем тебе события изменения количества патронов, например, если в компоненте hud можно просто проверять изменились патроны или нет?
Ну так а с другой стороны - зачем оно надо, если с событиями код намного понятнее?
>void UpdateValue(int value)
>{
>//обновляем нах
>}
Потому что это самый примитивный сценарий. Не всегда можно что-то просто взять и обновить из обработчика события
Поч??
Если ты делаешь в апдейте, то у тебя
if(oldValue != GetAmmoSomewhere())
{
//обновляем нах
}
А если в обработчике, то
void UpdateValue(int value)
{
//обновляем нах
}
Там где "обновляем нах" аналогичный код...
>если с событиями код намного понятнее?
Событие для одного подписчика. В этом нет смысла, только усложнение кода
Например когда я переключился в альтернативный режим стрельбы, я хочу показывать в этом элементе hud количество альтернативных патронов.
Такие вещи удобнее делать в Update() или в корутинах, если надо что-то динамическое и сложное с несколькими состояниями
> Например когда я переключился в альтернативный режим стрельбы, я хочу показывать в этом элементе hud количество альтернативных патронов.
Ебошится событие переключения оружия, контроллер интерфейса оружий ловит это событие, переключает интерфейс на нужный пресет в соответствии с типом этого оружия, одному текстовому элементу(или любому другому индикатору) пихает подписку на основной тип патронов, второму на альтернативный, и всё, больше абсолютно ничего не надо делать.
Как раз в в сложных ситуациях с событиями же в разы всё проще, не??? В апдейте с корутиными это ж ебануться можно будет всё отслеживать, где ты там что когда поменял и на что.
Бля, есть же рейкаст, точно. Думать проще не получается
>В апдейте с корутиными это ж ебануться можно будет всё отслеживать, где ты там что когда поменял и на что
if (player.alternativnoeOruzhie)
patrony.text = player.alternativnyePatrony;
else
patrony.text = player.patrony;
пишу 2 строчки кода и интерфейс готов, пока ты там 3-х этажную архитектуру имаджинируешь
Можно вообще не писать количество, тебе же в реале ничего не пишут.
Rigidbody или Character Controller?
И почему?
Онли Character Controller. Rigidbody для управления забудь. Исключение можно составить лишь если твой персонаж это объект который управляется только силой по типу шара.
Какой тебе материал нужен? Как сделать персонажа? Так это либо смотришь мультики от самих юников, или же если не совсем глупый туториалы от ютуберов индусов. Есть конечно хард уровень почитать доки, но это опустим.
Благодарю.
Ну, то есть, выпустил - и все, пилю следующий проект, забыл про него.
То есть, код может быть лютым говном. Классы дёргают друг у друга публичные методы и переменные, логики переплетаются.
Но - код работает. По сути, это "архитектура для одного конкретного приложения. Я на листочке распишу, что где как работает, и реализую это.
Игрок собирает вещи, дохнет, ходит, стреляет? Пилю один класс, а там в update() код передвижения, и отлов нажатии для стрельбы и ходьбы. Вещи складывается в публичный List в его же классе. В этом же классе добавляем в UI иконки подобранных вашей
Враг ловит игрока? В Enemy.cs пишем патрулирующий код. Когда поймает - в его же классе (в Enemy.cs) пишу код, который тормозит игрока, показывает окно "вы сдохли", и там же в скрипте Enemy ловим нажатие - нажал ли игрок кнопку "попробовать ещё раз"
Есть дверь, которая открывается, если у игрока есть ключ? В OnTriggerEnter двери пишем проверку, если это игрок столкнулся (проверка по наличию скрипта Player.cs) потом в player.Inventory делаем поиск нужного ключа.
И т.д.
То есть, логика тупая и прямая - что-то надо? Берём и хуярим без задней мысли, не думая о расширяемости, красоте, правильности, ибо нахуй оно надо?
Судя по всему , к такому подходу придирки начинаются со слов: а если тебе надо будет добавить ххххх, а если ты захочешь xxxxx... Так вот , суть в том, что игра конечная, развиваться не будет. То есть, никакого сопровождения не требуется. Тут главное все заранее продумать, что игра должна делать и это и пилить.
Понятно
А что, можно как-то по другому делать?
Ну ты будешь делать другую игру, вспомнишь, что нужна функция уже есть в предыдущей игр. Захочешь взять, а там наговнокожено. Не разобраться и не скопировать, проще щаново слелать. В итоге тратишь время.
Все это сделано анимацией, но я хочу доьавит шейдеры ради эффектов.
Есть ли идеи, какие эфыекты можно повеситт? Есть ли примеры из игорянов где за счет графена складыается ощущение ирреальности? Может что-то времен пс1. Или мб шейдеры готовые какие. Или просто ощущения без конкретных примеров?
Поверь если у тебя получится сделать рабочую игру с таким подходом уже всё будет окей, сможешь всем петухам которые кукарекают говорить что ты хотябы игру сделал в то время как они только кукарекают кодом.
От себя посоветую разве что выносить какие либо функции в другие скрипты чтобы самому было понятно, а в остальном похуй. Ну и если код где-то повторяется дважды, тоже выносить в отдельную функцию.
> То есть, код может быть лютым говном. Классы дёргают друг у друга публичные методы и переменные, логики переплетаются.
> Но - код работает. По сути, это "архитектура для одного конкретного приложения. Я на листочке распишу, что где как работает, и реализую это.
Крайности это всегда хуйня, надо всего в меру. Большая часть принципов солид - вполне разумная, вне зависимости от того, что ты вообще делаешь и с какой целью, и практически не требует каких-либо особых трудозатрат(опять же - если их использовать в меру). Может не обязательно всё дробить на сотни интерфейсов, но хотя бы зоны ответственности классов надо как-то пытаться соблюдать, ты на листочке если продумывать будешь, то к солиду и адекватному ООП и придёшь скорее всего в плане проектирования классов.
Публичные поля и методы - это просто нарушение инкапсуляции(и то не всегда), но стоит понимать, что инкапсуляция нужна только чтобы проще было понять как классом пользоваться. Если ты сам уверен, что всё будешь держать в голове и помнить - можешь забить и вообще везде публичные переменные делать. Но на практике ты 100% что-то забудешь уже через неделю, поэтому лучше сделать хотя бы удобные функции в каждом классе, чтобы не пришлось извне модифицировать переменные, с учетом какого-то правила, которое ты держишь в голове(не забыть сделать проверку что минимум меньше максимума или подобную хуйню), опять же, если ты на листочке всё продумаешь, то сам к этому и придёшь.
Короче, не важно, отказываешься ли ты категорично от солида или нет, в конечном итоге ты и сам придёшь к нему(к самым важным его частям в рамках соло разработки)...
алсо не стоит забывать что в геймдеве кроме собственно ооп с инкапсуляцией вполне себе популярны и другие парадигмы. тот же экс, где хуй ложили на сокрытие данных и в теории любая система может читать и писать любые данные без ограничений
if (!script.enabled) return;
а дальше уже моя логика.
может есть лучше способ?
что бы обязательно висели на одном объекте?
атрибут
[RequireComponent(typeof( ... ))]
заодно при добавлении этого мб будет автоматом вешать на объект все требуемые.
Bake - это как ты запекаешь навмеш, обычно там самые минимальные значения по всем видам агентов, в агенте ты просто пресеты для навмешконтроллера создаешь, использоваться будет агент в итоге, но если ты запечешь для него невозможные данные, то работать не будет
Не ну реально. Я делал примитивами и заебался(ну это лално, хуже то, что не все мог сделать). Теперь думаю, нужно ли в блендер вкатываться или какие инструменты бзать. До этого только 2д делал
Для начала нужно разобраться что такое UV, лайт и рефлекшн пробы, как настраивать тени, хотя бы поверхностно шейдеры, и пошарить настройку URP. Иначе всё твоё обучение в блендере превратится в говно, ибо делать 3D и экспортировать 3D - абсолютно разные вещи. По поводу домика, качай ассет ProBuilder, для начала этого более чем достаточно
Uv, сюрфейсные и вертиксные шейдеры я знаю. Лайтпробы не оч.
Про экспорт/импорт не знаю, но раз речь про uv, видимо нужно будет сопоставлять текстуру с сеткой
Сап, костыляч.
Нужно создать объект из префаба которому будет задан размер\поворот.
Проще говоря что бы труп мишки был повернут в ту же сторону куда и мишка
Написал такой код , но в таком случае чому то создается два объекта повернутые в разные стороны.
Как это лучше реализовать?
еблан?
Зачем тебе коротинна?
Привяжи лучше к концу анимации
А ну так Instantinate новый экземпляр создает и возвращает, который ты нигде не сохраняешь, а потом задаешь трансформ префабу
конкретно для шейдеров лапша лучше. ибо видно каждый шаг в риалтайме
Здорова, начал осваивать систему частиц. Хотел сделать в своей игре эффект листопада, сразу всплыло несколько проблем.
Во первых вид частицы, я во вкладке Shape выбрал спрайт листов, которые заранее нарисовал. От них система взяла видимо только цвет. Тоесть вылетают такие квадраты цветом отдаленно напоминающим листья эти.
Во вторых их вылетает мало. Тоесть вылетает много, но половина из них в холостую, тоесть без текстуры какой-то видимо.
В третьих когда запускаю, в игре вообще нехрена нет, не проигрывает
Как ты такую охуенную траву сделал?
ПЕРЕКАТЫВАЙТЕСЬ, НЕХУЙ ВАС ИСКАТЬ НА ВТОРОЙ СТРАНИЦЕ https://2ch.hk/gd/res/809329.html (М)
ПЕРЕКАТЫВАЙТЕСЬ, НЕХУЙ ВАС ИСКАТЬ НА ВТОРОЙ СТРАНИЦЕ https://2ch.hk/gd/res/809329.html (М)
А разве оно не считается при каждом ударе?
Через MasterServer Toolkit, например.
Это копия, сохраненная 4 ноября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.