[UNITY3D] Scriptable Objects на примере игры
Вставка
- Опубліковано 13 вер 2024
- Всем привет, сегодня мы познакомимся с такой невероятной штукой, как ScriptableObject и рассмотрим один из главных способов ее использования на примере небольшой игры, которую мы напишем. ScriptableObject имеет настолько много способов использования, что если попытаться рассказать все, то можно увидеть, как на ютубе перестанут быть популярными уроки по созданию игр за 10 минут.
На самом деле не бесполезный канал ExtremeCode: goo.gl/aSZQTQ
Коля, Артем, не кидайте страйк, пожалуйста =)
(AH better EC)
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Покупайте наши проекты: android-helper.ru
Поддержка канала денежкой: www.donationale...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Группа ВК: youtube...
Telegram Чат: t.me/ahgamedev...
Twitch: / androidhelperlive
#Unity3D
Друзья, при монтаже, случайно был отрезан маленький, но очень важный код. В конце Start() EnemySpawner, сразу после подписки на OnEnemyOverFly необходимо запустить корутину Spawn строчкой:
StartCoroutine(Spawn());
Объясни, я слишком глупый
выводит ошибку cs1503 при вводе StartCoroutine(Spawn()); в конец Start()
@@Александр-щ7в4й кнш прошел год но надо просто StartCoroutine(Spawn);
@@uso2484 Надо StartCoroutine(Spawn());
А кому это интересно если видео про Scriptable Objects ? Думаю за 13 минут можно было описать все варианты использования Scriptable Objects, но нет, я покажу вам чо я умею...
Сначала обьяснил как детсадовцам, на примере тортика, а с 6ой минуты ограничился банальным названием используемых функций. Браво, господа
ExtremeCode > Женя AndroidHelper
Блять, опять перелогинится забыл
False
Надо чекнуть, что у вас нового давно не заходил ). Со времен основ с# ))) Хотя лысый из itvdn больше разжевывает )))
0:27 Уворачиваться от бесполезных вещей
Автор канала великий человек: он смог соединить программирование с юмором. Мой низкий поклон в виде лайка)
C# для маленьких и тупых в помощь
так и не понял как его использовать ,все быстро пробежал сам себе код написал и норм (нет)
Прежний темп вернулся:)
Ахаах!!! За пару недель до выхода этого видео расчехлил эту тему ибо нужно было. Искал здесь на этом канале именно эту информацию))) Походу, автор услышал мои мысленные позывы!))) Короче, все равно большой лайкище тебе!
Смысл ролика: Создаем шаблон для ScriptableObject - EnemyData.cs. Далее с помощью него создаем ScriptableObject-ы и подключаем созданные ScriptableObject-ы в публичный массив EnemySpawner.cs. Таким образом получаем доступ к созданным ScriptableObject. Остальная часть ролика петросяния и архитектура приложения.
Спасибо!!!
Класс. Отличный урок. Давай Еще
2:24 я орнул xD
Отличный видосик, быстро много полезной инфы.)
Жалко что вы больше не работаете. Вы крутые!
Это было достойное видео, жаль новых на канале нет
Спасибо за урок пойду делать симулятор кейсов Clash Royale , но уже по канонам SO
3:58 - про Беларусь правда
Видео огонь! Спасибо :)
Жирный лайкосик!
Вау, контент улучшился.
интересно-интерееесно... я так понимаю HearthStone именно на таком скриптовом объекте писали. теперь бы еще сложный ai взаимодействия динамических параметров таких объектов между собой придумать...
Привет, такой вопрос не по теме, как сделать вызов приложения через некоторое время ? К примеру в приложении есть кнопка при нажатии на которую ты запускаешь кусочек кода через некоторое время, мне нужно что бы выполнилось открытие моего приложения. Ну к примеру приложения с ложными звонками которые запускаются через указанное тобой время. Как это реализовать? Подскажите!
Спасибо за урок :)
Зачетно!
Интересно, хочу дальше, но всё слишком уж быстро (как у меня в постели), особенно в частях с новым материалом
Местами сложные вещи пролетают незаметно, в нескольких словах - нам нужно больше зол... подробностей
Спасибо, удачи, пока.
Круто!
Я наверно чего-то не знаю, но где ты сделал старт Spawn? Вроде ничего не пропускал. Все очень понятно, почти получил удовлетворение, но вот это ломает все восприятие. Объясните пожалуйста или мне все таки придётся лезть в файлы проекта(хах, которых кстати нет...)?
KuzmICh возможно, случайно вырезал при монтаже.
Сразу после подписки на Enemy.OnEnemyOverFly
Евгений Бренев это и заметил (время на компе между кадром), не забывайте про такие штуки, важный момент, состояние незаконченности было у меня на протяжение трёх пересмотров в поисках этого :0
ВСЕ ПРОСТО И ПОНЯТНО ! (НЕТ)
зачем нужна эта строчка кода на 5:10 public Sprite MainSprite{} ?
СДЕЛАЙСДЕЛАЙСДЕЛАЙ ЕЩЕ УРОКИ ПО ЭТИМ СКРЫПТАБЛЕ ОБЖЕКТАМ!!! ОМГ КАК ЖЭ ЭТО КЛАССНО, ЕСЛИ Я СМОГУ ОСВОИТЬ ЭТО, ТО МОИ ГОРИЗОНТЫ СТАНУТ В РАЗЫ ШИРЕ!
У тебя класные настройки цвета текста VS, можешь настройки выложить, думаю многим бы понравились.
В уроке по оформлению VS есть ссылка на эту тему.
ооо, спасибо.
Лайкосик поставив бо цікаво!
Боже я никогда не научусь писать скрипты красиво как ты.... у меня просто такое убожество получается, что сам черт ногу сломает....
А ничего что, по итогу у нас получается что в сцене появляется условно говоря 100 экземпляров класса Enemy и т.о. метод FixedUpdate вызывается 100 раз за 1 секунду? Не лучше ли было бы вызывать этот метод 1 раз за 1 секунду в каком-нибудь EnemiesMovementManager, висящем в сцене? Т.е. мы бы тогда с одного скрипта двигали бы всех enemy.
А есть смысл использовать Scriptable objects для игр типа Flappy bird? Когда нужно спавнить один и тот же префаб на постоянной основе? Или в этом нет смысла для такого маленького проекта?
Урок хороший, в принципе даже для новичка не так сложно. Сложнее скорее самостоятельно потом всё это повторить и применить, но в этом и суть обучения)
На мой взгляд SO, не особо то и нужен, если рассматривать классический Flappy bird. А вот Pool объектов не помешает точно!)
Короче это рофл) Чел применяет SO для генерации случайных значений с ограничением. На 9:40 единственное применение, троллинг просто высшего уровня))
кто то читает дисклеймер?
кто не читает тот беременный ребёнок!
Больше !
Это перезалив видео, т.к UA-cam решил никому не показывать его в подписках, и не звонить в колокольчик...Низкий поклон YT.
ANDROIDHELPER [UNITY3D and more] Вы можете выложить код, пожалуйста
Поддерживаю ECS... Слышал, но ничего не понял как работает... Инфы мало на ру. )))
Привет, такой вопрос не по теме, как сделать вызов приложения через некоторое время ? К примеру в приложении есть кнопка при нажатии на которую ты запускаешь кусочек кода через некоторое время, мне нужно что бы выполнилось открытие моего приложения. Ну к примеру приложения с ложными звонками которые запускаются через указанное тобой время. Как это реализовать? Подскажите!
С такими вопросами я бы порекомендовал группы в вк (если не гугл и не ютуб тебе не помогают). Там сидят 20000+ человек и могут гораздо быстрее ответить. По своему нубскому опыту могу предположить, что отложенный вызов будет реализован через метод Invoke.
Даже незнаю как это сформулировать. Скриптинг? Или сценарий?
1 Но Как делать эмоции плеера?!
Помните бэтлтодс?! Эмоция лягух (плеера) изменялась при виде босса.
Почему трансформ двигаешь в фиксед апдейте?
Где вы учитесь или учились?
Блин, залез написать, что IEnumerator Spawn в воздухе висит, а тут уже всё написано)
По моему ты объяснил принцип ООП
Это ж какой мозг нужно иметь, что бы писать такие скрипты О_о
минимальный по мощности мозг и куча времени на обучение)
самый обычный, но с кучей опыта
А как добавить врагам АНИМАЦИЮ с аниматором?
А нельзя написать обычный скрипт с параметрами типа : скорость , картинка,дамаг итп. Скрипт который будет спавнить их естественно и присваивать этим переменным соответствующие значения? Так тоже получится 1 префаб. Можно создать лист, в скрипте спавна, в котором будут параметры для врагов, типа нажал плюсик, уже в редакторе, и у тебя ещё 1 враг и редактируешь его параметры
DoubleFun здорово, а теперь представьте, что у каждого врага не три поля, а сто.
Вам нужно сделать скажем 1000 спаунеров разных (допустим, вы делаете много уровней). В каждом спаунере вам нужно иметь 500 врагов. Пусть каждое поле будет занимать в среднем 8 байт. Итого, каждый враг будет занимать 800 байт. Так как вам нужно будет в каждом спаунере таскать его копию, вам придется для каждого из 1000 спаунеров возить с собой 800*500 = 40кБайт. 40 кБайт * 1000 спаунеров = 40 мБайт. То есть ваша игра только на врагах в размерах поднимется на 40 мБайт, хотя с помощью SO этот размер можно ужать в тысячу раз.
Понятно, что пример притянут за уши, понятно, что в реальных условиях экономия получится меньше, но, помимо экономии памяти вы получаете:
Гибкость и удобство - изменение и добавление врагов делается в 2 клика мыши.
Возможность хранения ссылок на SO, а не целиком объект позволит вам легко переконфигурировать ваш спаунеров под конкретные нужды.
Если обмазать это дело ещё и эдиторскриптами, можно сделать работу с врагами ещё более красивой и изящной.
Сделать скрипт отвечающий за все спаунеры и хранить этот лист из врагов в нём, давая на него ссылки спавнерам xD
Попахивает костылями, но я же не могу сказать что я не прав) Но работать с ними приятней это да, говнокода меньше и структура более удобна
DoubleFun многие так делают, как вы описали, но по заверению самих разработчиков юнити - это неправильное использование префабов.
Выложите исходники
Не могу понять, для чего нужно кроме поля border, делать еще и Border со свойствами get; set;? Ни как до меня не дойдет
Чтобы ограничить перемещение игрока. Он же не должен убегать за экран...
Привет, начни уроки по 3D игре, к примеру от третьего лица, в жанре шутер.
🤣👍 подпска на
Почему видео так часто?
Я так и не понял, чем ScriptableObject лучше обычных префабов?
К примеру у префаба врага есть параметр int hp = 100; Переменная int занимает 32 бита в памяти вне зависимости от того, какое число она хранит. Представь, что у врага есть еще три десятка переменных и в итоге 1 враг на сцене занимает аж 500 кб. А теперь самое интересное. Ты создал на сцене армию из 300 таких врагов. Умножаем 500 кб на 300 и вот враги сожрали 146 мб нашей памяти одним своим существованием. При этом у них у всех одинаковые параметры. У одного int hp = 100, у другого int hp = 100 и т.д.
В случае со Scriptable Object, все 300-500-1000 врагов будут юзать один общий Scriptable Object вместо того, чтобы создавать новый экземпляр скрипта с абсолютно одинаковыми стартовыми параметрами. Если у всех орков в игре, стартовое значение здоровья = 100хр, то мы можем это указать всего 1 раз в Scriptable Object, а не каждый раз для каждого отдельного орка. Экономия памяти.
@@KirillBreuss Спасибо, после твоего коммента до меня наконец дошло, что по сути это реализация паттерна Легковес, теперь понятно в чем их фишка
помогите пж. help plz
могу ли я использовать Javascript вместо C#?
будут ли у меня проблемы какие то?
JS больше не поддерживается в Unity.
+ANDROIDHELPER [UNITY3D and more] вот бл** ...
а есть другие языки ? кроме C#? я имею ввиду, ну не хочется учить C# только из за unity......
+Владислав Костюков а там просто база требуется?
в юнити?
+Владислав Костюков премного благодарен !
Это обучающий ролик или ты просто выпендриваешься что умеешь это делать?Нахера так тараторить и пропускать 90% действий?
Видимо так смотрите, раз у вас пропущено 90% действий. Если для вас человек в видео тараторит на 13 минут, то в ютубе есть настройка управления скоростью видео.
Сделайте урок Unity или AndroidStudio по созданию приложения с фунциями Bluetooth. Например Боютуз терминал.
Что за музыка на 0:00
Весь треклист в порядке очереди в конце видео
ANDROIDHELPER [UNITY3D and more] спасибо
Но чем тебе PHP не угодил? Я бы на его место поставил Руби например....
Oscar я ничего против php не имею, но он снискал свою плохую славу из-за низкокачественного кода, который в обилие пишется на этом языке. Большинство программистов знает шутку про php, именно потому я его сюда и поместил)
С этим я согласен но шутка довольно старая.... Впрочем забей, спасибо за инфу)
Я один это под пивко смотрю?)
возможно даже и с дилдаком в заднице ты не единственный
Из-за шуток невозможно воспринимать это видео за что-то серьёзное
Надо уменьшить 50% ГОВНОшуток на 1 минуту времени и будет норм видос, а пока это жалкое зрелище.
Добавил такие строки:
health -= EnemySpawner.Enemies[obj].Attack;
if (health
Добвил в EnemySpawner
private void Awake()
{
DontDestroyOnLoad(this.gameObject); // Не уничтожать текущий объект при загрузки новой сцены
}
Все заработало, но вот, на сколько это правильно ?