На Unity сделано много замечательных игр - 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 лицензию.
- Движок Если ты уже умеешь использовать язык, то можно приступать непосредственно к изучению движка. Крайне рекомендется купить/скачать книгу 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 - это начать делать игру и по мере разработки гуглить непонятные моменты.
>>698832 → Ну там-то вроде и курс по шарпу(а потом по юнити, если ты про полный), поэтому вроде нормально, что там погромач. Но то, что чел просто зачитывает - это печально. Хотя может это просто введение, а потом будет подкрепление с примерами. Я вот думал взять первый месяц за 5к посмотреть, но как-то хз. Я не особо хочу становиться программистом c# со знанием юнити, у меня вообще был план сделать парочку гиперказуалок просто потому что скучно. Решил чекнуть инфоцыган местных и увидел этого странного чела.
Как лучше работать с данными в юнити? Например, я хочу иметь что-то типа базы данных абилок, где у меня будут храниться все их параметры, название, иконка, стоимость, кулдаун, и т.д. Таких абилок может быть много, десятки, сотни, с ними должно быть легко и удобно работать через инспектор, поэтому просто в коде в массивчике хранить не хочу. Но и префаб на каждую абилку городить не хочу, это кажется неправильным, все-таки это не геймобжект, размещаемый на сцене, а именно набор данных. Думал про табличку в экселе, и потом импортировать, но тоже не очень удобно, хочется все-таки иконки через инспектор драг н дропом кидать, а не просто прописывать путь. Есть что-то из коробки в юнити, или надо смотреть в сторону ассетов? Databox выглядит похожим на то, что мне нужно, но неужели до сих пор нет из коробки похожего функционала?
Что будет, если я куплю ассет, использую его в проекте, потом скину проект другу, у которого этого ассета нет, у него он не будет работать? Или когда добавляешь ассет в проект, он копируется в него целиком, и после этого можно запускать этот проект на другой версии юнити без купленного ассета?
>>698876 Даже ассеты, которые состоят только из кода, без моделек/текстур/префабов? Сейчас же даже убрали браузер с ассет стором из юнити, чтобы облегчить редактор, и перевели на package manager, это не значит, что в проекте подключенные ассеты будут качаться через него при первом запуске?
И еще вопрос ко всем в треде, есть ли список must have ассетов, которые стоит по дефолту использовать в любом проекте? Имею ввиду не ресурсы для игор, а именно полезные расширения редактора или утилиты, которые упрощают и ускоряют разработку. Например, odin крутая штука, но дорогая, может есть что-нибудь в таком духе, но бесплатное? Или не бесплатное, но хотя бы не очень дорогое, что стоит купить и потом использовать во всех проектах. В общем, пишите ваши любимые ассеты, что стоит посмотреть.
Делаю игру, в которой разными предметами персонажи пользуются по особенному. В планах сделать так, чтобы предметы позволяли пользоваться механиками из ретро игр. Сегодня допилил функционал лопаты. Кто играл в эту игру в детстве?
>>698892 Если бы это были плейсхолдеры, то ты бы не заморачивался на анимацию... Надеюсь этов сё же плейсхолдеры. Иначе мне даже подумать страшно, что у тебя в голове.
>>698869 ScriptableObject + твой интерфейс ISkill например. Так ты сможешь переиспользовать свои скилы и менять их параметры через инспектор.
>>698874 Ассет это zip архив, встречал ассеты которые просят тебя регаться на емейл - такие НАВЕРНОЕ не будут работать без твоей учетки, но 99% ассетов просто "вот тебе пара .cs файлов"
>>698898 >ScriptableObject Спс, то что нужно. Только у меня в голове не укладывается, почему он называется ScriptableObject, если это объект для хранения данных, почему не DataObject, например. Он же не скриптуется, почему scriptable?
>>698905 Тащемта, анимации неплохие, ты всё сам делал? Где анимировал, спайн или прямо в юнити? Они у тебя процедурные, завязанные на физику? Мне только кровищи не хватает на твоих гифках, хотелось бы крови и угара в такой игре, а не просто всплывашку в стиле детских мультиков
>>698907 Всё делал сам, анимировал в юнити, часть анимаций процедурные, на физику анимаций не завязано. Есть и кровища. Но пока только в одном из захватов.
>>698909 На текущий момент ебашу ради процесса, мой изначальный ориентир - Duck game. Поэтому и монетизацию наверное стал делать бы как там, просто пэй ту плей. Одноразовая выплата. Но, в теории, здесь легко клепать скины и всякие элементы кастомизации.
>>698901 Наверное под scriptable понимается, что его можно скриптовать, но по факту этого объекта не будет в игре как GameObject-а. Юнете оч старая и скорее всего над неймингами долго не думали, потом так и оставили.
>>699013 На хабре стетье 10 лет, а это значит что на гавно-мобилках будет 60фпс выдавать в наше время https://habr.com/ru/post/350396/ Вообще загугли: "habr unity3d 2d shadow", там много результатов и выбери реализацию, которая тебе больше всего нравится/подходит. Удачи
Привет аноны, в процессе создания игры на мобилки возникла такая проблема: я создал сцену, накинул на нее канвас с кнопками и обработчиком событий. По-моему замыслу при нажатии по экрану в любом свободном месте должна начинаться сама игра, а при нажатии на кнопки соответственно должны срабатывать кнопки. Так вот, в редакторе все работает как надо но при портировании на телефон оно работает через жопу и либо работают кнопки, либо работает тап по экрану для начала игры, а вместе они работать не хотят. Как быть?
>>699061 через вот этот if в update if(Input.GetMouseButtonDown(0) && cubeToPlace != null && allCubes != null && !EventSystem.current.IsPointerOverGameObject())
>>699064 Что за хуйню ты наговнокодил? Делаешь обьект картинку на весь экран, поверх ставишь кнопки, эвент тригер при нажатию на картинку->начать игру, при нажатие на кнопки вызвать функции кнопок.
>>699064 > EventSystem.current.IsPointerOverGameObject() > в редакторе все работает как надо но при портировании на телефон оно работает через жопу Может быть, потому что на телефоне нет указателя мышки?
для тех кто не очень часто читает ченджлоги оповещу, что в новой бете (2020.2) Camera.main теперь стала пизже и работает не как раньше аля GameObject.FindWithTag. теперь это почти бесплатная функция:
Scripting: Camera.main is much faster to query.
Camera.main used to be a performance costly function to call. With this optimization a dedicated list of objects with the main camera tag is maintained, and searching this list is almost instantaneous.
так что если ты долбоёб и используешь Camera.main, то теперь ты не долбоёб. принимай поздравления анон
>>699392 >Это как майкрософт пихала кучу костылей в ядро NT что бы какой-то там Sim City, эксплуатирующий недокументированное поведение своим говнокодом шёл. Подробнее, пожалуйста. Интересно было бы почитать.
Зачем я только обновился с LTS до 2020.1 (даже не бета 2020.2), теперь в случайные моменты редактор зависает и только убийство процесса помогает. Господи, почему в юните с каждым патчем появляются более жуткие баги...
Как нужно делать карты для 2д игры? Grid, Tilemap, все дела. по 1 размеру, никаких доп настроек. Заливка отключена в настройках. Стоило в 2 слоя покрасить 100x100 клеточек примерно(очень маленькая область), как все начинает дико зависать, то есть не не в процессе игры, а именно становится невозможно дальше оперировать редактором с этой сценой, на которой только один Grid с Tilemap-ом.
Я, конечно, знаю много альтернативных решений, по типу генерации карты в реальном времени, прогружая кусками, можно как-нибудь напердолиться, но я думал раз уже все придумали до меня, раз есть редактор и такая возможность, то значит надо нарисовать всю карту, и там уже плясать от этого, активуруя объекты и двигая камеру. Все таки 100х100 и так лагать мне не дает покоя, я что-то не так понимаю, объясните плиз.
Юнитач, хочу сделать так, чтобы в конце уровня игрок мог выбрать 1 из 3 случайных улучшений. Т.е в конце раунда на экране появляется UI на котором три кнопки - игрок нажимает одну из них и загружается следующий уровень.
Как сделать так, чтобы улучшения, которые предлагаются игроку, выбирались рандомно из пула? Есть идея просто добавить их все как отключённые кнопки в UI и включать через foreach child'ы этого UI, пока их не включится 3. Но мне кажется есть вариант получше
>>699838 var getRandomIndex = UnityEngine.Random.Range(1, 3) -> вернет тебе индекс твоего улучшения. Потом: IEnchants[] enchants = заполняешь свой массив улучшений. Потом: var randomEnchantment = enchants[getRandomIndex]; Потом: Передаешь на UI инстанс своего улучшения, для 3х на угад проделай это всё через цикл for. >>699664 Вроде в редакторе он и не должен работать, нужно билд делать + с последними пайплайнами эту настройку вообще куда-то в другое место вынесли, в Players Settings что-ли. >>699694 Оказалось я вместо if написал while и получил это из-за бесконечного цикла >>699814 Честно - не понял, у тебя в редакторе тормозит или в игре? Может на обоих слоях есть коллизия и там физика с ума сходит? Если в игре - включи deepProfiler и глянь, че там жрет все мощностя твоего пеки. У меня в 2019.4 1024х1024 на старом ноуте работало,выдовало больше 30 фпс во всяком случае
>>699856 Редактор, говорю же. На сцене ничего кроме этого нет. Никакой физики вообще, вообще ничего.
Не хочу накаркать, пока детально не смотрел, но кажется частично решил проблему - надо выделять куски и делать Break Prefab Instance, вроде я даже поле дорисовал, не знаю как дальше пойдет.
>1к на 1к на ноуте На это буду ориенироваться, сяп.
18 сентября компания — разработчик движка Unity вышла на фондовую биржу. За первый день торгов она привлекла $1,3 млрд, а ее общая стоимость выросла до $18,1 млрд. Это на один миллиард больше, чем капитализация Epic Games.
Изначально разработчики Unity планировали выходить на рынок с ценами на акции по $34-42 за штуку, но позже повысили их стоимость до $44-48. Утром первого дня торгов акции были доступны к покупке за $52, а к вечеру выросли в цене примерно до $68.
Unity — движок, который может использоваться для создания игр в 2D, 3D и виртуальной реальности. На нём сделаны Fall Guys, ККИ Legends of Runeterra от Riot Games, платформер Ori and the Will of the Wisps, Subnautica, Escape from Tarkov, The Forest и другие популярные тайтлы. Компании, доход которых не превышает $100 тыс. в год, могут использовать Unity бесплатно. Вот пидары, могли бы асетстор сделать бесплатным.
Где можно почитать, посмотреть пример годной архитекторы не совсем простой 2D игры? Делаю игру, но мучает ощущение, что путаюсь в сущностях и есть некоторая неконсистеность
ананасы! последнее время страдаю каким-то ебаным декаплингом и разбиением на кучку скриптов и не знаю нужно ли так делать. начну с того что в основном всё что я делаю это 2д. привожу пример:
2д платформер есть персонаж, он должен уметь ходить и прыгать
делаю скрипт с инпутом. он отслеживает нажатие кнопок и вызывает свои события например так:
>PlayerInput.cs public event Action onJumped; private void Update() { if (Input.GetKeyDown("space")) { onJumped?.Invoke(); } }
этот скрипт вешается на песонажа и создаётся обработчик событий, например
как вы могли заметить тут есть точно такое же событие onJumped, но нужно оно для того чтоб к нему мог подключиться другой скрипт это событие уже вызывается после проверки, в данном случае _isGrounded; (стоит ли персонаж на земле)
Отсюда вопрос: не слишком ли я всё усложняю? с одной стороны я могу добавить ещё скрипт который будет отвечать за стрельбу и он будет отдельным небольшим файлом, а с другой у меня получается очень дохуя мелких скриптов. не знаю стоит ли так дробить. и возможно делать такие связи через event Action не самая лучшая затея? есть у кого соображения на эту тему?
>>700009 Оо, таким же шаблоном реализую логику, задаюсь теми же вопросами. Как альтернатива смотрел https://m.habr.com/ru/post/281783/ - тип любой скрипт можно дёрнуть через дерево appkication>controller>... Проще отследить, что на что завязано, но все как-то гвоздями прибито. Я ещё думал о dependency injection, но тут сложности с инъекцией конструктора у monobehavior из-за особенностей инициализации
>>700009 Ещё, как вариант, отдельный класс для рассылки сообщений. Оба класса чарактера подписываются на событие с конкретным названием, а плееринпут его бродкастит - все это происходит через Мессенджер. Мессенджер содержит список всех методов, которые подписались на это сообщение и вызывает их всех. И в итоге тебе не нужно отдельно из чар контроллера ещё вью дергать Вот, кажется, пример реализации http://wiki.unity3d.com/index.php/Advanced_CSharp_Messenger
OnCollisionEnter2D, как и Stay и Exit не работают тот же Trigger работает идеально Я rigidbody есть и там и там, тестировал разные типы, галка стоит\не стоит, область коллайдера нормального размера(иначе бы trigger не работал). И тем не менее, OnCollision не работает, я уж думал он Deprecated, но нет. Всегда обходился без него, а тут понадобилось сделать стенки, нужна информация о стороны с которой произошло столкновение, Collision.GetContacts то бишь. Но я не могу получить данные потому что сообщение OnCollision не работает. Ломаю голову как определить сторону столкновения с OnTrigger. Сталкивался кто?
>>700063 Нет. \\This collider is attached to the Collision2D.otherRigidbody. Trigger оповещает что дескать есть столкновение с чем-то, но он не надет данных о самом столкновении. Только само столкновение, логично, дает данные о столкновении. https://docs.unity3d.com/ScriptReference/Collision2D.GetContacts.html А для этого надо получить сообщение которое не работает ><.
>>700009 Чеб нет, но мне кажется сложно, обычно лучше делать ДЕКОМПОЗИЦИЮ вместо ДЕКАПЛИНГА т.к. композиция была был такой: components = new IComponents[new OnJump(this), new OnShoot(this)]; и в update: components.ForEach(com => com.Update()); Плюсы: легко добавлять и удалять компоненты без анальной event += -=, придется использовать интерфейсы, а не реализацию, а значит эти же компоненты сможешь использовать для врагов (переиспользование короче) >>700016 Я юзал DI, есть специальные для юнете, нашел на хабре заготовку и допилил под свои нужды. >>700034 Медленно работает, так же как и GetComponent
>>699976 Это ты пидор тупой, все юнитивские ассеты и так всегда бесплатными были, за бабки продаются аутсорсные авторские ассеты, это стимул независимым разрабам и художникам делать контент и высталвять его на продажу.
UNET по дефолту выпилен из Unity 2019. И планируется быть замененным. Значит я зря сейчас читаю про мультиплеер в оф доках. Что сейчас использовать для создания мультиплеерной игры в юнити, аноны?
есть задача сохранять кучу мелких спрайтов в текстуру. на пол проливается много кровищи и после того как я спрайт лужи растянул хочу сохранять его в текстуру пола и сам спрайт удалять ибо память надо экономить. подскажете в какую сторону смотреть?
>>700119 Ты же про Broadcast(string, object[] args)? У нас тут конвертация CLR в C++, вызов нативных методов, потом обратная операция C++ в CLR, потом CLR.PInvoke, большая цепочка для "простого" метода. По сути гет компонент делает тоже самое, только yourComponent.GetType().Name ищет в своих внутренностях, из-за этого и медленно. >>700120 я взял https://github.com/yaroslav-gurilev/UnityDI за основу и дописал его под свои нужды (все классы поменял на структуры, убрал всю рефлексию, может еще что-то делал) . Автор этой репы советует взять https://github.com/Cryofortress/CryoDI его уже не пробовал. Есть еще забугорная DI Zenject, но лично я не люблю брать оргмоные фреймы и использовать их в слепую, иногда вылазят проблемы из-за которых весь проект потом переделывать приходится. >>700153 Это всё динамически должно происходить? Просто так менять спрайт нельзя, UV остается тем же. Если я правильно понял тебя - тебе нужно mesh.GetVerticies() - считать расстояние между точек, чтобы понять размер нужной тебе текстуры. Создаешь эту текстуру через new Texture(width,height), у этого же объекта есть методы setPixel и рисуешь. Так же у юнете есть стандартные методы а ля getPointPositionOnTexture что может упростить тебе жизнь >>700114 Тоже думал, взял colyseus, из минусов - встречаются баги т.к. пилится парой бразильцев. Можешь взять фотон (как, видимо, делают все), а можешь подождать пару лет и возможно выйдет что-то новое для сети (но что они могут придумать? все уже придумано)
>>700165 >Тоже думал, взял colyseus, из минусов - встречаются баги т.к. пилится парой бразильцев. >Можешь взять фотон (как, видимо, делают все), а можешь подождать пару лет и возможно выйдет что-то новое для сети (но что они могут придумать? все уже придумано)
Я в интернете увидел советы использовать Mirror. Colyseus и Photon лучше?
мне спрайты менять не надо. надо их запекать в текстуру чтоб у меня не было огромного кол-ва спрайтов луж крови на сцене. наверное стоит добавить что сцена вся 2д
>>700210 Это была проблема Unity Remote, скачал АПК, установил - картинка нормальная. Другой вопрос - как сделать так, чтобы спрайты растягивались под разрешение экрана?
>>700220 ну или что-то в том духе. у меня есть текстура на которую рендерится одна из камер. там система частиц выдаёт частицы разного цвета и они должны намазываться на предыдущие создавая относительно психоделический эффект
Посоны, подскажите с вопросом. Есть NavMeshAgent в сцене, двигается в точку нажатия мышкой. Как детектить его прибытие в точку назначения? Мне нужно, чтобы после остановки проигрывался звук и менялся цвет, но я не могу понять, как прописать завершение движения.
Юнитач, есть сцена пикрелейтед. По нажатию кнопки корабль должен устанавливать таблетку под собой в центре условной клетки, если эта клетка пустая. Функционал установки таблетки должен быть реализован через работу с координатами коллайдеров астероидов, находящихся вокруг корабля. (пересечение коллайдеров)
Как это сделать? Может я просто что-то не так понимаю, но натурально в душе не ебу как это реализовать.
>>700239 я просто не пойму, типа корабль может залетать на астероиды и тогда нужно делать проверку? или таблетка может быть установлена только между двумя астероидами?
>>700242 Нужно чтобы таблетка ставилась ровно посередине в центре условной координаты, даже если корабль стоит чуть сбоку. И нужна проверка не стоит ли уже на этой координате таблетка.
>>700244 ну тогда делай как я выше писал Vector3 spawnPosition = new Vector3(Mathf.Round(ship.transform.position.x), Mathf.Round(ship.transform.position.y), 0f);
это округлённая координата твоего корабля.
и делай Physics2D.CircleCast на этой же координате. только не забудь исключить слой с самим кораблём. тебе Physics2D.CircleCast сообщит были ли там коллизии и если их нет, то ставь таблетку
>>700245 Проблема в том, что все астероиды стоят с небольшим смещением по X координате, поэтому каждый из них чуть правее\левее и при округлении таблетки ставятся не на нужную координату, а со смещением На пике этого не было видно, я проебался чутка
>>700246 а зачем так сделано? сделай верно. как тебе ещё вычислить координату Х? например в этом положении у тебя рядом только один коллайдер и тут в лучшем случае можно получить Y ко коллайдеру
>>700251 Как-то так. + все астероиды смещены в сторону, пикрил. При нажатии на правую часть экрана, корабль должен устанавливать таблетку. (DONE)
Таблетка может быть установлена только в пустую клетку
Таблетка должна быть установлена в середину клетки.
Функционал установки таблетки должен быть реализован через работу с координатами коллайдеров камней, находящихся вокруг корабля (пересечение коллайдеров)
>>700255 если я верно понял, то пустые клетки это те что я отметил красным. тогда делается следующим образом:
тебе нужно сделать Physics2D.CircleCast из положения своего корабля с радиусом который может захватить 4 астероида, но не больше (синий круг). тут нужно не забыть, что нужно использовать contactFilter чтоб игнорировать сам коллайдер корабля, иначе корабль будет возвращаться в результате коллизий тоже
CircleCast возвращает int значение с кол-вом коллайдеров с которым он взаимодействует и ещё заполняет массив RaycastHit2D[] всеми хитами.
тебе нужно чтоб CircleCast вернул 4 и чтоб все коллайдера были астероидами. для нубского варианта прокатит и по тегу проверка.
таблетку ты будешь ставить по координатам хитов (x1 + x2 + x3 + x4) / 4 и (y1 + y2 + y3 + y4) / 4 и тогда она будет точно там где красная точка
>>700199 Колизеусом я сейчас пользуюсь и он мне нравится больше чем стандартное юнете решение. На фотоне уже тонна игр сделана и туториалов, будет легко разобраться. >Mirror Ага, видел что советуют, сам не пользовался, можешь попробовать
>>700201 Я хотел сказать, что если ты создашь спрат с размерами 1,1,1 и отскейлишь его до 2,2,2 тебе нужо будет посчитать world distance т.к. текстура будет мылиться
В этом направлении и двигайся. Позиция декалей должна расчитываться кастомно, это все через шейдерграф можно настроить.
Перезаписывать текстуру через интеграцию спрайта еще больше говна поешь, т.к. сначала придется спрайт переводить в текстуру, потом перезаписывать саму базовую (фоновую) текстуру. Охуеешь от того как это ресурсоемко, особенно если фоновая текстура имеет большое разрешение.
>>700231 Вешаешь скрипт на объект который двигается, в нем запоминаешь ссылку на объект NavMeshAgent, в скрипте в апдейте сравниваешь NavMeshAgent destination с положением объекта с каким-то округлением, если положение совпало делаешь свои грязные вещи. Ну еще как-то нужно фильтровать что объект не сдвинулся с последней точки которой он достиг, думаю сам придумаешь.
>>700257 Можно как-то через ContactFilter игнорировать все, кроме астероидов? Пробовал сделать через filter.layerMask = AsteroidLayerMask, но дебаг всё равно показывает коллизию и с игроком, и с границами поля. Не совсем понимаю как ContactFilter работает, а мануал не спасает
Два вопроса юнити господам. У меня прила на юните. То есть полный аналог андроид материала, только на юнете. Меня волнует 1)Почему фпс падает при переходе с 2019.2 на более новые версии? Рили печёт с этого. 2)Кто-нибудь уже работал с on demand rendering api? Как оно? Я делал тесты, и не скажу что батарея очень сильно экономится.
>>700257 >таблетку ты будешь ставить по координатам хитов (x1 + x2 + x3 + x4) / 4 и (y1 + y2 + y3 + y4) / 4 Почему-то вычисляются пивот поинты, не могу понять как изменить на центр. Бтв работает, спасибо.
>>700300 >Почему-то вычисляются пивот поинты вроде пивотпоинты обычно и являются центрами, но если тебе нужен центр коллайдера, то в массиве RaycastHit2D[] у каждого элемента ты можешь взять .collider.bounds.center
у меня на сцене много юнитов, ну например 5000, и они идут в сторону башни. башня должна атаковать ближайшего юнита. 5000 опросов дистанции в кадре это очень тяжело для мобилы. есть клёвые варианты решения этой проблемы?
>>700340 Если у тебя все 5000 солдат в массиве или листе - нет, не сложно, твой компик миллиард таких операций делает в секунду. А если очень хочется, можешь посмотреть на Unity.Jobs - звучит как то, что тебе нужно - будет паралельно на всех потоках считать дистанцию
>>700340 У башни очевидно есть дальность стрельбы? Значит делаем радикальный таргет и опрашиваем только тех кто в него вступил. Если юниты движутся с одной скоростью то ещё лучше, просто записываем по очереди всех юнитов которые старгетились и по этой же очереди потом их расстреливаем.
>>700355 к сожалению это не так. собери простой проект, сделай инстансы спрайтов и считай между ними расстояние. ты удивишься как быстро начнёт загибаться приложение
>>700358 что такое радикальный таргет? юниты движутся не с одной скоростью
>>700368 мне этот список сортировать же постоянно надо, следовательно в каждом кадре нужно замерять расстояние
пока что я сижу читаю про quadtree, но похоже что и этого мало. есть вариант с расчётом дистанции внутри compute shader, но это на данном этапе слишком сложно
>>700618 Так странно, вчера пробовал с else, и тоже ничего не работало. А сейчас решил перепроверить, перед тем как тебе написать, и вдруг внезапно всё заработало
if(cubeisbig) { Если bool - true выполняем эти действия } else { Если bool - false эти }
Всё, тут нечего ебаться, одновременно они никак не могут выполниться даже если во время тика произойдёт изменение этой самой bool. Боже хотя бы основы программирования изучили, или хотяб уроки с ютуба поделали, основы основ же.
>>700674 В первом if ты ставишь cubeisbug = true, после него сразу выполняется второй if, который принимает твое cubeisbug = true и возвращает к cubeisbug = false.
Если во втором добавишь else if (или просто else) - оно не будет выполняться, если выполнилось действие до него
прим. if (оп = хуй) { оп != хуй } else if (оп != хуй) { оп = хуй }
Если оп у нас хуй, то выполнится первое действие, а второе - нет. Если же тут будет if + if, то выполнится сначала первое, потом второе.
Не очень понимаю, как корректно организовать взаимодействие сущеностей. Как лучше организовать архитектуру, чтобы норм было? Есть какая-то обучающая инфа по архитектуре всего проекта?
У меня есть нерабочий скрипт foo.cs (на самом деле у меня там сотни таких скриптов - это древний ассет, который на новой юньке не работает - но там много того что мне подходит, куда я смотрю).
Как сделать чтобы гребанная юнити игнорировала этот скрипт? Потому что хотя этот скрипт нигде не используется - я не могу из-за него свой же проект запустить в редакторе.
Он мне нужен для примеров. Переименовывать не вариант - удобно смотреть в студии, плюс пользоваться всякими поиском определений чтобы быстро находить нужное.
Неужели в юнити не завезли опцию с которой я бы мог указать что этот скрипт ей не нужен для компиляции? В студии же так можно делать
Я просто заебался два проекта юнити запускать. Ноут, неудобно, да еще и тормозит.
>>700736 Если файлов много, то можно попробовать добавить в начало названия папки, где они лежат добавить "~" или ".", тогда юнька их будет игнорировать
Как убрать шлейф за синим прицелом?
Аноним27/09/20 Вск 16:49:42№700786133
>>700979 нужно получить ссылку на объект, как там написано было. Т.е., я так понимаю, что речь идет о том, чтобы из листа dvachers по вызову индекса, например, dvachers[0] можно было вернуть экземпляр не родительского класса, а именно экземпляр класса Incel, т.к. он имеет индекс 0; по dvachers[1] получить экземпляр Listva и т.д.
У меня есть условная платформа, которая рандомно скейлится на Instantiate(). Я хочу, чтобы она использовала тайлящийся спрайт, но изменение скейла объекта в трансформе растягивают его, а не тайлят, даже если в спрайт рендере включет тайлинг. Вопрос: как можно имплементировать скейлозависимый тайлинг спрайтов? Желательно легковесный на ресурсы, это гиперказуалка на мобилки.
Привет, двач. Сегодня начинаю изучать юнити и постепенно делать на нем небольшую 2D стратегию. Eсли что, поможете? Я знаю C# более-менее, но игры на нем никогда не писал (только "змейку" в System.Drawing).
>>701383 >Сегодня начинаю изучать юнити и постепенно делать на нем небольшую 2D стратегию И ты уже обосрался с масштабом. Если уже делал змейку, то сделай её ещё раз, но на юньке. А ещё лучше понг. А потом простенький платформер или раннер. А потом тетрис. Стратегии это невъебенно сложный жанр требующий понимания движка которое приходит спустя месяцы дроча.
>>701416 Понг только что закончил делать, по туториалу. Моя "стратегия" - это игра наподобие Plants vs Zombies, по которой тоже есть туториалы, причем даже не высокого уровня (180 строк кода).
У меня есть юниты и соответственно компонент их характеристик. Статы у юнитов различаются. Это нормальная практика, когда изменения в характеристиках прописаны в самой иерархии объектов? Я просто не представляю как это сделать скриптово. Разве что сделать один компонент уникальный для каждого юнита, а второй, общий, будет перенимать из него статы. (Сам задал вопрос, сам ответил)))) Но все равно хочу услышать ваше мнение по поводу практики и как лучше делается это.
>>701695 Создаётся скрипт база всех юнитов(характеристики), при создании юнита от туда по его id назначаются нужные характеристики, это самое лучшее решение. Если же у каждого юнита свой скрипт с назначение, это тоже решение но намного хуже оптимизированное, и сложнее отлаживаемое.
>>701698 Я правильно понимаю, если у меня на один юнит примерно 30 характеристик, всего юнитов 10, то в скрипте-базе должно быть 300 строчек характеристик?
>>701701 >создаешь один скрипт с хар-ками через [serializedField] >вешаешь на всех юнитов >настраиваешь через инспектор >сохраняешь префабы >??? >Profit
>>701704 Ну это самый простой вариант. Можешь конечно сделать один скрипт не совсем понимаю что тебе пойдёт, но думаю подойдёт скорее интерфейс, чем монобехейвер и в скрипте каждого юнита задавать ему в старте через ID юнита (который ты тоже сам ему присвоишь) его хар-ки, но как по мне это куда геморней и проще и быстрей уже будет через инспектор
у меня пена ротом уже идёт. это вообще возможно нарисовать свой растровый шрифт и использовать textmesh pro? я нарисовал в фотошопе буквы и цифры которые мне нужны, а как впердолить это в tmp я ниебу. вроде там можно генерить шрифты из ttf, но как сгенерить ttf из изображения тоже нихуя не пойму. помогите аноны
Посоны, совет нужон. Есть scriptable object класс модификация, он содержит тип слота в который ставится и массив характеристик, а также некоторые другие параметры, но не суть. Этих модификаций предвидится большое количество, и надо как-то их организовать в нечто вроде картотеки, чтобы например мастерская первого уровня могла просто и без индусского кода получить все модификации первого уровня и показать их игроку например.
Можно конечно вручную создать класс базы данных модификаций и заносить туда лапами каждую по одной, но это пиздец! А если я удолю одну, то надо будет и лезть в базу и там выпиливать вручную ее упоминание. А если будет сто модификаций, а если 500? Надо как-то автоматом закидывать модификацию в массив в базе при создании и выпиливать ее оттуда тоже автоматом если она удаляется, ну и апдейтить, когда я меняю ее характеристики. Можно как-то такое организовать?
Я правильно понимаю, что порядок вызова Awake и OnEnable сохраняется только для конкретного скрипта на объекте?
Если на одном объекте 2 скрипта с Awake и OnEnable. То после активации объекта сначала в одном скрипте вызовется Awake->OnEnable, а потом в другом Awake->OnEnable.
Но как быть, если в Awake происходит инициализация скриптов и при этом один из скриптов зависит от другого? Хули эти пидорасы из юнити не сохранили порядок вызова на уровне объекта.
>>702032 Сейчас вот такой порядок вызова: Script_1.Awake() Script_1.OnEnable() Script_2.Awake() Script_2.OnEnable() Script_3.Awake() Script_3.OnEnable()
Но что, если Script_1 зависит от Script_2. И Script_1 в OnEnable ожидает, что Script_2 уже инициализировался. Но на деле же, в Script_2 метод Awake всё ещё не был вызван. Поэтому придётся делать инициализацию по запросу, что неудобно.
>>702035 Это относится к интерфейсу. Игрок нажимает кнопку, включается окно с его инвентарём. То есть задаётся Active объекта, а далее скрипты через OnEnable отображают контент.
Уже несколько дней ломает, как сделать UI по макету пикрил. Есть область вывода записей. Каждая запись это объект UI с названием и областью для вывода записей потомков. Каждая вложенная запись также имеет область вывода записей-потомков. Я им ставлю vertical layout group, и потомки нормально выводятся лесенкой, но записи одного уровня вложенности выводятся неправильно. Они должны учитывать размер друг друга, а они лепятся поверх вложенных, на расстоянии, определенном в vertical layout group - spacing.
Как сделать так, чтобы вложенные элементы каждого элемента включались в расчет его высоты?
Такой вопрос: Есть класс для разных уровней mvc: - В модели храню данные - В контроллере описываю логику - В вью пытаюсь иметь только связь с геймобъектами и, возможно, анимацией.
Как взаимодействовать слоям между собой? Как взаимодействовать разным игровым объектами между собой?
Контроллер должен хранить ссылку на экземпляр модели и вьюхи?
Как должны взаимодействовать делегаты разных игровых объектов между собой? Должен быть какой-то класс, который содержит их экземпляры, или они подписываются на действия друг друга или как?
>>702048 >MVC Ты уверен, что тебе нужны все эти извращения из Веба? Как по мне, так они только усложняют проект, усложняют отладку.
Тебе нужно почитать про Dependency Injection в реалиях юнити. Посмотреть аналог Service Locator'a для юнити.
- Model: какой-нибудь интерфейс, через который ты получаешь данные. Реализовывать его может ScriptableObject. - Controller: скрипт, который запрашивает интерфейс репозитория через сервис локатор и потом получает нужные данные. - View: ещё один скрипт, который привязан к геймобджектам на сцене. Контроллер ему говорит, у игрока 10 HP, а скрипт вьюшки выводит его уже на конкретный Text компонент и изменяет Progress Bar.
>>702051 >Ты уверен, что тебе нужны все эти извращения из Веба? Честно говоря, нет, ищу что-то оптимальное. По началу было, норм, сейчас уже есть какая-то путаница и неконсистентность. Есть какой-нибудь пример\статья по адекватному построению в юнити?
>Тебе нужно почитать про Dependency Injection в реалиях юнити. Посмотреть аналог Service Locator'a для юнити. Есть ли примеры? Я слышал, что специальные DI контейнеры для юнити такие себе.
>>702054 >Есть какой-нибудь пример\статья по адекватному построению в юнити? Посмотри многочисленные видео по запросу "unity architecture". Есть много докладов от самих разработчиков Unity. Посмотри "Unite Austin 2017 - Game Architecture with Scriptable Objects" и "Unite 2016 - Unity Architecture in Pokémon Go".
Ещё чужой код полезно смотреть.
>Есть ли примеры? Я слышал, что специальные DI контейнеры для юнити такие себе. Конечно. Я не пользовался DI, поэтому ничего конкретного посоветовать не могу.
Может если ты приведёшь конкретные примеры для которых нужно продумать архитектуру, то я смогу что-нибудь посоветовать.
Вкратце вот пример: Есть игровой персонаж. Есть комнаты, в одной из комнат находится телевизор. Игрок может его включить.тогда тв издает звук. Если Тв включен, но находится не в одной комнате с игроком, тогда тв звучит тише.
Сейчас реализовано так: Есть базовый класс Interactable, все производные классы от него(например, включение тв или переход в другую комнату) бродкастят сообщение, о том, что действие возможно и передают в сообщении экземпляр класса, который соответствует конкретному действию (переход в другую комнату, включение тв и тп). Подписчики - это, как правило, ui(который, отображает игроку, что действие доступно) и ActionExecutor, который управляет действиями. Как только ActionExecutor получает сообщение, он сохраняет его у себя и проверяет в update, была ли нажата кнопка , требуемая для этого действия (она хранится в самом классе действия). Если да, то там большой ActionExecutor дергает нужные классы и инициирует действие. Вот тут и начинается путаница(См скрин 1), как он дергает остальные. Сейчас есть объект app, который содержит ссылки на остальные объекты (а остальные на него), часть через него. еще часть -через мессенджер.
Например, после того, как тв включили, громкость должна регулироваться после смены комнаты (тип, хуже слышно в другйо комнате) - как это должно быть реализовано? Сейчас объект со звуком подписывается на сообщение о смене комнаты,но в целом все сводится к "отправить сообщение, чтобы отправить сообщение"
>>702066 На первый взгляд могу предложить такое решение.
1) Логика телевизора хранится в скрипте Televisor : MonoBehaviour. У него будет один метод внешний Turn(). Внутри нужно хранить ссылку на текущую комнату, которая владеет телевизором и ссылку на игровой мир. Игровой мир будет представлен синглтоном. Ссылку на комнату телевизора можно задать через инспектор, либо найти как-то так: tvRoom = World.FindRoomOfObject(gameObject);
В методе Update делаем проверку: if (tvRoom == World.CurrentPlayerRoom) SetHalfVolume(); else SetFullVolume();
2) На объект телевизора вешаем скрипт, который реализует интерфейс IInteractable.Interact(Character character). Скрипт должен содержать UnityEvent. Внутри Interact пишем: onTrigger.Invoke();
Далее через инспектор вешаем на onTrigger вызов метода Televisor -> Turn().
3) Для взаимодействия игрока с объектом нужно запросить компонент: var interactable = targetObject.GetComponent<IInteractable>(); interactable.Interact(this);
>>702068 Все-таки еще вопрос: На смену комнаты завязано несколько событий: 1) Включение следующей и выключение текущей комнаты 2) Регулировался звук разных объектов (рассчитывается в зависимости от расстояния комнаты от текущей - т.е. метод должен дергаться каждый переход). Объекты могут менять по ходу игры.
Каждый объект должен сам заниматься этим всем или имеет смысл подписаться на сообщение, после которого будет запускаться соответствующий процесс?
Просто получается не единообразно, что все действия у меня резолвает ActionExecutor, а переход по комнатам - каждый по своему. >В методе Update делаем проверку: >if (tvRoom == World.CurrentPlayerRoom) >SetHalfVolume(); >else >SetFullVolume();
Есть ли смысл каждый апдейт дергать, если менять звук по факту нужно только при переходе из комнаты?
>>702074 >Есть ли смысл каждый апдейт дергать, если менять звук по факту нужно только при переходе из комнаты? Смысл в том, что это гибкое решение. Ты можешь легко его изменять или дополнять. Вдруг ты захочешь динамически изменять громкость в зависимости от дистанции. Или в зависимости от препятствий. А если игрок временно оглох? Ты ещё одно событие добавишь на этот случай? Или игрок зайдёт в звуконепроницаемую комнату. Ты всеми этими событиями связываешь себе руки.
>>702108 затрахался с этим вопросом, везде лепят в духе brackeys от балды и так что хуй потом добавишь новый функционал без батхёрта, НО! пришёл к выводу что куда полезней чем трахаться с этим вопросом в лоб, просто делать мелкие игры и через процесс приходит понимание куда и чего вставлять. за последний год код и архитектура стали в разы чище и лучше, но всё ещё есть пробелы
>>702386 Зря, очень аддиктивная гриндилка. Похуй что клон ботвы, зато какой. Даже не клон, а развитие идей. Мне вот стилистика зельды не зашла, а тут прям то что надо, и вайфу есть, и боёвка продуманнее. Кое-что кастрировали конечно (физических паззлов например почти нет), но в угоду чему-то другому. Настораживает что она фритуплей, но я наиграл 30 часов, каких-то пейволлов пока замечено не было. К тому же на старте дают до жопы кристаллов за регистрацию и последующие активности, за которые я выбил пару 4 персов, одного 5 и несколько пушек 4*. В принципе весь контент спокойно проходят и ф2п персами не юзая кристаллы вообще, но всё может поменяться в будущем.
>>702386 >Чем больше кидает тем больше я не хочу иметь дело с этим. Зря, постарайся избавиться от мыслей "мейнстрим параша, а я - нитакойкакфсе с уникальными вкусами", а то много хорошего и интересного пройдет мимо тебя. Я в соседнем треде отписывался, почему это важная игра для юнити >>702406 → Думаю, на сегодняшний день это самая технологически продвинутая и высокобюджетная игра на юнити, демонстрирующая на практике потенциал движка, до этого такого масштаба еще никто не делал. Поправь меня, если есть более продвинутые/высокобюджетные игры на юнити.
>>702554 Destroy убивает обьект только в самом конце кадра, когда все соотв. калбеки прилетели, т.е. на момент дестроя обьект все еще не нулл. DestroyImmediate форсит флаг что обьект убит сразу на момент вызова, но может приводить к багам и не рекомендуется типо.
>>702555 на вики доступная статья есть. по сути ты разбиваешь объекты на группы в каждом кадре и опрашиваешь только нужные тебе группы тем самым очень сильно уменьшая кол-во запросов
Какие обычно взаимоотношения у MVC классов? Контроллер имеет ссылки на инстансы модели и вьюхи? В какой момент(и где) создаётся контроллер и модель? Как другие классы получают данные из какой-то модели или тригерят контроллер?
Есть комната, состоящая из тайлов стен и пола. Каждой координате соответствует только один тайл, где нет тайлов геймобджектов нет вообще, это все я уже проверил - пик 1.
Настройки слоев, тагов и коллайдеров тайлов стены и пола на пиках 2 и 3.
На персонаже висит код, пик 4. В инспекторе для GroundFloor я выбрал соответствующий слой.
Но возникает ситуация, что персонаж не останавливается перед стенкой, а входит в стенку, но при этом когда он в стенке в следующий тайл стенки (слева или справа) он войти уже не может, только вернуться на тайл пола. Что я делаю не так?
Пик с тем, как персонаж зашел в стену. При этом когда он уже в нее зашел все вроде как работает корректно, на другой тайл стены он не может сдвинуться, в область где тайлов нет вообще тоже, вернуться на тайл пола может.
>>702735 Если я не ошибаюсь, то условие для начала движение у тебя содержит проверку, что персонаж столкнулся с объектом с тагом walkable. Ну так на начало движения, если он находится не в клеточке со стеной, он и будет collision с объектом, у которого есть таг walkable. Мне кажется, нужно проверять, что он не сталкивается с объектом с тэгом notwalkable или что-то ьакое
Убрал. В общем как я понимаю, в чем проблема. Луч кастится и проходит через две клетки, клетку на которой есть персонаж, и клетку рядом по направлению движения. И если хотя бы на одной из этих двух клеток есть тайл с тегом волкабл, он позволяет движение. Именно поэтому можно зайти в стену, потому что перед этим ты стоишь на волкабл клетке. И именно поэтому нельзя двигаться внутри стены, потому что обе клетки получаются без тега волкабл. То есть нужно сделать луч, который и начинается и заканчивается на клетке рядом, не задевая клетку, на которой стоит персонаж.
Как в стандартном FirstPersonController сделать так, чтобы игрок когда останавливался, двигался еще какое-то время вперед. Не предлагайте Rigidbody Controller использовать, он вообще неудобный. Перепробовал все, продолжал движение игрока по таймеру, после отпускания W, но все это как-то убого и рывками выглядит, нужна ваша помощь.
>>698843 (OP) Как создать копию лайтмапы в озу? В случае Texture2D ltluma = LightmapSettings.lightmaps[0].lightmapFar получается ссылка на лайтмапу в видеопамяти. Соответственно, меняя содержимое ltluma, меняется и лайтмапа в видео. А надо иметь независимую копию, с каждым кадром которая будет складывается с мапой/текстурой самописного динамического света и только после этого записываться в видеопамять по адресу оригинальной лайтмапы. Эдакий динамический свет для видеокарт без пиксельных шейдеров, как было в первохл/ку/ку2.
>>702765 >А вообще имхо хуёвая Дрочь какая-то получается, проще наверное будет повторять действия игрока какое-то определенное время, но у меня не получается, кто может посмотреть FirstPersonController из Standard Assets и скинуть сюда решение, буду благодарен.
>>702780 Где можно почитать все фишки языка C#, которые используются в Шилдте, нет времени все это читать, нужно каждую фишку быстренько изучить, делегаты, ну и прочую полезную залупу, помогите плз.
Сделал подобие сервис локатора, но не понял, зачем
Короче, есть класс, производный от monobehavior. Назовем Zalupa. У него есть [SerializeField] LIst, в который можно впихнуть все менеджеры -хуенеджеры, которые производные от ScriptableObject. Этот класс имеет метода Get<T>() where T : ScriptableObject - выкидывает инстансы этих классов по типу.
Как дальше сделать по -человечески: чтобы не в каждом классе дергать эту залупу, а какую то логическую прямую получить?
>>702822 1 - В настройка Project.Time - fixedDeltaTime поменяй с 0.02 на 0.04, будет буст 50% от физики (т.к. она будет считаться реже в 2 раза) 2 - там у ригидбодей есть метод определения столкновений, заметил что descrete (или как-то так) жрет меньше всего, но тогда через него могут объекты проходить на высокой скорости >>702827 Даа, vsync портит жизнь всем и на всех платформах, странно что эта хреновина так плохо работает
>>702840 Вообще не понял.. тип ты идешь по своим InterfaceZalupa делаешь .Get<SmallZalupa>() просто чтобы скастить объект? Попробуй так: switch(zalupaInstance){ case SmallZalupa smZalupa: smZalupa.MakeHugeCock(); break; } >>702798 К сожалению "быстро" не получится, я перечитал оч много книг и ковырялся в clr чтобы понять это всё на "нужном" уровне. А если просто то делегат это ссылка на метод, например: void CockMethod(){ / empty / } в другом методе или как переменная: Action methodLink = CockMethod; methodLink(); Ну и типов делегатов несколько, я взял самый простой, а они могут принимать параметры и возвращать результаты и тд >>702784 У всех свои велосипеды, если смотреть средне-сложные проекты - черт ногу сломит. Рекомендовал бы держать все данные в "доступном слое" т.е. MonoBehaviour должен ссылатся на какой-то объект, но не быть главным объектом (как это делается во всех туториалах ютуба или самой юнете). Рекомендую посмотреть сурсы HL1 т.к. там идет глубокое взаимодействие NPC с миром и при этом у всех типов NPC разные триггеры и условия. После знакомства с сурсами халвы станет сразу понятно откуда у всех ECS и DOTSов ноги растут (только растут как-то криво)
>>702861 Спасибо! А как в случае 2д игры всё-таки обычно: Вью висит на конкретно объекте и является производной от monobehavior. Какая обычно связь с контроллером, который либо просто класс, либо скриптабл обжеккт? Он находится и создаётся во вьюехе или где обычно?
>>702877 2д так же как и 3д работает.. или я вопроса не понял. Ты MVC или MVVM хочешь сделать? Самый простой способ (как мне кажется) держать ссылки на основные классы в синглтонах (GameManager какой-нибудь) и из твоей вьюхи можешь дернуть через евенты инспектора GameManager.YourStaticMethod, но думаю лучше дергать не напрямую а из вьюхи.
>>702901 Ну когда я перешел с 2019 lts на 2020 у меня пропал баг перетаскивания окна (если менял размер внутренних окон, весь редактор становился черным и вылетал с ошибкой стабильно)
Аноны, помогите, пожалуйста, разобраться в чем проблема. Я создал простенький таймер обратного отсчета. Он считает от 10 до 0.
1. Таймер запускается после нажатия на кнопку Start/Restart. 2. Если время обратного отсчета еще не истекло и нажать Start/Restart, то отсчет пойдет по новой. 3. Если время обратного отсчета истекло и нажать Start/Restart, то отсчет тоже пойдет по новой.
Проблема: Когда во время отсчета я нажимаю на кнопку, то все работает, как надо. Но когда время истекает и я нажимаю на кнопку, то таймер больше не запускается и отображается цифра 1.
Всем привет. Делаю свой клон хотлайн миами, нужно сделать подбор, кидание, хуяние оружия. В голову приходит только скрывать оружее которое я поднял, а потом в момент броска спавнить перед игроком, ну или может прятать на слой ниже и делать то же самое. Но мне кажется что это костыль хуйня говно какоето, как это можно реализовать нормально?
>>702930 Короче. Я реализовал данный функционал без корутин и все работает должным образом. Но может кто-то знает в чем тут у меня ошибка? Это может быть баг у Юнити?
Наверное ремув геймобжект оружия, в момент подъема, с добавлением в переменную типа ArmedWeapon значения, соответствующего этому оружию. А по нажатию на кнопку броска ты спавниш перед игроком оружие соответствующего переменной типа, а саму переменную приравниваешь к нулю.
>>702998 Например через синглтоны. На Awake в CharacterController заполняешь статическое поле Instance, в остальных классах пишешь CharacterController.Instance для взятия экземпляра.
Короче, такая проблема: Есть класс, производны от monobehavior. Все менеджеры приклепляются к нему как ScriptableObjectы, а их "апдейты" прикрепляются к эвенту этого класса, который дергается раз в Update().
Внезапно, в какой-то момент Updatа. Один из методов одного менеджера прерывается на update другого класса. Это возможно?
>>703058 А даже не так, гораздо проще. Метод дергается эвентом, который завязан на столкновение персонажа с объектом. Метод начинает выполняться и в какой-то момент внезапно начинается апдейт другого объекта. МОжет быть такое?
>>703059 Чегоо.. В юнетях обработка скриптов идет линейно пока ты не подключишь новые потоки, так вот, ответ- ДА ты можешь вызвать апдейт одного менеджера из другого по своему желанию и работать оно будет как ты сделал.
>>703059 Все, разобрался. Если кому-нибудь интересно, то былая такая ситуация:
В ходе выполнения метода я дергал list для которого нет экземпляра. В итоге должен вылететь эксепшн - но он не вылетает, а просто вся цепочка прекращается и происходит переход к следующему апдейту
>>703075 Всё оно верно выводит, ты в Start объект создал, присвоил wen - стринг этого объекта, потом в конце Start этот объект разрушается вместе с тем полем, в итоге в wen лежит теперь непойми что, поэтому он тебе это и выводит в лог.
Сделай PlayerWeapons pw глобальным: объяви его под "public string wen;"
>>703089 Там два скриншота. >>703075 Видимо, на момент, когда дергается Start() класса weapon, для класса player он ещё не дёргался. Перенест содержимое из метода Start в метод Awake.
Общая идея, что в авейках лучше держать настройки текущего монобихейвира, а в стартах - завязки на другие
>>703075 ПОРЯДОК ОБРАБОТКИ В юнете можно указать приоритеты скриптов в твоем случае PlayerWeapons.Start может выполниться ПОСЛЕ Weapon.Start и из-за этого строка будет null.
int выводит (скорее всего 0?) т.к. int wah; даже без прямой инициализации будет иметь default value, а точнее 0.
Посоны, на скок плохо иметь много монобихейвиоров? Лучше ли по возможности переносить из них все скриптабл оьжекты или ещё лучше в стандартные C# классы, которые не будут иметь дубликаты на стороне юнитовского c++? На сколько тогда плохо пользоваться юнити эвентами?
>>703134 >Что значит плохо? В плане перформанса, т.к. для каждого юнитивского класса есть класс в С++ , а у монобихейвиара еще и постоянно дергающийся коллбек в виде апдейта. >Решай проблемы по мере их поступления. Тогда нужно будет все готовое переделывать жи
>Видео по теме Я смотрел, потом и задался таким вопросом
Как лучше связывать управление персонажа и движение? 1) Персонаж имеет экземпляр класса управления и получает от него инструкции, если нужно двигаться 2) Управление - синглотон и публичным эвентом. Персонаж подписывается и в случае нажатия дергается соответствующий метод
>>703162 Двигайся от частного к общему. 1) InputSystem. Надстройка над дефолтным инпутом Юнити. Знает, нажал ли игрок кнопку Стрелять или направление движения, и т.п. 2) CharacterMotor управляет движением персонажа. У него есть публичные свойства, которые указывают хочет ли персонаж прыгнуть или направление движения. 3) CharacterController передаёт из InputSystem команды в CharacterMotor.
Какие ивенты, какие синглоты. Что-то ты городишь за ебанутую, сложную систему.
>>703183 > CharacterController передаёт из InputSystem команды в CharacterMotor. Так вот как они связаны? Композиция, ассоциация или что? >Какие ивенты Если по нажатию, кроме действия персонажа, должно еще что-то происходить?
>>703198 Объект 'Character' хранит три синих компонента с изображения. Ссылки на друг друга они получают через GetComponent.
UI узнаёт о состоянии персонажа через компонент CharacterState. Как UI получит ссылку на объект этого компонента? Например, пускай её хранит тот, кто создаёт персонажа. Компонент World. Как к нему обращаться? Через статическую переменную, но пускай это будет не синглтон. У него будет статическая переменная Current. Она задаётся в методе OnEnable и стирается в методе OnDisable. Более того, UI напрямую знать о персонаже не обязательно. Будет ещё один контроллер, который хранит ссылку и на персонажа, и на UI, и обновляет состояние интерфейса в зависимости от состояния персонажа.
Это как я вижу. Но что тебе на самом деле подойдёт - чёрт знает.
>>703208 Спасибо! У меня один класс вместо двух Character Controller и motor. Сейчас понял, что хорошая затея разделить, если захочется переиспользовать для движения не через инпут.
> но пускай это будет не синглтон Почему, какая разница?
>>703222 >Почему, какая разница? Синглтон должен быть доступен всегда и везде. В данном же случае World будет доступен только во время игры и нигде больше. В меню его уже не будет, например. Если ты обратишься к нему в меню, ссылка будет null.
>>703240 >Так и синглтон же тоже нулл будет до первого обращения? Синглтон всегда доступен. Иначе это не синглтон. И его статическая ссылка Instance никогда не будет null.
Есть еще такая проблема( я писал где-то выше. но лучше не стало), схожая с той, что выше: Игрок подходит к объекту, у него отображается, что он может провести действие. Если он нажимает кнопку, происходит действие, которое может затрагивать разные классы (звук, окружение, UI, инвентарь, самого персонажа). Как лучше сделать - один класс, который будет дергать все, что нужно, в зависимости от типа действия(например, воспроизвести текст, если персонаж хочет что-то сказать\прочитать) или действие само нотифицирует все классы и по эвенту дергауются нужные методы подписчиков?
Экземпляр создается при первом запросе и, если запроса не было, то не создается вообще. Если экземпляр создается на OnEnable, то действительно создается всегда и, если я верно понимаю, это просто попытка симулировать статический класс, расследуемый от monobehavior но это не точно,
>>703096 > int выводит (скорее всего 0?) т.к. int wah; даже без прямой инициализации будет иметь default value, а точнее 0. Ну вот, значит в строке 12 надо написать:
>>698843 (OP) Были кнопочки, управляющие геймплеем. Добавил два элемента типа text, в итоге кнопки вообще перестали реагировать на нажатия. Что это может быть?
>>703261 Точнее даже так. У меня на сцене два канваса, вот тот, что с кнопками управления, ни на что не реагирует. А второй, с другими элементами, работает нормально.
>>703261 Когда создаешь panel там есть флаг raycastTarget или interactable - выключи эти флаги т.к. по z-order-у они видимо выше и блокируют твои кнопки своими телами.
>>703283 Ну смотри, по идее лучше из евента дергать все классы по отдельности. Спустя некоторое время если видишь, что некоторые куски повторяются больше чем другие - их уже выносишь в другой класс для "переиспользования"
>>703242 Тебе нужен Observer, который наблюдает за действиями игрока и он уже дёргает методы, либо Юнити События. При этом Observer ничего не знает об UI, о звуковой системе, о инвентаре и так далее. Он знает только о наблюдаемом объекте, то есть об игроке.
>>703360 Спасибо! Я примерно так и сделал: Когда игрок касается предмета, с которым можно взаимодействовать, этому классу(далее менеджер действий) прилетает нотификация с этим предметом. Менеджер действий подготавливает действие. Если игрок жмакает кнопку использовать, то этот класс дёргает у предмета метод StartAction(). Предмет уже и отправляет нотификация кому нужно и с чем нужно.
Класс предмета можно сделать абстрактным и каждый реальный предмет будет реализовать его (можно было бы с интерфейсом, кстати). Но я сделал один monobehavior класс, который чисто передает действие менеджеру действий. А само действие - scriptableObject, который вешается на компонент интерактивного предмета
>>703540 Это ложное впечатление. Там нет другого синтаксиса. Есть ситуации, когда какие-то техники C# юнити резервирует для своих нужд(например, конструкторы), но это не значит, что не придется писать на "голом" C# Может, ты с js путаешь?
Как думаете, как лучше организовать работу с git на трёх человек(2 кодера и 1 артист)? Стоит ли разделять работу каждого на разные ветки? Пуллреквесты думаю сразу нафиг, ибо все изменения обсуждаются в мессенджере.
>>703549 Каждый раз новая ветка? Как-то это слишком, по-моему. Не лучше сделать ветку main с релизами, ветку dev и каждому разработчику по ветке, из которой потом всё перетекает в dev.
>>703551 Так и знал, что ты это скажешь. То, что я описал - стандартный метод работы с гит. Если каждый будет вести по своей ветке, вы потом, как пить дать, свою жизнь возненавидите, когда конфликты резолвать начнет. Траст ми. Хорошая практика - ветка на конкретный не оч большой участок когда. Иначе разъедетесь и пиздец
>>703556 Кто-то из нас заводит ветку на фичу и потом любой может вносить туда изменения до тех пор, пока фича не будет реализована? А если потом решим её дополнить?
>>703559 Ну у фичи должны быть конкретные acceptance criteria. Если хотите дополнить(при этом она рабочая на этом этапе), заливайте фичу в дев, делаете бранч от дева.
>>703573 Понимаешь, это не зависит от инструмента. Когда в принципе работает команда (неважно, дом строит или очередной велосипед собирает), должно быть понятно, кто что и в какой момент делает и чего хотят добиться. Работа с веткой на человека - просто, но до момента, как вы поймёте, что делали два задних колеса или вообще два разных велосипеда, которые не собрать в один
>>703540 Можешь относиться к юньке как к MonoGame-у или XNA. Да у юньки есть такое, что она дергает методы по имени (привет awake,start,update), а могла бы через интерфейс.. Но вообще в неё уже притащили часть либ из ентерпрайза (и тех кто это делают закидывают гавном). И да - у юньки есть свои "тонкости" из-за которых сказывается такое впечатление.
Читал тут про оптимизацию для мобилок. Разработчики отказались от батчинга, объединили всю сцену в один меш и выводили её за один раз. Батчинг реально не стоит использовать, если хочешь максимально оптимизировать сцену?
https://dtf.ru/gamedev/7533-mobilnyy-shuter-guns-of-boom-optimizaciya-grafiki Допустим, есть статический и динамический батчинг. Нашему проекту стало существенно лучше, когда мы вообще всё это выключили. Нет ничего — только сцена, которая рендерится вся сразу. Это ограничение как раз и привело к тому, что карты не очень большие. Куда бы ты на карте не смотрел — нет отсечения, вся сцена рендерится всё время.
>>703688 Про рендеринг 250к полигонов одним тиком, вместо 50к, но через 10 dc - сомнительно. Рендеринг полигонов сам по себе простая операция, даже 10 лет назад на android 4 мой проект с 60к полигонов стабильно держал 45фпс. Сжатие текстур - вот это уже лучше, юнитеки уже давно советуют батчить текстуры в атласы и так их использовать, в этом нет открытия для тех кто давно в этом варится.
а как в два дэ игре с видом сверху настроить физику так чтобы все работало нормально? например если прикладывать силу к обьекту, но с гравитацией в ноль он будет постоянно тормозить, а если включить гравитация то все будет падать вниз
Пилю бесшовные материалы в дизайнере. Позавчера запилил обои, вчера потолок, сегодня пол. Действия игры будут в нежилом деревянном многоквартирном доме советских времен. Надо напольный и потолочный плинтус ебануть, чтобы эти углы глаза не резали. Впрочем, думаю, и плинтуса тоже будут глаза резать
>>704147 Делай стык плинтуса с сантиметровой щелью, на половину забитой грязью. И в плоскости соприкосновения с полом/стеной должны быть полукруглые щели из-за выгнувшихся половиц. Половицы должны скрипеть и как бы постукивать когда на них наступаешь.
Хочу сделать SceneLoader статичным классом и пользовать его из других скриптов без использования синглтона и поиска его в каждой сцене, но проблема в том, что он также должен висеть на кнопке, а кнопка, при прикреплении к ней статичного скрипта, его не видит, и может работать только с обьектами на сцене. Как быть как фиксить, или может есть способы получше?
Кто-нибудь использовал "RuntimeInitializeLoadType.AfterAssembliesLoaded" для инициализации всяких внутренних сервисов/синглтонов? Я даже не знал, что оказывается у RuntimeInitializeOnLoadMethod можно задать тип загрузки. Что он может загружаться не только после сцены, но и перед загрузкой сцены.
>>698843 (OP) Имеется сцена с объектами, напротив каждого объекта кнопка, тыкая по кнопке, выбираешь нужный объект, потом он у тебя в игре появляется соответственно. Как лучше в скрипте прописать выбор? У меня пока только одна идея: повесить на каждую кнопку отдельный скрипт с булевой переменной, и в зависимости от того, какая переменная активирована, респаунить объект, но это как-то топорно. Есть более качественное решение?
>>704562 Пишешь простой МенеджерРеспавнаОбъектов, который принимает данные, что спавнить и где спавнить, а на кнопки вешаешь функцию из менеджера, в которую эти данные и передаются по клику. Для удобства еще можно обернуть в enum типы того, что спавнишь
>>704574 почему какойто там сакутин постоянно и везде твердит что менеджеры/контроллеры это каловая масса для лохов, но все повсеместно пишут менеджеры, да контроллеры?
>>704577 Вот тут добавляешь поле, в него можно будет перетащить объект со сцены с скриптом менеджера и у него выбрать нужную функцию, которую следует вызывать при клике, там же можно указать что в функцию передать нужно
Как в юнити текст делать менее вырвиглазным? Писали что при увелечении шрифта он делается более четким, и для статов сработало(50 стоит) Но в боксе пиздец вытикают глаза если смотреть и никак исправить не могу
>>704649 >обоссаная визуал студио Ты что - сумасшедший? Качай бесплатную студию 2019 года. Ну, или Rider, если есть деньги. А маня-девелоп это позапрошлый век. Даже не знаю, кто в здравом уме будет в этой залупе работать.
Все обучающие материалы, это что такое функция, что такое переменная, и никто, абсолютно никто не говорит о вещах для среднего уровня и выше. Может быть это специфика языка, когда кроме как знаний паттернов, возможностей Unity и базовой основы (переменные, функции, коллайдеры, корутины) больше ничего не нужно? Я сам на своих проектах сталкиваюсь только с базисом, так как нужно если было бы что-то реализовать, а я бы не смог, я бы давно обратился в гугл и нашел решение. Нужно ли читать книги посвященные C#, или достаточно знать паттерны, уметь проектировать проекты до старта и всё?
>>704669 Или я обычный говнокодер? Но вопрос изучения остается открытым, как мне узнать о всех нюансах, не проработав где-то в офисе 5 лет, я хочу чтобы мне сразу объяснили чем тот или иной метод лучше и в какие моменты, чтобы я мог соревноваться с хорошими кодерами.
>>704670 У меня схожая проблема Вкатился зимой 20го в Пыху, выкатился после полугода, понял что веб не моё. До этого немного ковырялся стажёром - джуном в вебе у товарища в конторе
В итоге ушёл в геймдев, заинтересовал юнити, т.к. вроде простой и понятный софт для новичка(ага) Си шарп довольно комфортный язык, там всё весьма наглядно, нет нужды прописывать кучу ерунды как в пыхе, надо только библиотеки вовремя подключать, ага Но вот только непонятна сама сфера - на шарпах можно делать кучу всего а меня интересует именно геймдев. Вроде неграмотно ограничивать себя в изучении, но сдуру можно увлечься, нахвататься поверхностных знаний и в итоге даже майнкрафт(который вообще на Java) собрать
Вот и непонятно - что же делать? Изучить шарпы? Насколько плотно их изучить? Изучить юнити? Интерфейс? Библиотеки? Какие то консольные команды, характерные для этого софта? Что и в каком количестве имеет значение как для новичка, так и для стремящегося? И вроде на все эти вопросы есть ответы в ОП посте, так что заранее пардон, просто раздуваю
Есть один алгоритм, процедурно генерирующий данжи. Использую тайлмапы и тайлы. Есть два вопроса: 1) У меня нет опции создать тайлмап в ассетах, только отдельный тайл. Пришлось создать прямо в иерархии две тайлмапы, пикрил. А мне религия не позволяет держать в иерархии то, что можно держать в виде ассета/префаба. Хотя может я что то не понимаю и так и надо. 2) Я что то не разобрался, как менять цвет тайлов. Заранее спасибо, аноны.
Сосач, есть лестница в 2Д платформере, чтобы игрок зависал на ней, а не падал - во время соприкосновение с лейером лестницы rigidbody2d игрока задается gravity = 0.
Проблема 1: когда игрок стоит на последней лесенке пик1 - невозможно прыгнуть потому что параметр гравитации всё ещё ноль.
Проблема 2: когда игрок пробегает по лестнице пик2 - трансформ падает на ~0.02, что визуально незаметно, но из-за чего персонаж застряет в клетке, и вылезти можно только зажав "вверх" чтобы лезть по лестнице и "влево\вправо". Предполагаю, что сие тоже из-за гравитации.
В общем в поисках решения как реализовать "игрок не падает с лестницы, когда залез на половину и остановился" иным способом.
Не понял, и как это проблему решит? Если игрок нажимает клавишу вниз, то вместо спуска по лестнице - он будет просто падать. А если не нажимает, то гравитация всё ещё 0 и он всё ещё не может прыгнуть
Чики двощ. Ищу как реализовать в 3д физику мягких тел. Проблема в том, что у меня микс процедурных и baked анимаций. Obi вроде как не подходит для skinned rigged meshes. Какие-либо альтернативы есть ещё?
Как вы относитесь к пробелам в названиях объектов на сцене, в названиях префабов, сцен? Мне кажется, так гораздо читабельней выходит. И только ресурсы стоит называть без пробелов и в начале писать тип/назначение ресурса, потом после символа подчеркивания уже его название.
>>698843 (OP) Я не знаю, это только у меня так или что. Когда добавляют компонент cloth на объект и пытаюсь выделить точки, эти точки появляются только под определенным углом и то еще бывает не все. То есть мне просто приходится хуевертить камеры вокруг, чтобы они соизволили появится. Это баг какой-то или что?
На чем написан мультиплеер для игры Heartstone? Хотелось бы во время изучения мультиплеера взять уровень повыше, чем использование библиотеки Photon. Поэтому интересуют хоть обычные ключевые запросы благодаря которым я смогу понемногу изучить как пишется сеть в такой игре. Спасибо.
>>704809 Зная требования близардов к Senior Software Engineer, Server - Hearthstone можно прикинуть что там на чем работает. 3+ years of experience of server programming Strong C++ programming skills Some experience with deploying a live service Self-motivated and willingness to pitch in on many areas of small game development Excellent verbal and written communications skills Pluses
Previous experience shipping game titles or other software Linux development experience Networking experience in TCP / IP and UDP protocols Computer science or related degree Database development experience (MySQL, Oracle, etc.)
+ делать 360 анимаций (повернул влево на 5 на 10 15* и тд очень муторно, вряд ли они так делали). По плащу видно как он ломается при повороте, мне кажется это все же физон
>>704805 От полигона зависит т.е. с обратной стороны полигона могут быть проблемы, с лицевой у меня все норм было
>>704818 Есть пример с++ сервера какого-нибудь? Или игрового сервера на гите? Не обязательно ХС-а, чего угодно
>>704818 СТРОНК прогаминг скилз, такие ниибические требования как будто в НАСА зовут, а по итогу багерное говно тупого говнас такой-то фирмой и бюджетом, которое мог бы пофиксить любой васян из мухосранского вуза, но нет. Что ли лично Беня(уже нерелейтд, но всеж) делал? Пичот.
Обычные проблемы менеджмента в раздутом крупняке. Ты же кулстори о разработке Last of Us 2 слышал, как там пол отдела моделило уже заведомо завернутый контент прямо в Recycle Bin?
>>704939 >Ты же кулстори о разработке Last of Us 2 слышал, как там пол отдела моделило уже заведомо завернутый контент прямо в Recycle Bin? Где почитать? мимо
Нужно двигать персонажа постоянно вперед в рамках уровня вроде такого https://apps.apple.com/US/app/id1499812410?l=en, на уровне также есть повороты в сторону, на повороте камера, находящаяся чуть выше и сбоку от персонажа двигается вместе с ним. Как реализовать перемещение?
Тебе бы тогда просто с изучения крестов путем написания диалоговой адвенчуры с применением стандартной библиотеки и пердолинга консольки начать, а уже потом сетью заниматься.
>>704967 Бля, это выглядит очень просто, но я всё ещё не могу понять как реализовать. Пока всё что приходит в голову - привязать игрока к камере и двигать её вдоль уровня. Но всё ещё нужно как-то ограничить движения игрока краями дороги. как-то не хочется по-инвалидному по 5 box collider'ов цеплять
Анон, есть где-нибудь готовый ассет ближней боевки от первого лица?
Хочу сделать что-то типа hexen по геймплею. Начал писать свой велосипед - получается хуево, как-то я делаю не так - мобов надо прям выцеливать чтобы пнуть, а они наоборот дерут так что не спасешься - вместо фана одно раздражение.
>>704669 А чё ты хочешь-то? >Может быть это специфика языка, когда кроме как знаний паттернов, возможностей Unity и базовой основы (переменные, функции, коллайдеры, корутины) больше ничего не нужно
Кому не нужно? Какого языка? Почитай про делегаты, например. Наследование, нтерфейсы, абстрактные классы, виртуальные методы. Наверное, ты конструкторы даже не используешь, если через юнити залез в шарпы. Но может тебе и не надо, я не знаю, какая у тебя архитектура. В моем понимании, твоя инженерная мысль при реализации той или иной функции будет ограничена кругозором. Какие-то вещи можно сделать лучше/быстрее/проще, а ты об этом и не знаешь
>>705005 >Начал писать свой велосипед >мобов надо прям выцеливать чтобы пнуть, а они наоборот дерут так что не спасешься Кириль дальше ИИ, понятно что ты тупо через навмеш приближаешь врага к игроку, уменьшай скорость, делай рывки в разные стороны, разнообразь игру
Анон, подскажи. Хочу сделать функцию, показывающую диалог (да/нет) в виде bool res = ShowDialog(). Внутри этой функции канвас диалога делаю активным и при нажатии на да/нет попадаю в скрипт-обработчик этих кнопок. Как мне вернуть результат в ShowDialog?
>>705069 Можешь подробнее описать, не оч понятно? А вызов нужных методов из этих обработчиков в методе ShowDialog почему не сделать? Или эвент не дёрнуть?
Как залететь в юнити ? Уже 2 недели пытаюсь что-то сделать, гуглю если не получается и пытаюсь снова и снова, но у меня только жопа сгорает с того, что я нихуя не умею. Как вы влетели в юнити ?
>>705089 >>705112 Купи курсы и смотри видеоуроки, делай копии простых игр.
Ну и вообще да, настоятельно рекомендую курсы, как минимум основы с них получишь. С литературой сложнее и дольше, из литературы лучше почитать что-нибудь про ООП или паттерны.
>>705118 >ООП не нужен Скажи это любому работодалю. Может ты ещё скажешь, что и паттерны не нужно знать?
>>705115 На юдеми есть много курсов, смотри топ по рейтингу\популярности само собой на английском, если жалко денег - на рутрекере спирачены почти все популярные курсы. Стоят они на скидке 10-15$, а скидка там постоянно. Если сейчас нет - подожди пару дней-неделю и будет.
>>705069 Самый простой способ без каких-то либ и тд: В диалоге сделай метод public void ShowDialog(string text, Action<bool> callback){ // сохрани каллбек в этом Mono объекте } void OnDialogResult(){ // тут какая-то твоя логика в диалоге, пусть _result - будет true или false (да нет) callback(_result); } В месте где вызываешь делай: void SomeMethod(){ string question = "Ты лох?"; Dialog.Singletone(или ссылка, как хочешь).ShowDialog(question, (isSuccess)=>{ if(isSuccess){ MakeAIAngry(); }else{ MakeAIYourFriend(); } }); }
>>705186 Нет, суть в том, что ты создаешь делегат и отдаешь его своему скрипту диалога, с этого момента выполнение скрипта закончилось и update метод работает как и всегда. Потом когда нажимаешь да или нет то у тебя сохранен делегат и он вызовется нормально. Там есть еще что улучшать, например сохраненный делегат (который callback(_result)) лучше обнулять после закрытия формы, короче просто попробуй так сделать, это не долго и не сложно.
Правильный ответ
Аноним20/10/20 Втр 11:27:58№705190414
>>705069 Делай в стиле ДОД. Возвращаемое диалогом значение - это данные. Состояние видимости диалога - это данные. Все данные пиши в базу данных, которую видит и скрипт диалоговых кнопок и скрипт вызывающего объекта. Логика вызывающего такова: Чекаю в БД поле диалог-открыт, если открыт - прерываю работу. В БД в поле диалог-результ записываю нулль. Вызываю диалог, передаю ему некоторый текст. В апдейте чакаю в БД, открыт ли диалог? Если диалог закрыт, чекаю в БД поле диалог-результ и действую соответствующе.
В диалоге логика: Я родился! Я записал в БД что я видимый. Я прочитал во входных данных текст и отобразил его. Если я стал невидимым, я записываю нет/отмена/ложь в БД. Если я стал невидимым, но кнопка да была нажата, я записываю в БД да/правда/ОК. В любом случае я обязательно что-то записываю в БД, иначе никак. Записываю в БД также, что я невидим. Умираю!
>>705190 Ты не ту задачу пришел сюда решать, у нас не модальные диалоги, а 1 инстанс больше не будет, понимаешь? нахуй нам бд нужно вообще, что ты несешь вообще
>>705191 а мне и не надобыло решать эту проблему, вопрос в другом был
Пытаюсь собрать несколько префабов в AssetBundle, пробовал разные способы из интернета, пробовал передавать в BuildPipeline.BuildAssetBundles() карту из префабов и все равно всегда Unity начинает обходить все ассеты в проекте, застревает на каждом проклятом png и весь процесс создания AssetBundle занимает больше двух часов. Гугл выдает только несколько несчастных, которых задаются тем же вопросом, что и я, и им просто никто не отвечает. Почему так долго? Почему Unity идет по каждому ассету, когда я вот прямо ей даю список, из которого я хочу получить AssetBundle? Может сейчас уже есть более удобная альтернатива бандлам? В документации написано: лучший совет по организации ассетов, не использовать Resources, а использовать AssetBundles.
Почему я не могу фэйд нормально сделать? Материал Standart, Rendering Mod Transparent, ошибка очевидно в коде, но я не могу найти проблему, скиньте как вы это используете.
>>705120 >Скажи это любому работодалю ну, ежели работодателю, то да... И там не только ООП надо знать, не так ли, а туеву кучу всего, без чего обычный инди-разработчик вполне может обойтись
>>705266 Ну для себя и узкого круга можно и говнокод пилить, конечно на уровне яндере симулятора, но мне кажется всяко лучше, если код чистый, красивый и понятный. Знание ООП, СОЛИДа и базовых патернов лишним всё равно никогда не будет.
Но в общем ты прав, конечно, для себя можно и без этого. но нахуя, если можно с?
Салам Алейкум Программисты и модельеры, есть функция на первой картинке, которая двигает обьект вилоситей и при ударении об стену вращает его на угол отражения, но, проблема в том что в первом случае отражается правильно, а во втором неправильно, подскажите пожалуйста, как пофиксить, а то я ебло 2 дня только рэйкаст писал
Помоги юнитач. Нужно сделать так, чтобы по тапу на экран блоки заполнялись зеленым. Есть нужные спрайты, но не понимаю как реализовать. Метод тапа и всё прочее уже готово, нужно просто чтобы зеленый спрайт было видно только внутри боксов. или может как-то можно слайдером реализовать или чем, я хз
Привет, девелопперы. Давно мечтаю сделать игру: 2D визуально-диалоговая песочница рпг... короче клон "Валета плетей". С юнити очень мало знаком, но кодить умею. Реквестирую план вкатывания, при котором потрачу минимум времени на изобретение окошек с кнопками, и максимум времени на логику с механиками. Может там в магазе есть фреймворки для визуальных новелл, или какие то удобные наборы компонентов? Или достаточно пару видосов глянуть, и уроков читнуть и никакие васяны не нужны?
>>698843 (OP) >>698843 (OP) Анончики, в юнити есть возможность прописать путь допустим звука, чтобы не назначать ручками этот звук каждому объекту со скриптом? Пользовался вот таким решением: _sound = (AudioClip)UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/_Data/Sound/SFX/menuTouch.wav", typeof(AudioClip)); но оно работает только в редакторе, и билд с таким кодом нельзя сделать, ошибка cs0234.
Есть массив, в нем изначально 0 элементов, я в него помещаю сначала первый объект, потом второй. Когда кол-во объектов достигает трех, мне нужно удалить первый объект. Короче суть в чем, максимум 2 объекта, если больше, то первый удаляется и в конец добавляется новый, но у меня какая-то проблема, я сделал вот так, но потом появляется баг из-за которого что-то не до конца очищается и объекты зависают и это действие не выполняется.