ScriptableObject в Unity на примере информации о сундуках

  Рет қаралды 18,911

Лавка Разработчика

Лавка Разработчика

3 жыл бұрын

Поддержи канал, бро!
paypal.me/gamedevlavka - мир
boosty.to/gamedevlavka - рф
И даже криптой (пока только Ethereum):
0x7a53325D1C36Eea7BbE8C6a8D00f2a0efd580e77
Для многих ассетов необходимы данные - название, описание, ссылка на иконку, может быть какие-то дополнительные настройки. Для подобных задач в Unity3D придуман класс ScriptableObject. Что это такое и как его использовать, разбираем на примере сундуков (простой, редкий, легендарный).
Также подписуйся на канал в телеге, или на твиттер, там я публикую коротенькие типсы и практики, которые помогут писать код лучше, понятнее и эффективнее:
Telegram: t.me/gamedevlavka
Twitter: / gamedevlavka

Пікірлер: 76
@Roman_SBB
@Roman_SBB 3 жыл бұрын
Спасибо, что увеличиваешь окно IDE, на телефоне тоже код видно👍
@nikto_hin897
@nikto_hin897 2 жыл бұрын
4 видео пол статьи прочитал , и наконец тихий и спокойный подробный разбор , спасиба , не досмотрел но уже нравиться
@nikto_hin897
@nikto_hin897 2 жыл бұрын
жаль что походу это не то что мне нужно (грусный смайлик)
@azogblog
@azogblog 3 ай бұрын
Спасибо, было очень полезно!
@EAGames_unity
@EAGames_unity 3 жыл бұрын
Отличный материал!
@vssq
@vssq Жыл бұрын
Спасибо большое! Всё понятно и приятно объясняешь. Я так понимаю на эти объекты универсальные характеристики накидываются и используются в игре
@artemignat7764
@artemignat7764 2 жыл бұрын
По моему мнению твой канал самый полезный, среди русскоязычных туториалов.
@artemkorotkov9770
@artemkorotkov9770 3 жыл бұрын
СПАСИБО!!!!
@GamDevRus
@GamDevRus Жыл бұрын
Крутая тема!!!
@vicmeateater5508
@vicmeateater5508 2 жыл бұрын
Спасибо за видео! В который раз убеждаюсь, что канал просто находка! Единственное, пока слушаешь всё понятно, но если бы еще явные примеры были, как это применять в игре, было бы супер. Я например открываю проект и начинаю тупить, не знаю, как впихнуть знания ))) Наверно у всех ньюфагов такая беда. Вообще бы запилить стрим, создание простенькой игры с 0. Видел зарубежные коллеги такое практикуют.
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Про то, как применять в игре - услышал, подумаю, как можно сделать. А вот со стримом - сложности, т.к. мой контент направлен на развитие мышления разработчика, чтобы потом получить работу или самому делать игры. За один стрим игру с хорошим кодом не напишешь)
@vicmeateater5508
@vicmeateater5508 2 жыл бұрын
@@gamedevlavka Спасибо за ответ. Согласен, концепцию канала не надо менять, большая редкость в РУ сегменте. Планируются видео про MVC + Unity? Весьма актуальная тема, т.к. подавляющее большенство RU Unity (Рунити %)) ) разработчиков, которые решились перейти на архитектуру, используют именно MVC... А по ECS?
@gamedevlavka
@gamedevlavka 2 жыл бұрын
@@vicmeateater5508 Когда-нибудь и до них руки дойдут :)
@sergeyvvedenskyi4866
@sergeyvvedenskyi4866 Жыл бұрын
Видео очень информативное, твой канал очень помогает развиваться в данной сфере, остался один вопрос, по функциональности очень похожу на обычный префаб, так чем отличается ScriptableObject от Prefab ?
@misenikolai9032
@misenikolai9032 Жыл бұрын
спасибо
@GGamess
@GGamess Жыл бұрын
жесть, насколько просто вы объяснили сложную для понимания модель сохранения данных)
@fjas5925
@fjas5925 4 ай бұрын
Так в каком месте оно сложное? Но да, автор очень хорошо объясняет тему
@atmgaming096
@atmgaming096 2 жыл бұрын
Очень короткое, но полезное видео
@requiem_for_a_dream5463
@requiem_for_a_dream5463 Жыл бұрын
Спасибо за видео. Впринципе осталось только цену придумать легендарному и редкому сундукам и можно в Юбисофт идти.
@toxicknight3079
@toxicknight3079 3 жыл бұрын
Позволю себе пару замечаний: 1. Писать this в свойствах (например this._id) не нужно. Нижнее подчеркивание в именах приватных полей как раз и пишут, чтобы не нужно было постоянно писать "this". 2. Свойства принято именовать с большой буквы. Рад, что нашел твой канал, очень круто и понятно объясняешь, и видео выходят чуть ли не каждый день. Спасибо :)
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Отвечу на пару замечаний) 1. this я пишу всегда в локальных переменных. Почему? Об этом я писал в телеграм канале тут t.me/gamedevlavka/15. Нижнее подчеркивание я использую тогда, когда нужно использовать такое же имя, как у свойства, но чтобы я мог менять его через редактор. 2. Так принято в венгерской нотации (по классике), да. Однако, внутри Unity все свойства пишутся с маленькой буквы, и чтобы мой код не отличался от кода Unity, я решил, что также буду использовать маленькую первую букву и для свойств. Спасибо за комментарий :)
@toxicknight3079
@toxicknight3079 3 жыл бұрын
@@gamedevlavka, тут скорее момент, что если пойти работать на дядю, то там обычно придерживаются код стайла C#, поэтому может быть неприятно переучиваться. Лично я для себя выбрал сразу привыкнуть к общепринятому именованию, чтоб меньше головняка было.
@gamedevlavka
@gamedevlavka 3 жыл бұрын
@@toxicknight3079 я и есть такой дядя :)
@Dmittry
@Dmittry Жыл бұрын
@@toxicknight3079 У разных дядь разные кодстайлы приняты. Есть стиль, который больше похож на Джаву, есть, который Майкрософт у себя написала. Например, лично мне открывающая фигурная скобка на новой строке кажется менее удобной, чем в конце предыдущей (вместо увеличения читабельности варит лапшу). И я видел много на Ютубе, кто пишет в джавовском стиле, кто в смешанном, кто по Майкрософту. Так что если ты придерживаешься хоть какого-то более-менее распространённого и адекватного стиля, то уже хорошо. Тут нет единого железобетонного стандарта. И стиль Майкрософта нравится далеко не всем.
@vlader776
@vlader776 Жыл бұрын
Добрый день, появился вопрос по ScriptableObject. Создал с помощью ScriptableObject описание оружия для шутера, в котором хранится префаб оружия, скорострельность, обьем магазина и метод стрельбы через Raycast. На основе данного шаблона создал ассет винтовки. Создал скрипт, который принимает в поле данную винтовку и вызывает метод Shoot(), у Player через инпут, а у Enemy, если в его поле видимости зашел Player, однако при нажатии кнопки выстрела стреляет только оружие врага, при этом если войти в поле видимости враг тоже стреляет! Решил продублировать ассет винтовки и дать врагу, то все работает как было задумано.
@EAGames_unity
@EAGames_unity 2 жыл бұрын
Если что то непонятно с миллиарда других гайдов, заходишь на данный канал, находишь нужную тему, если такая имеется и все становится легче, проще, понятней и интересней). Уже не раз выручал в этом плане. Конечно изначально все пытаются находить инфу на живых примерах, и я так же, но почти всегда, на живых примерах объсняется менее понятно и доступно, чем это делаешь ты)
@liorgisoritto8495
@liorgisoritto8495 3 жыл бұрын
Андрей, добрый день. Спасибо за видео. А можете еще рассказать, как переносить данные из сцены в сцену. Например, мы прошли уровни и заработали монеты и рубины. Когда мы вернулись на главную карту после уровня, заработанные монеты и рубины добавились к их общему количеству. Думаю подобное очень актуально, заранее спасибо ❤
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Это вопрос архитектуры, доберёмся и до него!
@user-yx5mb4sz9t
@user-yx5mb4sz9t 2 жыл бұрын
Ну по идее используя Scriptable object это легко реализуется, т.к. они сохраняют все данные на жёстком диске.
@tomasgammister5776
@tomasgammister5776 2 жыл бұрын
@@user-yx5mb4sz9t слышал про то что они не попадают в билд. Может не правильно понял...
@user-ut1ll4wi6s
@user-ut1ll4wi6s 6 ай бұрын
вопрос... Ну мало ли время будет на глупые вопросы. var _hero = Resources.Load(""); пытался так вот файлик получить прилетает null. то есть если его в инспекторе прокидываешь все работает. если собираешь в массив все работает. а если просто в переменную пытаюсь закинуть то нифига не работает ...странно просто как то
@user-up6bz2se1t
@user-up6bz2se1t Жыл бұрын
Вот у меня задача при смене оружия, чтобы патроны одного оружия не ссылались на уже патроны другого оружия, тут подойдет ScriptableObject?
@KadykovDenis
@KadykovDenis 10 ай бұрын
я так и не понял для чего нужен этот гемор? Почему просто в обыкновенном префабе в проекте не держать ссылку на иконку сундука, саму 3д модель, сколько монет он содержит и многое другое?
@vicktoriashepard
@vicktoriashepard 2 жыл бұрын
Хм, про безопасность полей это вполне очевидно, но архитектура на so подразумевает запись данных в поля. С префиксом [nonserialised] дабы не сохранять данные из runtime в ассете. Да и вопрос что можешь сказать по архитектуре на SO ? Плюсы, минусы? Спасибо за видео!
@nightyonetwothree
@nightyonetwothree 2 жыл бұрын
для записи лучше использовать методы для тех же полей, что бы логика записи данным была внутри самого объекта и он мог валидировать всё
@aleksey2793
@aleksey2793 6 ай бұрын
А почему _id здесь string, а не enum?
@-._63
@-._63 2 жыл бұрын
Но что лучше использовать? Структуры или SO?
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Это разные типы данных для разных задач. SO для хранения и использования конфигурации, структуры - для быстрого и наименее ресурсозатратного использования данных. Кроме того, SO - ссылочный тип, а структуры - значимый, со всеми вытекающими последствиями. Для более детального понимания рекомендую глянуть видео с типами данных на канале
@goga19980
@goga19980 3 жыл бұрын
Кстати, в чем разница private void Start() от void Start()?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Функционально - ни в чем. Дело в читабельности. Писал об этом тут => t.me/gamedevlavka/7
@goga19980
@goga19980 3 жыл бұрын
@@gamedevlavka на телегу подписан, не листал:D Теперь стоит))) Ну вообще я их не писал только в Start Update и подобных, так, в принципе, это логично)
@ThePirateHistory
@ThePirateHistory 3 жыл бұрын
Зачем SerializedField так и не понял, посмотрел фулл видос, обещание словил что дальше объяснение будет и все, так же почему с нижним подчеркиванием тоже не понятно, насколько я знаю допустим из питона нижние подчеркивание, при импорте import library не импортирует то что написано с нижним подчеркиванием.
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Хороший вопрос. Ответ писал тут: t.me/gamedevlavka/13
@SeempleIQ
@SeempleIQ 2 жыл бұрын
через [field: serializeFIled] можно сериализовать проперти, и не придется писать каждый раз пару филд + проперти.
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Автопроперти - это фишка C#, но она еще не была официально добавлена в Unity, что означает, она работает нестабильно. Например, существуют проблемы с переопределением свойств в Prefab Variants.
@MrGoldorange
@MrGoldorange 2 жыл бұрын
Все никак не возьму в толк, по сути единственное преимущество и надобность(перед просто префабом) в том что можно создавать их из меню?
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Префаб - шаблон игрового объекта. ScriptableObject - объект с информацией, конфиг, он нужен для хранения информации. У одного не может быть преимущества перед другим, потому что они созданы для разных целей. Конечно, ты можешь сделать конфиг и в качестве префаба, но это все равно что из пушки по воробъям стрелять.
@MrGoldorange
@MrGoldorange 2 жыл бұрын
@@gamedevlavka огромное спасибо что отвечаешь и объясняешь!)
@ec6189
@ec6189 2 жыл бұрын
@@gamedevlavka А почему не создать просто класс Config ? Для чего нужен именно ScriptableObject, пока вижу преимущество только в том, что: 1. Его не нужно инициализировать (Но это решается на уровне архитектуры, создаем объектный пулл и инжектим туда) 2. Можно добавить в контекстное меню
@andrewalexart
@andrewalexart 2 жыл бұрын
Не совсем понятно. Если пишешь [serialisable field] для private переменной то ведь ты и так можешь менять значения ТОЛЬКО в инспекторе. Или я не так что то понял...
@isoldpower
@isoldpower 2 жыл бұрын
все верно, только вот получать данные публично тоже надо. В этом и проблема
@developerazcom
@developerazcom 3 жыл бұрын
стоит ли применить принципы СОЛИД в Юнити?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Обязательно!
@developerazcom
@developerazcom 3 жыл бұрын
@@gamedevlavka а в будушем в вашим канале будет такое видео где покажете приминение солид в скирптах юнити?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
@@developerazcom SOLID Применяется независимо, в юнити ты работаешь или нет. Но устроить можно.
@developerazcom
@developerazcom 3 жыл бұрын
@@gamedevlavka было бы круто
@user-ud4wo7rw4k
@user-ud4wo7rw4k 2 жыл бұрын
@@gamedevlavka ждём!!! :)
@user-yx5mb4sz9t
@user-yx5mb4sz9t 2 жыл бұрын
Ну по сути scriptable object это сериализуемая структура получается. За исключением того что можно создавать обьекты в юнити.
@user-tv7kg9vy7u
@user-tv7kg9vy7u 3 жыл бұрын
А почему Вы всегда явно пишите слово private? Отсутствие модификатора доступа вообще ведь тоже самое, что и private. Т.е. чуточку короче запись получается.
@gamedevlavka
@gamedevlavka 3 жыл бұрын
В таком случае отсутствия private методы и переменные уже не выглядят унифицировано, а следовательно при беглом чтении кода создается маленький хаос в голове. Удобнее читать, когда все методы и переменные выглядят одинаково. Это такой маааленький пенёк, об который спотыкаешься при чтении, если не писать.
@Maximka_23
@Maximka_23 2 ай бұрын
Где пчелиная война 2?
@NewUser78654
@NewUser78654 5 ай бұрын
Скажу сразу - в ООП программировании далеко не джун. Изучаю юнити. И зачем ScriptableObject? Нам нужен сундук. Пишем скрипт для сундука, указываем в нем необходимые поля (сериализуемые-доступные из редактора), скрипт прикрепляем к сундуку. Всё. Один сундук в префабах, к нему подключен скрипт. Там есть выпадающее поле (enum) какой это сундук (обычный, необычный и т.д.). Удобно. Никаких меню с 1000 сундуков, кучи объектов в ресурсах и т.д. Смысл ScriptableObject?
@ViATVmy
@ViATVmy 3 жыл бұрын
id => this._id почему нельзя просто так id = this._id ?? в чем разница между ними ?
@gamedevlavka
@gamedevlavka 3 жыл бұрын
Это сокращенное написание свойства: string id { get { return this._id; } } Согласись, написать string id => this._id гораздо быстрее, короче и аккуратнее
@gamedevlavka
@gamedevlavka 3 жыл бұрын
В первом случае это свойство только с возможность чтения, а I'd = this._id это присваивание, нам присваивать ничего не нужно, только возвращать (читать)
@kriegsmarine6935
@kriegsmarine6935 Жыл бұрын
Абсолютно непонятно на кой такое удовольствие. Чем это отличается от создание обычного класса с 3 полями? Нужно будет 3 сундука - сделаешь префабы. Что так у тебя 3 объекта лежат в директории, что эдак будут. Только при этом на префабы еще всякие интересные вещи по типу риджидбоди или коллайдера накинуть можно
@dmytromahas9207
@dmytromahas9207 2 жыл бұрын
Почему нельзя одной строчкой записать приватный ID ? [SerializeField] public string _id {get; private set; }
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Потому что редактор не умеет отображать свойства
@dmytromahas9207
@dmytromahas9207 2 жыл бұрын
@@gamedevlavka Не совсем понял как редактор отображает свойства, можете поподробней объяснить? Большое Вам спасибо.
@gamedevlavka
@gamedevlavka 2 жыл бұрын
Свойства он никак не отображает. Если вы напишете строчку, как предложили, вы не сможете задать ее через редактор
@anatoliydingo2200
@anatoliydingo2200 2 жыл бұрын
@@gamedevlavka [field: SerializeField] это на автосвойства, а если надо с логикой в сеттере то погугли [SerializeProperty]
Архитектура проекта в Unity. Часть 1
20:52
Лавка Разработчика
Рет қаралды 35 М.
Clowns abuse children#Short #Officer Rabbit #angel
00:51
兔子警官
Рет қаралды 54 МЛН
Этот Пёс Кое-Что Наделал 😳
00:31
Глеб Рандалайнен
Рет қаралды 4,2 МЛН
Как импортировать конфиги из гугл таблиц в Unity
26:31
Лавка Разработчика
Рет қаралды 2,4 М.
Настраиваем Animator в Unity
13:50
Лавка Разработчика
Рет қаралды 10 М.
Unity ScriptableObject. Пишем простой инвентарь
6:08
Insane One - Разработка игр
Рет қаралды 45 М.
Пишем гибкий сервис сохранений в Unity (Storage Service)
24:53
Лавка Разработчика
Рет қаралды 8 М.
[UNITY] Что такое Scriptable Objects в Unity?
7:11
n.fridman
Рет қаралды 6 М.