Code — ChambreManager
Code source annoté de ChambreManager.cs, ChambreView.cs et ChambreData.cs.
ChambreManager.cs
Gestionnaire principal. Hérite de AbstractSingleton<T>.
using UnityEngine;
using System;
public class ChambreManager : AbstractSingleton<ChambreManager>
{
[Header("Références scène")]
[SerializeField] private GameObject chambrePrefab;
[SerializeField] private Transform chambreParent;
private string _currentEleveId;
public static event Action<ChambreData> OnChambreChargee;
public static event Action OnChambreErreur;
public void ChargerChambre(string idEleve)
{
_currentEleveId = idEleve;
PlayFabManager.Instance.GetChambreData(
idEleve,
OnDataLoaded,
OnDataErreur
);
}
public void ViderChambre()
{
foreach (Transform child in chambreParent)
Destroy(child.gameObject);
}
private void OnDataLoaded(ChambreData data)
{
ViderChambre();
var instance = Instantiate(chambrePrefab, chambreParent);
instance.GetComponent<ChambreView>().Initialiser(data);
OnChambreChargee?.Invoke(data);
}
private void OnDataErreur(string message)
{
Debug.LogError($"[ChambreManager] {_currentEleveId} : {message}");
OnChambreErreur?.Invoke();
}
}
ChambreData.cs
Structure de données sérialisée depuis PlayFab.
using System;
[Serializable]
public class ChambreData
{
public string eleveId;
public string themeCouleur; // "bleu" | "vert" | "orange"
public string[] mobilierActifs; // IDs des objets placés
public int dynablocksTotal; // monnaie cumulée
}
ChambreView.cs
using UnityEngine;
using System.Collections.Generic;
public class ChambreView : MonoBehaviour
{
[SerializeField] private List<ChambreObjectSlot> slots;
[SerializeField] private SpriteRenderer fondSprite;
[SerializeField] private Sprite[] fonds; // index = thème
public void Initialiser(ChambreData data)
{
AppliquerTheme(data.themeCouleur);
foreach (var id in data.mobilierActifs)
PlacerObjet(id);
}
public void PlacerObjet(string id)
{
var slot = slots.Find(s => s.AccepteObjet(id));
slot?.Placer(id);
}
private void AppliquerTheme(string theme)
{
int index = theme switch {
"vert" => 1,
"orange" => 2,
_ => 0 // bleu par défaut
};
fondSprite.sprite = fonds[index];
}
}