Общие настройки
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 21 из 50.
Настройка сложности меняет всех врагов сразу, поэтому для неё подходит один ресурс, на который ссылаются все враги. Каждый враг считывает скорость из ресурса в каждом кадре, а кнопка Hard в меню записывает значение в этот же ресурс:
[CreateAssetMenu(menuName = "Game/Difficulty")]
public class Difficulty : ScriptableObject
{
public float enemySpeed = 2f;
}public class Enemy : MonoBehaviour
{
public Difficulty difficulty;
public Transform player;
void Update()
{
float step = difficulty.enemySpeed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, player.position, step);
}
}// DifficultyMenu.cs, привязан к onClick кнопки Hard
public Difficulty difficulty;
public void SetHard()
{
difficulty.enemySpeed = 4f;
}Поля врагов и поле меню хранят ссылку на один ресурс, поэтому после вызова SetHard() при следующем обновлении каждый враг считывает значение 4; это относится и к врагам, созданным позднее из префаба, в поле которого указан этот ресурс. Это работает, потому что каждый враг считывает difficulty.enemySpeed при движении. Враг, который скопировал это значение в собственное поле в Start, продолжает двигаться со скоростью 2.
То, где сохраняется изменение, внесённое во время игры, зависит от того, где она запущена. При каждом запуске сборка загружает ресурсы в том виде, в каком они были при сборке, поэтому выбранный игроком уровень Hard не сохранится в следующей игре: чтобы сохранить выбор, запишите его с помощью PlayerPrefs, а при запуске игры запишите его обратно в ресурс. В Editor изменяется ресурс в проекте, и изменение сохраняется после нажатия Stop — в отличие от объектов сцены, которые возвращаются к значениям из Inspector. Следующий запуск Play начнётся на уровне Hard, а в ресурсе останется значение 4, пока вы не измените его обратно.
Задание
СреднеТри парусника пересекают залив под действием ветра, а стрелки вверх и вниз меняют силу ветра от 0 до 5. Но у каждой лодки есть собственное поле windStrength, а WindVane меняет только собственное значение strength, поэтому стрелки никак не влияют на лодки. Вместо этого используйте один общий ресурс. Файл WindSettings.cs готов, а ресурс Breeze проекта (сила ветра 2) назначен в поле wind каждой лодки и объекта WindVane.
Sailboat: заменитеwindStrengthобщедоступным полемwindтипа WindSettings и двигайтесь со скоростьюwind.strength.WindVane: заменитеstrengthобщедоступным полемwindи сделайте так, чтобы стрелки менялиwind.strength, тогда ветер будет влиять на каждую лодку. Текст отображает его значение, напримерWind: 3.- При каждой сборке ресурс Breeze загружается заново, поэтому ветер игрока будет сбрасываться. Каждый раз, когда значение меняется, сохраняйте
wind.strengthпод ключом PlayerPrefsWind, а в Start записывайте сохранённое значение обратно в ресурс. Для нового игрока сохраняется значение 2 из ресурса.
Нажмите Play, измените ветер, затем нажмите Stop и снова Play, после чего нажмите Check.
Попробуйте сами
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class WindVane : MonoBehaviour
{
public TMP_Text windText;
public float strength = 2f;
void Start()
{
Show();
}
void Update()
{
if (Keyboard.current.upArrowKey.wasPressedThisFrame)
{
strength = Mathf.Min(strength + 1f, 5f);
Show();
}
if (Keyboard.current.downArrowKey.wasPressedThisFrame)
{
strength = Mathf.Max(strength - 1f, 0f);
Show();
}
}
void Show()
{
windText.text = "Wind: " + strength;
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов