Menu
CoddyTech

Paramètres partagés

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 21 sur 50.

Un réglage de difficulté modifie tous les ennemis à la fois : il convient donc d’utiliser un seul asset auquel ils font tous référence. Chaque ennemi lit la vitesse de l’asset à chaque frame, et le bouton Hard du menu écrit dans ce même 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, relié à l’onClick du bouton Hard
public Difficulty difficulty;

public void SetHard()
{
    difficulty.enemySpeed = 4f;
}

Les champs des ennemis et celui du menu contiennent tous le même asset. Ainsi, après SetHard(), le prochain Update de chaque ennemi lit la valeur 4, y compris les ennemis créés plus tard à partir d’un prefab dont le champ contient cet asset. Cela fonctionne parce que chaque ennemi lit difficulty.enemySpeed lorsqu’il se déplace. Un ennemi qui en a copié la valeur dans son propre champ dans Start continue de se déplacer à la vitesse 2.

L’endroit où se retrouve une modification effectuée pendant le jeu dépend de l’environnement dans lequel le jeu s’exécute. Une version compilée charge ses assets tels qu’ils étaient au moment de la compilation chaque fois qu’elle démarre. Le choix Hard du joueur est donc perdu lors de la partie suivante : pour conserver ce choix, enregistre-le avec PlayerPrefs et réécris-le dans l’asset au démarrage du jeu. Dans l’Editor, le jeu modifie l’asset de ton projet, et la modification reste après que tu as appuyé sur Stop, contrairement aux objets de la scène, qui retrouvent leurs valeurs de l’Inspector. La prochaine exécution avec Play démarre en mode Hard, et l’asset conserve la valeur 4 jusqu’à ce que tu la rétablisses.

challenge icon

Défi

Moyen

Trois voiliers traversent la baie, poussés par le vent, et les flèches Haut et Bas augmentent et diminuent le vent entre 0 et 5. Mais chaque bateau possède son propre champ windStrength, et le WindVane ne modifie que son propre strength, donc les flèches ne changent rien sur l’eau. Partage plutôt un seul asset. WindSettings.cs est prêt, et l’asset Breeze du projet (strength 2) est assigné au champ wind de chaque bateau et du WindVane.

  • Sailboat : remplace windStrength par un champ public wind de type WindSettings, et navigue à wind.strength.
  • WindVane : remplace strength par un champ public wind, et fais en sorte que les flèches modifient wind.strength, afin que chaque bateau le ressente. Le texte l’affiche, sous la forme Wind: 3.
  • Une version compilée charge l’asset Breeze à nouveau à chaque démarrage, ce qui ferait perdre le réglage du vent du joueur. Enregistre wind.strength sous la clé PlayerPrefs Wind à chaque modification, et dans Start, rétablis dans l’asset la valeur enregistrée. Un nouveau joueur conserve la valeur 2 de l’asset.

Appuie sur Play, modifie le vent, puis clique sur Stop et de nouveau sur Play, puis sur Check.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity