Configuración compartida
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 25 de 64.
Un ajuste de dificultad cambia a todos los enemigos a la vez, así que encaja en un 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, conectado 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 ejecución de Update de cada enemigo lee 4, incluidos los enemigos que aparezcan más tarde a partir de un prefab que tenga el recurso en su campo. Esto funciona porque cada enemigo lee difficulty.enemySpeed cuando se mueve. Un enemigo que lo haya copiado en uno de sus propios campos en Start seguirá moviéndose a 2.
El lugar donde acaba un cambio hecho durante el juego depende de dónde se ejecute el juego. Una compilación carga sus recursos tal como estaban al compilarse cada vez que se inicia, así que el ajuste Hard del jugador desaparece en la siguiente partida: para conservar una elección, guárdala con PlayerPrefs y escríbela de nuevo en el recurso cuando se inicie el juego. En el Editor, el recurso del proyecto es el que cambia el juego, y el cambio se mantiene después de pulsar Stop, a diferencia de los objetos de la escena, que vuelven a sus valores del Inspector. La siguiente vez que pulses Play, empezará en Hard, y el recurso conservará el valor 4 hasta que lo restablezcas.
Desafío
IntermedioHaz que las flechas cambien el viento en todos los barcos compartiendo un mismo recurso.
- En
Sailboat, reemplazawindStrengthporpublic WindSettings wind;y navega awind.strength. - En
WindVane, reemplazastrengthporpublic WindSettings wind;. - Haz que las flechas cambien
wind.strength(de 0 a 5) y que el texto lo muestre, comoWind: 3.
Pulsa «Jugar» y pulsa la flecha hacia arriba: los tres barcos aceleran. Después, pulsa «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;
}
}
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 modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity