Skip to content

Latest commit

 

History

History
65 lines (53 loc) · 4.71 KB

File metadata and controls

65 lines (53 loc) · 4.71 KB

🎯 Задача: Система типов оружия и глобальный счётчик очков

Цель:

Создать небольшой проект в Unity, который использует ScriptableObject для:

  1. Хранения конфигурации разных видов оружия (урон, скорость атаки, название, иконка).
  2. Замены синглтона — глобальное хранилище очков игрока, доступное из любой сцены и любого скрипта без static Instance.
  3. Совместной работы — оружие увеличивает счёт через глобальное хранилище.

🧱 Что нужно сделать (шаги)

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

✅ Критерии успеха

  • При подборе меча счёт увеличивается на 10.
  • При подборе лука — на 7 и т.д.
  • При перезагрузке сцены (или переходе на новую сцену) счёт не должен сбрасываться автоматически (если не вызвать ResetScore()).
  • Все конфигурации оружия лежат в отдельных .asset файлах и могут быть изменены без переписывания кода.

🧠 Бонус (по желанию)

  • Добавьте WeaponEventSO (ещё один ScriptableObject) как канал событий. Когда оружие подобрано, он отправляет событие, а ScoreUI слушает его — тогда ScoreUI не нужно вызывать Update() каждый кадр.
  • Создайте кнопку "Reset Score", которая вызывает GlobalScoreSO.ResetScore().

Решение:

🧩 1. ScriptableObject: Оружие (WeaponSO.cs)

🧩 2. ScriptableObject: Глобальный счёт (GlobalScoreSO.cs)

🧩 3. Компонент подбора оружия (WeaponPickup.cs)

🧩 4. Отображение счёта в UI (ScoreUI.cs)

🧩 5. (Бонус) Скрипт для кнопки сброса счёта (ResetScoreButton.cs)


⭐ Если этот проект был полезен, поставьте звезду на GitHub!