Menu
CoddyTech

Configurações Compartilhadas

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 25 de 64.

Uma configuração de dificuldade altera todos os inimigos de uma vez, então ela se encaixa em um único asset para o qual todos apontam. Cada inimigo lê a velocidade do asset a cada frame, e o botão Hard do menu grava no mesmo asset:

[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, conectado ao onClick do botão Hard
public Difficulty difficulty;

public void SetHard()
{
    difficulty.enemySpeed = 4f;
}

Os campos dos inimigos e o campo do menu armazenam o mesmo asset, então, depois de SetHard(), a próxima chamada de Update de cada inimigo lê 4, inclusive os inimigos criados mais tarde a partir de um prefab que tenha o asset em seu campo. Isso funciona porque cada inimigo lê difficulty.enemySpeed quando se move. Um inimigo que copiou esse valor para um campo próprio em Start continua se movendo a 2.

Onde uma alteração feita durante o jogo acaba sendo aplicada depende de onde o jogo está sendo executado. Uma build carrega os assets exatamente como foram quando ela foi criada sempre que é iniciada, então a opção Hard do jogador desaparece na próxima partida: para manter uma escolha, salve-a com PlayerPrefs e grave-a de volta no asset quando o jogo iniciar. No Editor, o asset no seu projeto é aquele que o jogo altera, e a alteração permanece depois que você pressiona Stop, ao contrário dos objetos da cena, que voltam aos valores do Inspector. A próxima vez que você clicar em “Jogar”, o jogo começa no Hard, e o asset mantém o valor 4 até você alterá-lo de volta.

challenge icon

Desafio

Médio

Faça com que as setas mudem o vento em todos os barcos compartilhando um único recurso.

  1. Em Sailboat, substitua windStrength por public WindSettings wind; e navegue usando wind.strength.
  2. Em WindVane, substitua strength por public WindSettings wind;.
  3. Faça com que as setas alterem wind.strength (de 0 a 5) e que o texto mostre esse valor, como em Wind: 3.

Pressione “Jogar” e pressione a seta para cima: os três barcos aceleram. Depois, pressione “Verificar”.

Experimente você mesmo

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;
    }
}

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity