Общие настройки
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 25 из 64.
Настройка сложности изменяет всех врагов одновременно, поэтому она подходит для одного ресурса, на который ссылаются все враги. Каждый враг считывает скорость из ресурса в каждом кадре, а кнопка «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() при следующем Update каждый враг считывает значение 4; это относится и к врагам, созданным позже из префаба, у которого в поле указан этот ресурс. Это работает, потому что каждый враг считывает difficulty.enemySpeed во время перемещения. Враг, который скопировал это значение в собственное поле в Start, продолжает двигаться со скоростью 2.
То, где сохраняются изменения, внесённые во время игры, зависит от того, где запускается игра. В сборке ресурсы при каждом запуске загружаются в исходном виде, поэтому выбранный игроком уровень Hard не сохранится к следующей игре: чтобы сохранить выбор, запиши его с помощью PlayerPrefs и присвой это значение ресурсу при запуске игры. В Editor игра изменяет ресурс в твоём проекте, и это изменение остаётся после нажатия Stop — в отличие от объектов сцены, которые возвращаются к значениям в Inspector. Следующий запуск через Play начнётся на уровне Hard, а ресурс сохранит значение 4, пока ты его не сбросишь.
Задание
СреднеСделайте так, чтобы стрелки изменяли ветер на всех лодках с помощью одного ресурса.
- В
SailboatзаменитеwindStrengthнаpublic WindSettings wind;и плывите со скоростьюwind.strength. - В
WindVaneзаменитеstrengthнаpublic WindSettings wind;. - Сделайте так, чтобы стрелки изменяли
wind.strength(от 0 до 5), а текст показывал это значение, напримерWind: 3.
Нажмите «Играть» и нажмите стрелку вверх: все три лодки ускорятся. Затем нажмите «Проверить».
Попробуйте сами
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Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity