Дмитрий, здравствуйте. Объект DontDestroyOnLoad может создаваться заранее, это не повлияет на работу игры. При этом вы можете проверить причину его появления на старте. Для этого нажмите на объект и просмотрите скрипты, которые к нему привязаны.
30:07 Илья, здравствуйте! Почему при переносе скрипта Shop в эти поля у меня не появляются во вкладке Function какие-либо параметры, ну кроме параметра MonoScript, где можно выбрать только string name? И такое у этих двух кнопок! P.S. Я самостоятельно решил проблему! Нужно было переносить не скрипт Shop, а объект Shop. Может кому пригодится!!!)))
Здравствуйте. Рады, что вам удалось самостоятельно разобраться 🙂 Если у вас появятся дополнительные вопросы - их можно задать нам в личные сообщения t.me/YandexGamesSupport
Хороший вопрос. Если GameManager сделать неуничтожаемым, тогда я думаю, что все его SerializeField будут ссылаться на объекты из прошлой сцены при переходе на новый уровень. Тогда нужно и эти объекты также делать скелетонами или каждый раз искать их в новой сцене. Так гемора чуть больше будет.
Здравствуйте. Да, можно применить «Singleton» для «CoinManager» или «GameManager». Отметим, что использование отдельного «Singleton» для каждого объекта может затруднить реализацию их изменения. В этом случае можно создать «GameData» и в нём хранить «CoinManager» и «GameManager».
@@yagamesdev Какая-то беда с сингтоном в видео, при переходе со второго уровня на третий создается еще один, помогло решение вытащить из префабов @yagamesdev
Если у вас тоже есть проблемы с переносом прогресса, то вот что было у меня и как я это исправил. Уточню, что я не создавал методы SetWidth и SetHeight, а использовал уже имеющиеся AddHeight и AddWidth, так как на мой взгляд создание новых методов избыточно. 1. Ворота не изменяли Progress. Чтобы это исправить нужно в скрипте Gate в if и else If, которые на деформацию, добавить Progress.Instance.Width += _value; и Progress.Instance.Height += _value; соответственно. На всякий случай вот код метода: PlayerModifier playerModifier = other.attachedRigidbody.GetComponent(); if (playerModifier != null) { if (_deformationType == DeformationType.Width) { playerModifier.AddWidth(_value); Progress.Instance.Width += _value; } else if (_deformationType == DeformationType.Height) { playerModifier.AddHeight(_value); Progress.Instance.Height += _value; } Destroy(gameObject); } 2. Учет высоты и ширины как таковой внутри PlayerModifier и Progress идут каждый своим ходом. Например в начале уровня закупаешься высотой и шириной по 100 единиц (данные инспектора Progress), а в Player отобразится по 300 или что-то такое. То есть _height и _width не связаны с Progress.Instance. Чтобы исправить нужно в PlayerModifier в Update в самое его !начало! добавить: _height = Progress.Instance.Height; _width = Progress.Instance.Width; Если добавить в конец, будет лагать увеличение роста. 3. Барьеры перед финишем не учитываются в Progress. Исправляется легко. Вот весь метод целиком: public void HitBarrier() { if (Progress.Instance.Height > 50) { AddHeight(-50); Progress.Instance.Height -= 50; } else if (Progress.Instance.Width > 50) { AddWidth(-50); UpdateWidth(); Progress.Instance.Width -= 50; } else { Die(); } }
Можно еще проще сделать Добавить в NextLevel эти строки. А _width и _height поставить в public. PlayerModifire playerModifire = FindObjectOfType(); Progress.Instance.Width = playerModifire._width; Progress.Instance.Height = playerModifire._height;
Подскажите, пожалуйста в чем смысл этой игры? Мы сами управляем персонажем на небольшой скорости, поэтому мы можем спокойно не брать красные ворота и всегда забегать в синие. Очень простая игра получается
Один вопрос. Касается CoinManager, пишу в Progress себе 500, и когда нажимаю на увеличение высоты или ширены. У меня пишется просто 20 но в Progress написана не 20 а то число которая должна быть(то есть 480 и т.д) Я не понимаю в чем проблема, 2 раза пересмотрел и не понял в чем разница. Подскажите пожалуйста как решить или где возможна ошибка? Заранее спасибо.
Здравствуйте. Создание «SetWidth» и «SetHeight» упрощает чтение кода и его поддержание. Например, когда читаем: SetWidth(10), то сразу понимаем, что меняем ширину. Если же в коде будет 10 строк, изучать придётся дольше.
Здравствуйте, делаю игру-тест и появилась проблема, когда вопросы заканчиваются и происходит переход на сцену с результатами, то как будто данные последнего вопроса не сохраняются, на сцене самой игры счетчик правильных ответов отображает все правильно, а вот когда запускается сцена результатов, то там всегда на 1 балл меньше. Как можно решить это?
Здравствуйте. В ролике рассказывается о том, что можно регулировать размеры коллайдеров самих ворот. Это может помочь в решении вопроса. Также при взаимодействии с воротами можно отключать коллайдер соседних.
синглтон понятное решение. первый вопрос - если объект DontDestroyOnLoad , он все равно создается при загрузке сцены? второй вопрос - нельзя ли объект Progress вместе со скриптом вставить в какое-нибудь [SerilizedField] управляющего скрипта сцены и таким образом получить доступ к полям?
1. Создается ещё один экземпляр при загрузке каждой сцены. Но так как поле static уже занято, скрипт сам "уничтожает" лишний gameObject "Progress" на котором висит. А тот, который содержит все данные о монетках и прочем, останется "жив". Почему так произойдёт, потому что проверка на существование находится в методе Awake, то есть она будет произведена один раз. Потому у существующего Progress этот метод не будет вызван повторно. А вот у вновь созданной копии будет. Таков метод Awake, срабатывать один раз при включении/создании объекта. 2. Вы и так через static Instance сможете получить доступ к любому полю Progress напрямую. Static - доступен, можно сказать, отовсюду, главное, чтобы он оставался Public. Потому можно не добавлять, а просто в вашем управляющем скрипте сцены в коде обращаться напрямую. При этом да, можно объект вставить в какое-нибудь поле у некоего управляющего скрипта, чтобы и так, своеобразно, получить доступ к полям Progress, но они также должны быть public, если вы хотите как-то влиять на поля Progress.
Здравствуйте. Объекты в сцене создаются при её загрузке. DontDestroyOnLoad не удаляется при переходе между сценами. Чтобы в сцене не было 2 экземпляра одного объекта в синглтоне пишем Destroy. Объект в новой сцене создается, затем, если видит, что один экземпляр уже был создан ранее - сразу уничтожается. Добавим, что Progress не стоит вставлять в поля в инспекторе. В это поле будет вставлен тот объект, который присутствует в сцене. Если загрузить вторую сцену после прохождения первой, то этот объект удалится. А в сцене останется только тот экземпляр, который был создан на первом уровне.
Ошибка выходит при Singleton NullReferenceException: Object reference not set to an instance of an object Эта ошибка выходит только когда я нажимаю кнопку чтобы перейти на 3 уровень. На 1 и 2 ошибка не выскакивает.
@@Meteorite_Games Отвечу за него, я потыкал всякое, но последнее что я сделал и после чего по идеи всё заработало это я обнаружил что у меня была ошибка в коде где мы удаляем Progress instance, а именно у меня автозаполнялка написала: Destroy(Instance);, а надо было Destroy(gameObject);. Я исправил и всё стало работать как надо. (Да прошло 6 месяцев, но мало ли кому потом поможет :) )
почему нажимаю на кнопку, у меня там где монеты было 500, а потом просто выдает там же 20, код абсолютно как у него. Все работает вроде в меню Progress, но в игре отображается как просто 20, хотя должно число минусовать не пойму. И проблема именно в методе SpendMoney, так как изменяю там число и оно появляется как раз. SpendMoney в CoinManager я пишу правильно как на видео
Можно же добавить "объект-глобальное состояние" с вызовом DontDestroyOnLoad только в 1й уровень (не вложенным во что либо). Далее он же будет доступен и на всех последующих. И не нужно мудрить с синглтоном (хотя такая реализация это скорее "финт ушами"). И кстати CoinManager и часть PlayerModifier просятся в общее глобальное состояние. Думаю можно сделать проще, по крайней мере мне так видится на данном этапе, возможно дальше будут причины для такой организации. Посмотрим. За бесплатный курс, несмотря ни на что однозначно спасибо.