Создать небольшой проект в Unity, который использует ScriptableObject для:
- Хранения конфигурации разных видов оружия (урон, скорость атаки, название, иконка).
- Замены синглтона — глобальное хранилище очков игрока, доступное из любой сцены и любого скрипта без
static Instance. - Совместной работы — оружие увеличивает счёт через глобальное хранилище.
- Создайте ScriptableObject
WeaponSO
Поля:weaponName(string),damage(int),attackSpeed(float),icon(Sprite),prefab(GameObject — ссылка на визуальную модель оружия). - Создайте ScriptableObject
GlobalScoreSO
Поля:score(int).
Методы:AddScore(int value),ResetScore(). - Создайте несколько ассетов оружия через меню
Create → Game/Weapon:- Меч (damage=10, attackSpeed=1.0)
- Лук (damage=7, attackSpeed=1.5)
- Посох (damage=15, attackSpeed=0.8)
- Создайте скрипт
WeaponPickup(MonoBehaviour)- Имеет публичное поле
WeaponSO weaponData. - В методе
OnTriggerEnter(или по клику) при подборе оружия:- Выводит в консоль "Picked up {weaponName}, damage {damage}".
- Добавляет урон оружия к глобальному счёту:
GlobalScoreSO.AddScore(weaponData.damage). - Уничтожает объект на сцене.
- Имеет публичное поле
- Создайте скрипт
ScoreUI(MonoBehaviour)- Ссылка на
GlobalScoreSO. - В
Update()(или через событие) обновляет текстовое поле UI:Score: {score}.
- Ссылка на
- Сцена:
- Поставьте на сцену 3 разных предмета-подбора (префаба или просто куба с коллайдером).
- Каждому назначьте свой WeaponSO (Меч, Лук, Посох).
- Добавьте простой UI Text для отображения счёта.
- Поместите на пустой объект
ScoreUIиGlobalScoreSO.
- Проверка замены синглтона
- Убедитесь, что нигде нет
public static GlobalScoreSO Instance. - Вместо этого ссылка на
GlobalScoreSOперетаскивается вручную в инспектор любого скрипта, которому нужны очки.
- Убедитесь, что нигде нет
- При подборе меча счёт увеличивается на 10.
- При подборе лука — на 7 и т.д.
- При перезагрузке сцены (или переходе на новую сцену) счёт не должен сбрасываться автоматически (если не вызвать
ResetScore()). - Все конфигурации оружия лежат в отдельных
.assetфайлах и могут быть изменены без переписывания кода.
- Добавьте
WeaponEventSO(ещё один ScriptableObject) как канал событий. Когда оружие подобрано, он отправляет событие, аScoreUIслушает его — тогдаScoreUIне нужно вызыватьUpdate()каждый кадр. - Создайте кнопку "Reset Score", которая вызывает
GlobalScoreSO.ResetScore().