Configuración compartida
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 21 de 50.
Un ajuste de dificultad cambia a todos los enemigos a la vez, así que encaja con un único recurso al que todos hacen referencia. Cada enemigo lee la velocidad del recurso en cada fotograma, y el botón Hard del menú escribe en ese mismo recurso:
[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, vinculado al onClick del botón Hard
public Difficulty difficulty;
public void SetHard()
{
difficulty.enemySpeed = 4f;
}Los campos de los enemigos y el campo del menú contienen el mismo recurso, así que después de SetHard(), la siguiente llamada a Update de cada enemigo lee 4, incluidos los enemigos que se generen más adelante a partir de un prefab que tenga el recurso en su campo. Eso funciona porque cada enemigo lee difficulty.enemySpeed cuando se mueve. Un enemigo que lo haya copiado en uno de sus propios campos en Start sigue moviéndose a 2.
El lugar donde termina un cambio realizado durante el juego depende de dónde se ejecuta el juego. Una compilación carga sus recursos tal como estaban cuando se compiló cada vez que se inicia, así que el ajuste Hard del jugador desaparece en la siguiente partida: para conservar una opción, guárdala con PlayerPrefs y escríbela de nuevo en el recurso cuando se inicie el juego. En el Editor, el recurso de tu proyecto es el que cambia el juego, y el cambio permanece después de que pulses Stop, a diferencia de los objetos de la escena, que vuelven a sus valores del Inspector. La siguiente ejecución con Play empieza en Hard, y el recurso conserva el valor 4 hasta que lo cambies.
Desafío
IntermedioTres veleros cruzan la bahía impulsados por el viento, y las flechas arriba y abajo aumentan y disminuyen el viento entre 0 y 5. Pero cada barco tiene su propio campo windStrength, y WindVane solo cambia su propio strength, así que las flechas no cambian nada en el agua. En su lugar, comparte un mismo recurso. WindSettings.cs está listo, y el recurso Breeze del proyecto (strength 2) está en el campo wind de cada barco y de WindVane.
Sailboat: reemplazawindStrengthpor un campo públicowindde tipo WindSettings, y navega awind.strength.WindVane: reemplazastrengthpor un campo públicowind, y haz que las flechas cambienwind.strength, para que todos los barcos lo noten. El texto lo muestra, comoWind: 3.- Una compilación carga el recurso Breeze desde cero cada vez que se inicia, lo que haría que se perdiera el viento del jugador. Guarda
wind.strengthcon la clave de PlayerPrefsWindcada vez que cambie, y en Start vuelve a poner en el recurso el valor guardado. Un jugador nuevo conserva el 2 del recurso.
Pulsa Reproducir, cambia el viento, luego pulsa Detener y Reproducir otra vez, y después Comprobar.
Pruébalo tú mismo
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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos