Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Tres 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: reemplaza windStrength por un campo público wind de tipo WindSettings, y navega a wind.strength.
  • WindVane: reemplaza strength por un campo público wind, y haz que las flechas cambien wind.strength, para que todos los barcos lo noten. El texto lo muestra, como Wind: 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.strength con la clave de PlayerPrefs Wind cada 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;
    }
}
quiz iconPonte a prueba

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