Menu
CoddyTech

Общие настройки

Часть раздела Архитектура игр в 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, пока ты его не сбросишь.

challenge icon

Задание

Средне

Сделайте так, чтобы стрелки изменяли ветер на всех лодках с помощью одного ресурса.

  1. В Sailboat замените windStrength на public WindSettings wind; и плывите со скоростью wind.strength.
  2. В WindVane замените strength на public WindSettings wind;.
  3. Сделайте так, чтобы стрелки изменяли 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

Потренируйтесь самостоятельно: Песочница Unity