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

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

КОМЕНТАРІ • 76

  • @Roman_SBB
    @Roman_SBB 3 роки тому +25

    Спасибо, что увеличиваешь окно IDE, на телефоне тоже код видно👍

  • @nikto_hin897
    @nikto_hin897 2 роки тому +8

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

    • @nikto_hin897
      @nikto_hin897 2 роки тому

      жаль что походу это не то что мне нужно (грусный смайлик)

  • @EAGames_unity
    @EAGames_unity 3 роки тому +1

    Отличный материал!

  • @artemignat7764
    @artemignat7764 2 роки тому +2

    По моему мнению твой канал самый полезный, среди русскоязычных туториалов.

  • @azogblog
    @azogblog 4 місяці тому +1

    Спасибо, было очень полезно!

  • @vssq
    @vssq Рік тому +1

    Спасибо большое! Всё понятно и приятно объясняешь. Я так понимаю на эти объекты универсальные характеристики накидываются и используются в игре

  • @GamDevRus
    @GamDevRus Рік тому +1

    Крутая тема!!!

  • @artemkorotkov9770
    @artemkorotkov9770 3 роки тому +2

    СПАСИБО!!!!

  • @vicmeateater5508
    @vicmeateater5508 2 роки тому +10

    Спасибо за видео! В который раз убеждаюсь, что канал просто находка!
    Единственное, пока слушаешь всё понятно, но если бы еще явные примеры были, как это применять в игре, было бы супер.
    Я например открываю проект и начинаю тупить, не знаю, как впихнуть знания ))) Наверно у всех ньюфагов такая беда.
    Вообще бы запилить стрим, создание простенькой игры с 0. Видел зарубежные коллеги такое практикуют.

    • @gamedevlavka
      @gamedevlavka  2 роки тому

      Про то, как применять в игре - услышал, подумаю, как можно сделать.
      А вот со стримом - сложности, т.к. мой контент направлен на развитие мышления разработчика, чтобы потом получить работу или самому делать игры. За один стрим игру с хорошим кодом не напишешь)

    • @vicmeateater5508
      @vicmeateater5508 2 роки тому

      @@gamedevlavka Спасибо за ответ. Согласен, концепцию канала не надо менять, большая редкость в РУ сегменте.
      Планируются видео про MVC + Unity? Весьма актуальная тема, т.к. подавляющее большенство RU Unity (Рунити %)) ) разработчиков, которые решились перейти на архитектуру, используют именно MVC...
      А по ECS?

    • @gamedevlavka
      @gamedevlavka  2 роки тому

      @@vicmeateater5508 Когда-нибудь и до них руки дойдут :)

  • @sergeyvvedenskyi4866
    @sergeyvvedenskyi4866 Рік тому +1

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

  • @atmgaming096
    @atmgaming096 2 роки тому +1

    Очень короткое, но полезное видео

  • @misenikolai9032
    @misenikolai9032 Рік тому +1

    спасибо

  • @requiem_for_a_dream5463
    @requiem_for_a_dream5463 Рік тому +1

    Спасибо за видео. Впринципе осталось только цену придумать легендарному и редкому сундукам и можно в Юбисофт идти.

  • @vlader776
    @vlader776 Рік тому

    Добрый день, появился вопрос по ScriptableObject. Создал с помощью ScriptableObject описание оружия для шутера, в котором хранится префаб оружия, скорострельность, обьем магазина и метод стрельбы через Raycast. На основе данного шаблона создал ассет винтовки. Создал скрипт, который принимает в поле данную винтовку и вызывает метод Shoot(), у Player через инпут, а у Enemy, если в его поле видимости зашел Player, однако при нажатии кнопки выстрела стреляет только оружие врага, при этом если войти в поле видимости враг тоже стреляет! Решил продублировать ассет винтовки и дать врагу, то все работает как было задумано.

  • @GGamess
    @GGamess Рік тому +2

    жесть, насколько просто вы объяснили сложную для понимания модель сохранения данных)

    • @fjas5925
      @fjas5925 4 місяці тому

      Так в каком месте оно сложное?
      Но да, автор очень хорошо объясняет тему

  • @EAGames_unity
    @EAGames_unity 2 роки тому +1

    Если что то непонятно с миллиарда других гайдов, заходишь на данный канал, находишь нужную тему, если такая имеется и все становится легче, проще, понятней и интересней). Уже не раз выручал в этом плане. Конечно изначально все пытаются находить инфу на живых примерах, и я так же, но почти всегда, на живых примерах объсняется менее понятно и доступно, чем это делаешь ты)

  • @toxicknight3079
    @toxicknight3079 3 роки тому +6

    Позволю себе пару замечаний:
    1. Писать this в свойствах (например this._id) не нужно. Нижнее подчеркивание в именах приватных полей как раз и пишут, чтобы не нужно было постоянно писать "this".
    2. Свойства принято именовать с большой буквы.
    Рад, что нашел твой канал, очень круто и понятно объясняешь, и видео выходят чуть ли не каждый день. Спасибо :)

    • @gamedevlavka
      @gamedevlavka  3 роки тому +4

      Отвечу на пару замечаний)
      1. this я пишу всегда в локальных переменных. Почему? Об этом я писал в телеграм канале тут t.me/gamedevlavka/15. Нижнее подчеркивание я использую тогда, когда нужно использовать такое же имя, как у свойства, но чтобы я мог менять его через редактор.
      2. Так принято в венгерской нотации (по классике), да. Однако, внутри Unity все свойства пишутся с маленькой буквы, и чтобы мой код не отличался от кода Unity, я решил, что также буду использовать маленькую первую букву и для свойств.
      Спасибо за комментарий :)

    • @toxicknight3079
      @toxicknight3079 3 роки тому +3

      @@gamedevlavka, тут скорее момент, что если пойти работать на дядю, то там обычно придерживаются код стайла C#, поэтому может быть неприятно переучиваться.
      Лично я для себя выбрал сразу привыкнуть к общепринятому именованию, чтоб меньше головняка было.

    • @gamedevlavka
      @gamedevlavka  3 роки тому +11

      @@toxicknight3079 я и есть такой дядя :)

    • @Dmittry
      @Dmittry Рік тому

      @@toxicknight3079 У разных дядь разные кодстайлы приняты. Есть стиль, который больше похож на Джаву, есть, который Майкрософт у себя написала. Например, лично мне открывающая фигурная скобка на новой строке кажется менее удобной, чем в конце предыдущей (вместо увеличения читабельности варит лапшу). И я видел много на Ютубе, кто пишет в джавовском стиле, кто в смешанном, кто по Майкрософту. Так что если ты придерживаешься хоть какого-то более-менее распространённого и адекватного стиля, то уже хорошо. Тут нет единого железобетонного стандарта. И стиль Майкрософта нравится далеко не всем.

  • @user-ut1ll4wi6s
    @user-ut1ll4wi6s 6 місяців тому

    вопрос...
    Ну мало ли время будет на глупые вопросы.
    var _hero = Resources.Load("");
    пытался так вот файлик получить прилетает null.
    то есть если его в инспекторе прокидываешь все работает.
    если собираешь в массив все работает.
    а если просто в переменную пытаюсь закинуть то нифига не работает ...странно просто как то

  • @liorgisoritto8495
    @liorgisoritto8495 3 роки тому +5

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

    • @gamedevlavka
      @gamedevlavka  3 роки тому +1

      Это вопрос архитектуры, доберёмся и до него!

    • @user-yx5mb4sz9t
      @user-yx5mb4sz9t 2 роки тому

      Ну по идее используя Scriptable object это легко реализуется, т.к. они сохраняют все данные на жёстком диске.

    • @tomasgammister5776
      @tomasgammister5776 2 роки тому

      @@user-yx5mb4sz9t слышал про то что они не попадают в билд. Может не правильно понял...

  • @KadykovDenis
    @KadykovDenis 11 місяців тому

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

  • @user-up6bz2se1t
    @user-up6bz2se1t Рік тому

    Вот у меня задача при смене оружия, чтобы патроны одного оружия не ссылались на уже патроны другого оружия, тут подойдет ScriptableObject?

  • @-._63
    @-._63 2 роки тому +1

    Но что лучше использовать? Структуры или SO?

    • @gamedevlavka
      @gamedevlavka  2 роки тому

      Это разные типы данных для разных задач. SO для хранения и использования конфигурации, структуры - для быстрого и наименее ресурсозатратного использования данных. Кроме того, SO - ссылочный тип, а структуры - значимый, со всеми вытекающими последствиями. Для более детального понимания рекомендую глянуть видео с типами данных на канале

  • @vicktoriashepard
    @vicktoriashepard 2 роки тому

    Хм, про безопасность полей это вполне очевидно, но архитектура на so подразумевает запись данных в поля. С префиксом [nonserialised] дабы не сохранять данные из runtime в ассете. Да и вопрос что можешь сказать по архитектуре на SO ? Плюсы, минусы? Спасибо за видео!

    • @nightyonetwothree
      @nightyonetwothree 2 роки тому

      для записи лучше использовать методы для тех же полей, что бы логика записи данным была внутри самого объекта и он мог валидировать всё

  • @aleksey2793
    @aleksey2793 6 місяців тому

    А почему _id здесь string, а не enum?

  • @ThePirateHistory
    @ThePirateHistory 3 роки тому +1

    Зачем SerializedField так и не понял, посмотрел фулл видос, обещание словил что дальше объяснение будет и все, так же почему с нижним подчеркиванием тоже не понятно, насколько я знаю допустим из питона нижние подчеркивание, при импорте import library не импортирует то что написано с нижним подчеркиванием.

    • @gamedevlavka
      @gamedevlavka  3 роки тому +1

      Хороший вопрос. Ответ писал тут:
      t.me/gamedevlavka/13

  • @goga19980
    @goga19980 3 роки тому +2

    Кстати, в чем разница private void Start() от void Start()?

    • @gamedevlavka
      @gamedevlavka  3 роки тому +2

      Функционально - ни в чем. Дело в читабельности. Писал об этом тут => t.me/gamedevlavka/7

    • @goga19980
      @goga19980 3 роки тому +1

      @@gamedevlavka на телегу подписан, не листал:D Теперь стоит))) Ну вообще я их не писал только в Start Update и подобных, так, в принципе, это логично)

  • @andrewalexart
    @andrewalexart 2 роки тому

    Не совсем понятно. Если пишешь [serialisable field] для private переменной то ведь ты и так можешь менять значения ТОЛЬКО в инспекторе. Или я не так что то понял...

    • @isoldpower
      @isoldpower 2 роки тому

      все верно, только вот получать данные публично тоже надо. В этом и проблема

  • @MrGoldorange
    @MrGoldorange 2 роки тому +2

    Все никак не возьму в толк, по сути единственное преимущество и надобность(перед просто префабом) в том что можно создавать их из меню?

    • @gamedevlavka
      @gamedevlavka  2 роки тому +2

      Префаб - шаблон игрового объекта.
      ScriptableObject - объект с информацией, конфиг, он нужен для хранения информации.
      У одного не может быть преимущества перед другим, потому что они созданы для разных целей. Конечно, ты можешь сделать конфиг и в качестве префаба, но это все равно что из пушки по воробъям стрелять.

    • @MrGoldorange
      @MrGoldorange 2 роки тому +1

      @@gamedevlavka огромное спасибо что отвечаешь и объясняешь!)

    • @ec6189
      @ec6189 2 роки тому

      @@gamedevlavka А почему не создать просто класс Config ?
      Для чего нужен именно ScriptableObject, пока вижу преимущество только в том, что:
      1. Его не нужно инициализировать (Но это решается на уровне архитектуры, создаем объектный пулл и инжектим туда)
      2. Можно добавить в контекстное меню

  • @developerazcom
    @developerazcom 3 роки тому +2

    стоит ли применить принципы СОЛИД в Юнити?

    • @gamedevlavka
      @gamedevlavka  3 роки тому +1

      Обязательно!

    • @developerazcom
      @developerazcom 3 роки тому

      @@gamedevlavka а в будушем в вашим канале будет такое видео где покажете приминение солид в скирптах юнити?

    • @gamedevlavka
      @gamedevlavka  3 роки тому +3

      @@developerazcom SOLID Применяется независимо, в юнити ты работаешь или нет. Но устроить можно.

    • @developerazcom
      @developerazcom 3 роки тому

      @@gamedevlavka было бы круто

    • @user-ud4wo7rw4k
      @user-ud4wo7rw4k 3 роки тому

      @@gamedevlavka ждём!!! :)

  • @SeempleIQ
    @SeempleIQ 2 роки тому

    через [field: serializeFIled] можно сериализовать проперти, и не придется писать каждый раз пару филд + проперти.

    • @gamedevlavka
      @gamedevlavka  2 роки тому

      Автопроперти - это фишка C#, но она еще не была официально добавлена в Unity, что означает, она работает нестабильно. Например, существуют проблемы с переопределением свойств в Prefab Variants.

  • @KirillBreuss
    @KirillBreuss 3 роки тому +2

    А почему Вы всегда явно пишите слово private? Отсутствие модификатора доступа вообще ведь тоже самое, что и private. Т.е. чуточку короче запись получается.

    • @gamedevlavka
      @gamedevlavka  3 роки тому +3

      В таком случае отсутствия private методы и переменные уже не выглядят унифицировано, а следовательно при беглом чтении кода создается маленький хаос в голове. Удобнее читать, когда все методы и переменные выглядят одинаково. Это такой маааленький пенёк, об который спотыкаешься при чтении, если не писать.

  • @Maximka_23
    @Maximka_23 2 місяці тому

    Где пчелиная война 2?

  • @user-yx5mb4sz9t
    @user-yx5mb4sz9t 2 роки тому

    Ну по сути scriptable object это сериализуемая структура получается. За исключением того что можно создавать обьекты в юнити.

  • @ViATVmy
    @ViATVmy 3 роки тому +1

    id => this._id почему нельзя просто так id = this._id ?? в чем разница между ними ?

    • @gamedevlavka
      @gamedevlavka  3 роки тому +2

      Это сокращенное написание свойства:
      string id {
      get {
      return this._id;
      }
      }
      Согласись, написать string id => this._id гораздо быстрее, короче и аккуратнее

    • @gamedevlavka
      @gamedevlavka  3 роки тому +2

      В первом случае это свойство только с возможность чтения, а I'd = this._id это присваивание, нам присваивать ничего не нужно, только возвращать (читать)

  • @NewUser78654
    @NewUser78654 5 місяців тому

    Скажу сразу - в ООП программировании далеко не джун. Изучаю юнити. И зачем ScriptableObject? Нам нужен сундук. Пишем скрипт для сундука, указываем в нем необходимые поля (сериализуемые-доступные из редактора), скрипт прикрепляем к сундуку. Всё.
    Один сундук в префабах, к нему подключен скрипт. Там есть выпадающее поле (enum) какой это сундук (обычный, необычный и т.д.). Удобно. Никаких меню с 1000 сундуков, кучи объектов в ресурсах и т.д. Смысл ScriptableObject?

  • @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 роки тому +1

      Свойства он никак не отображает. Если вы напишете строчку, как предложили, вы не сможете задать ее через редактор

    • @anatoliydingo2200
      @anatoliydingo2200 2 роки тому

      @@gamedevlavka [field: SerializeField] это на автосвойства, а если надо с логикой в сеттере то погугли [SerializeProperty]