Unity ScriptableObject. Пишем простой инвентарь
Vložit
- čas přidán 10. 09. 2020
- Рассказываю про ScriptableObject - крайне полезный класс Unity для работы с данными и не только. А так же создаю простой инвентарь, чтобы показать, как можно пользоваться ScriptableObject на практике.
Поддержать канал на русскоязычном Boosty: boosty.to/insaneone
Или на Patreon: / insaneone
Discord-сервер канала: / discord
Группа VK: insaneoneblog
#Unity #РазработкаИгр
У меня на канале регулярно выходят новые видео с уроками по Unity и разработке игр, а так же другими интересными темами, связанными с геймдевом. Подписывайся!
Не забывай оставлять комментарий, если у тебя появились вопросы или предложения по видео :)
Привет. Некоторые моменты в видео получились очень быстрыми, но финальную версию ролика никак не удаётся отрендерить, я увидел столько разных вариаций ошибок при рендере, сколько не видел за всё предыдущее время ведения канала. Решил оставить эту. Поэтому, ставьте паузу, если не успеваете что-то прочитать по коду или понять, надеюсь этого хватит. :)
Пожалуйста, продолжай делать видео, у тебя очень круто получается. Качество просто на высоте и уроки очень полезные)
имелось ввиду что Resources Load плох когда не при старте игры данных подгружаются? или в целом. Как по мне это идеальный метод чтобы не заниматься перетягиванием 100 вещей и прочих обьектов в поля
@@arsenbabaev1022 Resources.Load сломается, стоит переименовать или перенести файл. Но да, имелось в виду что не стоит его использовать регулярно во время игрового процесса, если только один раз на старте, то на производительность это особо не повлияет, в рамках загрузочного экрана будет выглядеть нормально.
[Тупой зануда mode on] Выражаю свое ИМХО, в этом видео ScriptableObject раскрыт не полностью, на самом деле ScriptableObject позволяет проектировать гибкую архитектуру, в частности их очень удобно использовать для применения паттернов фабрики [Тупой зануда mode off]
@@sharpes4253 согласен, у ScriptableObject множество применений, но многие кейсы весьма специфические. Им, на мой взгляд, имеет смысл посвящать отдельные видео)
Спасибо огромное! Искал именно то что ты рассказал, у других либо много воды было, либо звук который при каждом нажатии на клавишу сбивал весь настрой смотреть видео, а тут все кратко понятно, без воды, с отличным звуком!!! Спасибо!
В очередной раз удостоверился, что ты лучший. Максимально просто объясняешь, продолжай в том же духе! Однозначно лайк
Лучший, спасибо! Отлично объяснил, помогло мне очень! (у тебя хороший тембр голоса для видео, приятный)
Отличное видео! Для меня было всё просто и понятно, но для многих оно покажется слишком быстрым и маленьким)
Ждем новых видосов. Я бы и стрим/вебинар посмотрел. Толковых людей мало.
Я в ах***е. Я за 6 минут видоса увидел столько полезной и хорошо объясненной информации.... Крепкого тебе здоровья и удачи. А с меня лайк и подписка.
Я ждал видос на эту тему, спасибо!
Отличный материалл! Приятно слушать
Было бы интересно посмотреть ролик о том, где можно хранить все возможные ресурсы игры. Например, про AssetBunlles. Как его использовать в локальной игре и при этом не забивать оперативку.
Мое почтение 🤝:) Понятно обьясняешь 👍
Очень полезно, спасибо за ролик!
Максимально быстро и непонятно. Спасибо, что заставил ставить на паузу каждую секунду видео чтобы понять, что ты вообще сделал в инспекторе
Спасибо за видос, очень полезно
Классный видос!
Очень круто!! Прям точку
благодарности
лаконично, с чувством и расстановкой
Спасибо, это бы здорово))
Спасибо огромное!!
Полезные ролики, спасибо. Но первый раз за все время пользования ютубом, приходиться не ускорять видео, а замедлять
Спасибо.Сними видео про свет
Доброго времени суток, у меня есть конкретный предмет на сцене с boxcolaider, как тогда использовать scriptableobject?
SO - очень крутая тема в Unity!
На основе него можно легко делать магазины в игре))
На мой взгляд, когда создаешь таким образом итемы, то было бы неплохо для них сделать кастомный инспектор, чтобы иконки лучше отображались например, или описание предмета было не в одну строчку.
А в остальном, ролик на высоте!
Для этого есть ассет Odin Inspector
@@bros_os чувак, два года прошло, я даже не знал тогда, что есть такой ассет.
@@psy_gamer бляяяя, сори
Очень крутой видеоролик, спасибо!
Привет всем, помогите пожалуйста с Google Play services, какой ключ SHA1 использовать: из консоли на компе или из Google Console, чтобы скачанная с гугл плей игра проходила авторизацию в гугл сервисах.
Самое полезное видео , которое я когда-либо видел .
Как записать список InventoryItems в PlayerPrefs? Нужно сохранения инвентаря, я пытался записать InventoryItems в PlayerPrefs через json, но у меня нечего не получилось
Всегда хотел туториал по этой штуке
жаль месяц назад, я об этом не знал)
А в объект на сцене никак нельзя добавить префаб? У меня на сцене находится объект с картинкой у которого есть скрипт с триггером, после которого он должен прикрепленный к нему префаб добавить в инвентарь игрока
Можно ли как-то стакать предметы через ScriptableObject?
Можешь пожалуйста подсказать как узнать айди материала?
"Ничего не рекомендуется" но мы это делаем) Ну хотяб описал бы причину почему не рекомендуется)
Все сделал как на видео, ушел от всех ошибок, а предметы не хотят появляться( что за UI объект был взят за основу для itemsPanel?
Подскажите пожалуйста выводит 2 ошибки что делать? (1. 'Inventory' does not contain a definition for 'InventoryItems' and no accessible extension method 'InventoryItems' accepting a first argument of type 'Inventory' could be found (are you missing a using directive or an assembly reference?) 2.The type or namespace name 'Image' could not be found (are you missing a using directive or an assembly reference?))
по моему перед InventoryItems нужно убрать [SerializeField] и поставить public, а вторая ошибка ты просто не указал image
@@ipeget 👍
Редко вижу, когда используют SerializeReference. 2:37 - Почему именно SerializeField, а не SerializeReference? Буду благодарен, если кто-то пояснит, может я что-то не понимаю и в данном случае ссылочный и значимый тип имеют свои обусловленности?
Можешь посмотреть в доках Unity, что сериализует SerializeField. Если класс, наследуется от MonoBehaviour, то проблем нет. Проблемы возникают, когда нужно сериализовать какую-то ссылку в виде интерфейса или абстрактного класса или любого класса, не наследуемого от UnityEngine.Object.
Т.е ты в коде пишешь это:
[SerializeField] private IKeyboard _keyboard;
Но SerializeField не позволяет такое сериализовать. Поэтому юзают SerializeReference, который недавно появился:
[SerializeReference] private IKeyboard _keyboard;
И теперь оно сериализуется и ты можешь в инспекторе перетащить любой компонент, который реализует интерфейс IKeyboard.
Привет, я пробовал создавать с помощью ScriptableObject листы с характеристиками предметов. Примерно как у вас. Но оно шикарно работает когда эти характеристики неизменяемые. Если же характеристику изменять - я не знаю как сделать оптимально. Например нужно создать топор. Я записываю в ScriptableObject всю информацию о нём: урон, цена продажи, модель в виде префаба и прочность оружия. Но если в игре топоров 5, мне для каждого нужно создавать свой ScriptableObject, т.к. ломаются топоры не одинаково быстро. А если топоров 100? 1000? Если оставлять один ScriptableObject, то естественно смена значения поля "Прочность" ведёт к смене её у всех топоров. Как в этом случае оптимально поступать?
В случае, если все топоры ломаются с разной скоростью, то тут дело не в подходе к редактированию данных, это будет долго в любом виде. Если есть несколько разных вариантов поломки, то можно сделать отдельный тип ScriptableObject, который будет описывать прогресс поломки, сделать нужное количество вариаций, потом группами выделять топоры к которым оно применимо, и задавать просто туда ссылкой этот новый ассет. Если это простая характеристика по типу float или подобное числовое значение, то смысла делать отдельный ScriptableObject-тип нет, проще сделать какое-то хранилище со списком таких значений, а в параметрах топора задавать id нужной поломки в этом списке или нечто подобное.
Твой голос очень похож на голос ютубера по игре VALORANT "embrace me"
а где скрипты посмотреть?
Привет, тебе можно заказать работу ?
привет, понравился урок, правильно ли понимаю, что ScriptableObject следует использовать только когда нужно сохранить данные при переходе между сценами, а то что хранится в одной сцене можно и в обычных переменных
и подойдет ли такой подход для условного клона доты(пример для понимания), типа храним все абилки персонажа, все предметы из магазина, в таких вот ScriptableObject? но в таком случае же не нужно переносить обьект из сцены в сцену по этому подойдет ли такой подход?
Непосредственного отношения к переходу между сценами ScriptableObject не имеет. В контексте урока - это просто удобное хранилище любых данных, в том числе абилок, параметров предметов и прочего. Альтернатив, которые были бы удобнее, в Unity нет. Можно использовать свой формат, но нужно понимать, для чего ты это делаешь, иначе, ScriptableObject - основной инструмент для этой цели.
@@insaneone-7220 благодарю , еще почитал, уже понял)
Вы не знаете почему у меня с каждым разом при нажатии на E прибавляется всё больше и больше предметов?
Где хранить данные, настройки и прочие вопросы. В чем плох подход с хранением в БД? Все данные храним в БД и получаем всю мощь современной СУБД для хранения, выборки, миграции данных - никаких ограничений и решение любых задач с данными оптимальным способом. Стандарт де факто.
Данные из БД один раз загружаем в класс - статический класс, при запуске игры. Доступ к статическому классу и изменения данных в нем, получаем из любого места в коде, без использования объектов, префабов, DontDestroyOnLoad и т.д. При завершении игры сохраняем данные из класса в БД.
Идеально. Если нужно, можно писать/читать из БД в любое время.
Когда в инвентарь добавляется несколько топоров, то все они разные? То есть если я поменяю значение цены одного топора в инвентаре, то поменяется ли цена другого топора в этом инвентаре?
Да, поменяется
@@tnak7947 И в чем тогда смысл?) Спасибо
@@user-gh9wi3ro5f Ну смотри. Ты можешь создать 1 ScriptableObject топора с нужными характеристиками и ценой. И поместить 3 таких топора в инвентарь. Можешь создать ещё один вид топора, у которого будут другие характеристики и цена, и положить его тоже в инвентарь.
В итоге у нас будет 3 топора одного вида и один другого вида. Естественно мы можем хоть тысячу ScriptableObject-ов создать с разными параметрами.
Это помогает расширять контент игры без изменения кода и других вещей. Ну и это удобнее, чем задавать это в коде или в инспекторе.
@@tnak7947 подскажите пж , мне надо так называемые way pointы создавать , на них варианты поведения для объекта , у каждого wp одинаковые свойства для однотипных объектов , сейчас я просто размножаю префаб этого wp с навешанным на него скриптом - те ставится множество wp и у каждого разные значения свойств , не могу тупо уловить переходить ли на SO ? , когда то смотрел изучал его , но че то чую опять неделька улетит пока разберешься по новой)
спс
@@BastionKadabr Да, можно переходить. В данном случае вы можете не только вывести свойства/данные в SO, но и вынести поведение. Я вроде даже видел тутор у CodeMonkey, где он делал такую систему с WayPoint-ами, чтобы легко создавать "скрипты" (для кат-сцен например) поведений в сцене, не написав ни одной строчки кода.
Что у тебя за программа для написания кода?
JetBrains Rider
Слишком быстро, чтобы можно было что-то понять для новичка. Я то смотрю это видео потому что не знаю как это делать. А тут с такой скоростью всё идёт и переходит от одного скрипта к другому, что ничего не понятно.
Ничего не понятно, половину действий пропустил, спасибо!
Для тех, у кого будет проблема с объектом Image в InventoryWindow - в том же скрипте прописываем using UnityEngine.UI, в icon.AddComponent заменяем на , и ошибка исчезнет.
Какой редактор ты используешь?
JetBrains Rider
Чего-то я вообще не понял, что за метод "Redraw", где он вызывается, потому что мне он бьёт ошибки ?
не показали этого в видео)
Отличный контент для тех кто уже шарит за программирование и просто меняет технологию, для совсем новичков конечно лучше подыскать что нибудь более разжеванное.
Я, наверное, опоздал с вопросом, но всё же: что делать, если есть несколько типов предметов, и у каждого свои параметры? У оружия - урон, у еды - насыщение и тд. Как поступить в данной ситуации? Я делал персональные параметры с помощью dictionary, а как правильно - не знаю.
Как вариант - сделать базовый класс Item, а от него наследовать несколько разных типов предметов. Это первое, что на ум приходит, так вариантов конечно много, и через композицию можно, и просто засунуть все параметры в один класс и по какому-нибудь enum кастомно их выводить в настройках) Как больше удобно в конкретной ситуации, так и стоит делать, единственно правильного варианта точно не существует.
@@insaneone-7220 спасибо большое за ответ)
стараюсь не использовать ScriptableObject, все данные храню в json намного надежней и в некоторых местах удобней чем ScriptableObject, а геймдизайнерам вообще нечего работать в основном проекте, лучше парсер данных из екселя или гугл таблиц в json за пару минут написать, чем восстанавливать то, что смержил в гите геймдизайнер)
Да и геймдизайнеру удобнее и привычнее его гугл таблица. Но использовать повсеместно json это всё-таки странно, когда есть встроенный в движок инструмент, который за минуту позволяет создать класс параметров. Парсить везде вместо этого json и редактировать его, как мне кажется, менее удобно и оптимально.
@@insaneone-7220 на ScriptableObject могут быть проблемы по крайней мере у меня на версии юнити 2017 очень часто слетали ссылки в ScriptableObject, юнити иногда не предсказуемо себя ведет и могут быть разные краши и вылеты
парсить и редактировать json только кажется, что не удобно, для парсинга использую этот ассет assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347
конечно если делать гиперказуалки или платформеры, где можно обойтись одним ScriptableObject будет не целесообразно использовать json, но в более крупных проектах уже лучше использовать json
тем более если использовать json, то может просто отпасть необходимость постоянно компилировать игру или приложения ради изменения какого то параметра, тем более json можно на сервер закинуть и обновленные данные юзер будет сходу получать без обновления приложения или вообще можно сделать чтоб прям с гугл таблиц данные в игру залетали
в json можно записать данные практически любой сложности со ScriptableObject так не выйдет, придется писать свои PropertyDrawer, что иногда очень трудозатратно
также json удобен если планируется в игре сторонние модификации от юзеров, я например в своем проекте могу полностью изменять или добавлять юнита внося или удаляя пару строчек в json файле, тоесть игровой юнит практически полностью на лету формируется из json данных, мне не надо создавать для каждого игрового юнита отдельный префаб(я правда щас не на юнити эту игру делаю, но смысл понятен) вешать на него компоненты, все описывается в файле и это не только внешний вид, а и его поведение.
Не работает. Бился часа 4. Метод привлекательный, но похоже до ума не доведен. Уже на 3м скрипте начинается лажа. объекты не добавляются на панель. Все прочекал. Код до милиметров 1 в 1 переписал, хотя бы чтобы понимать как должно работать. Все скрипты развесил как указано в видео. Не работает.
было бы неплохо если бы ты заливал код с урока на гит, чтобы можно было взять в проект без переписывания по видео
@bitmap дивжоп
Делать так не рекомендуется - но кого это останавливает, логика крутая
За идею - спасибо. А вот как пошаговая инструкция - имеет миллион ошибок и к использованию не подлежит. Корректней было бы строить абстрактный урок о ScriptableObject без демонстрации последовательности.
Каким волшебным способом созданные спрайты(gameObject) попадают itemsPanel без указания родителя? Или что/кто инициализирует функцию Redrow() которая просто висит где-то на объекте и тд.
Те кто жалуются что быстро. А поставить скоромть воспроизведение поменьше нельзя?
Норм ролики у тебя. Но блин ты когда кд допечатал, оставь хотя бы на две секунды, чтоб успеть разглядеть что там, итак эта штука маячит весь код закрывает, так потом шлеп и все уже другой кадр. Приходится отлавливать паузой. А так как все молниеносно иногда приходится ползунок дуда сюда таскать. Это практически всегда так. Начало напрягать блин. А в остальном контент супер! Спасибо!
Прочитай пожалуйста закреплённый комментарий) В следующих видео буду это учитывать.
@@insaneone-7220 что то ты как то не надежно прикрепил коментарий))) спасибо за труд, смотрю сейчас про оптимизацию ролики твои🙂
@@eugenekrutoy1475 Ютуб шутить изволил, я точно помню, что закреплял :D
Да уж. Можно еще побыстрее? На отматывание 10-15 минут прошло + ничего не получилось
Попробуй скорость видео меньше поставить
Так это не урок
У меня почему-то не работает вывод предметов на экран. Ошибок нет, все делал по туториалу. Таймкод - 3:03
У меня такая же проблема, автор чуть позже показывает что он исправил в коде несколько строк и не показал этого сразу. Но у меня тоже всё равно не работает.
Скорее всего не все поправили. Он в Inventory Start() на Awake() заменил, иначе предметы из стартового набора не успевают попасть в инвентарь до его вывода в панели. И в методе Redraw() должна быть строка icon.transform.SetParent(itemsPanel); чтобы иконка попала в панель
@@user-lo5gm9xx9w Спасибо большое. Твой коммент очень помог
То же самое - час бился. Смог одолеть только создав префаб имэджа, который инстантиирую вместо просто создания нового геймобджекта
Вот так всегда - у одного получасовой ролик с кучей ненужной инфы, у другого 5 минут практически без разбора кода. 3 года в геймдеве, а скриптаблы походу не выучу
у меня статический класс
Ну правильный способ тебе подсказали
Тоже вариант, но я постепенно ушёл от использования статик класса для такой цели после того, как узнал о ScriptableObject)
ЯРОСНА СОГЛАСЕН С КОММЕНТЕРОМ НИЖЕ
Очень быстро.
Че нагарадил.. Ты для кого видео снимаешь.. Для гуру юнити которые и так все знают..