Menu
CoddyTech

Configurações compartilhadas

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 21 de 50.

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 nesse 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 contêm o mesmo asset, então, depois de SetHard(), a próxima chamada de Update de cada inimigo lê 4, inclusive os inimigos criados posteriormente 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 o copiou para um campo próprio em Start continua se movendo a 2.

Onde uma alteração feita durante o jogo acaba ficando depende de onde o jogo é executado. Uma build carrega os assets como estavam quando foi criada sempre que é iniciada, então a opção Hard do jogador desaparece no próximo jogo: 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 é o 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 execução com Play começa no modo Hard, e o asset mantém o valor 4 até você alterá-lo de volta.

challenge icon

Desafio

Médio

Três veleiros atravessam a baía, empurrados pelo vento, e as setas para cima e para baixo aumentam e diminuem o vento entre 0 e 5. Mas cada barco tem seu próprio campo windStrength, e o WindVane altera apenas seu próprio strength, então as setas não mudam nada na água. Compartilhe um único asset. WindSettings.cs está pronto, e o asset Breeze do projeto (strength 2) está no campo wind de cada barco e do WindVane.

  • Sailboat: substitua windStrength por um campo público wind do tipo WindSettings e navegue usando wind.strength.
  • WindVane: substitua strength por um campo público wind e faça as setas alterarem wind.strength, para que todos os barcos sintam o efeito. O texto mostra o valor, como em Wind: 3.
  • Uma build carrega o asset Breeze novamente sempre que é iniciada, o que faria o vento do jogador se perder. Salve wind.strength com a chave do PlayerPrefs Wind sempre que ele mudar e, em Start, coloque o valor salvo de volta no asset. Um jogador novo mantém o valor 2 do asset.

Pressione Play, altere o vento, depois Stop e Play novamente e, em seguida, Check.

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;
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

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