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.
Desafio
MédioTrê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: substituawindStrengthpor um campo públicowinddo tipo WindSettings e navegue usandowind.strength.WindVane: substituastrengthpor um campo públicowinde faça as setas alteraremwind.strength, para que todos os barcos sintam o efeito. O texto mostra o valor, como emWind: 3.- Uma build carrega o asset Breeze novamente sempre que é iniciada, o que faria o vento do jogador se perder. Salve
wind.strengthcom a chave do PlayerPrefsWindsempre 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;
}
}
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens