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.
Desafio
MédioFaça com que as setas mudem o vento em todos os barcos compartilhando um único recurso.
- Em
Sailboat, substituawindStrengthporpublic WindSettings wind;e navegue usandowind.strength. - Em
WindVane, substituastrengthporpublic WindSettings wind;. - Faça com que as setas alterem
wind.strength(de 0 a 5) e que o texto mostre esse valor, como emWind: 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
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity