Accueil Github ↗
Itération 3

Menus dynamiques

DynamicMenu : navigation pédagogique générée depuis des FolderSO dans Resources/, DynamicData comme pont vers les scènes de jeu, et LegacyMode enum.

Le dossier DynamicMenu/ génère la navigation pédagogique (matière → exercice → mode de jeu) depuis une hiérarchie de FolderSO stockés dans Assets/Resources/ContenuPedagogiqueData/. Aucune ligne de code à modifier pour ajouter une nouvelle matière ou un nouvel exercice.

[!NOTE] Un commentaire en tête de DynamicMenuManager.cs indique qu’un refactoring est prévu pour simplifier l’intégration de nouveaux éléments. Le système actuel est fonctionnel mais contient une logique de tri manuelle des chemins.

FolderSO — données d’un nœud de menu

Chaque fichier FolderSO dans Resources/ représente un nœud de la hiérarchie. Trois types de nœuds :

TypeChamp actifComportement
DossierisExercice = false, isModeDeJeu = falseNavigue dans le sous-dossier
ExerciceisExercice = trueÉcrit dans DynamicData et affiche la carte activité
Mode de jeuisModeDeJeu = trueOuvre le frame de paramètres correspondant (un prefab)

Un nœud Exercice peut aussi être “spécial” (exerciceData.isSpecialExercice), auquel cas il instancie un menu personnalisé au lieu d’écrire dans DynamicData directement.

Les nœuds Dossier peuvent avoir des capsules de révision (hasCapsules) — des images affichées en diaporama avant de lancer l’activité.

DynamicMenuManager — orchestrateur

MonoBehaviour qui gère l’affichage. À l’activation (OnEnable), il charge le dossier racine.

Flux de navigation

OnEnable → LoadRacineFolder() → LoadSubFiles("ContenuPedagogiqueData")

                        Resources.LoadAll<FolderSO>(path)
                        filtre par path == assetDirectory

                          ┌───────────┼────────────┐
                      Dossier     Exercice      ModeDeJeu
                          │           │              │
                    LoadSubFiles  Écrit dans   CreateParametersFrame
                     (sous-dossier) DynamicData   (instancie prefab)
                                    + affiche carte

ButtonCommencerAction() — déclenche OnButtonCommencerClicked (pour que les ModeParameters sauvegardent leurs choix dans DynamicData) puis charge la scène selon DynamicData.mode :

LegacyModeScène chargée
Video / InteractifScenesDatabase.GetRandomAPAScenePath()
VideoAS / InteractifASAS_QCM
PenduASAS_Pendu

Bouton retour

À chaque navigation, UpdateBackButton(path) reconfigure le bouton. Si on est à la racine, il retourne au menu principal (mainMenuGo). Sinon, il remonte d’un niveau via GetParentPath().

DynamicData — pont vers les scènes de jeu

Classe statique qui stocke les choix de l’utilisateur. Les GameManagers la lisent au démarrage de la scène de jeu.

PropriétéTypeDéfautDescription
modeLegacyModeVideoMode de jeu sélectionné
TitreActivitystring"DevMode"Titre affiché dans la scène
SousTitreActivitystring"DevMode"Sous-titre
ConsigneActivitystring"DevMode"Instructions
AideMemoireActivitystring"DevMode"Aide-mémoire
JsonFilesTextAsset[]nullFichiers JSON de questions
IseSilentboolfalseMode silencieux
UsePresenceboolfalseUtiliser la liste de présence
TagsApmvList<AnimationTag>[APA, APMV]Tags animations d’effort
TagsAplList<AnimationTag>[APA, APL]Tags animations repos
PropositionsReponseint3Nombre de choix QCM
NbreQuestionsint6Nombre de questions (pair pour AS vidéo)
DelaiReponseint7Secondes par question (mode vidéo)
NbrRepetitionsint2Cycles APMV+APL
JSONsSelectorList<bool>videSélection de fichiers JSON spécifiques
TablesSelectionnesList<int>videTables de multiplication (jeux mélangés)

LegacyMode enum

public enum LegacyMode {
    Video,       // APA vidéo
    Interactif,  // APA interactif
    VideoAS,     // AS vidéo
    InteractifAS,// AS interactif
    PenduAS      // AS pendu
}

[!WARNING] Renommé de Mode en LegacyMode pour éviter le conflit CS0433 avec ActivityDataManager.Mode (deux assemblies différentes). Le refactoring utilise CogniActif.Contracts.IActivityContext.Mode (string).

Ajouter un nouvel exercice

  1. Créer un asset FolderSO dans le bon sous-dossier de Resources/ContenuPedagogiqueData/.
  2. Remplir displayName, folderName, path (chemin Unity relatif).
  3. Cocher isExercice = true.
  4. Remplir titreForActivity, consigneForActivity, jsonFiles.
  5. Le bouton apparaît automatiquement dans le menu au prochain lancement.