Implémentation du déplacement du personnage et de la carte en tuiles
Pour gérer le mouvement du joueur, on utilise un Rigidbody2D et des entrées clavier. Lorsque deux touches directionnelles sont pressées simultanément, les valeurs d'entrée sont ajustées pour éviter une vitesse accrue en diagonale.
public class Joueur : MonoBehaviour
{
private Rigidbody2D corpsRigide;
public float vitesse;
private float entreeX;
private float entreeY;
private Vector2 directionMouvement;
private void Awake()
{
corpsRigide = GetComponent<rigidbody2d>();
}
private void Update()
{
EntreesJoueur();
}
private void FixedUpdate()
{
Deplacer();
}
private void EntreesJoueur()
{
entreeX = Input.GetAxisRaw("Horizontal");
entreeY = Input.GetAxisRaw("Vertical");
if (entreeX != 0 && entreeY != 0)
{
entreeX *= 0.6f;
entreeY *= 0.6f;
}
directionMouvement = new Vector2(entreeX, entreeY);
}
private void Deplacer()
{
corpsRigide.MovePosition(corpsRigide.position + directionMouvement * vitesse * Time.deltaTime);
}
}</rigidbody2d>
La structure de la carte en tuiles comprend plusieurs couches : sol (fond, milieu, haut), décorations (stuff1, stuff2), creusage, arrosage, instance du personnage, et couches de collision. Chaque couche est gérée par un layer distinct. Pour éliminer les espaces entre tuiles, on utilise un Sprite Atlas, qui regroupe toutes les images en une seule texture.
Caméra pixel parfaite et limites
On ajoute un composant Pixel Perfect Camera à la caméra principale et utilise Cinemachine pour un suivi fluide. Pour définir des limites, on applique un Cinemachine Confiner avec un Polygon Collider2D. Il est crucial que les limites de la carte soient supérieures aux limites des collisionneurs du personnage, qui doivent être supérieures ou égales aux limites du Polygon Collider2D.
Arbres décoratifs avec animation et transparence
Les arbres sont composés d'une couronne (top) et d'un tronc (trunk). Un composant Animator est ajouté à la couronne pour des animations dynamiques. Des scripts ItemFader contrôlent la transparence lorsque le personnage s'approche, modifiant l'alpha via DOTween.
public class FaderObjet : MonoBehaviour
{
private SpriteRenderer renduSprite;
private void Awake()
{
renduSprite = GetComponent<spriterenderer>();
}
public void FonduSortie()
{
Color couleurCible = new Color(1, 1, 1, Parametres.alphaCible);
renduSprite.DOColor(couleurCible, Parametres.dureeFondu);
}
public void FonduEntree()
{
Color couleurCible = new Color(1, 1, 1, 1);
renduSprite.DOColor(couleurCible, Parametres.dureeFondu);
}
}</spriterenderer>
Un composant TriggerFaderObjet sur le personnage déclenche ces fonctions lors des collisions avec les arbres.
Système d'inventaire et objets
On définit un enum TypeObjet pour catégoriser les items (graines, marchandises, outils, etc.). Une classe DetailsObjet contient les métadonnées : icône, description, prix, etc. Un ScriptableObject ListeDonneesObjets_SO sert de base de données.
public enum TypeObjet
{
Graine, Marchandise, Meuble,
OutilHoue, OutilHache, OutilBriser, OutilRecolte, OutilArroser, OutilCollecter,
SceneryRecoltable
}
[System.Serializable]
public class DetailsObjet
{
public int idObjet;
public string nom;
public TypeObjet typeObjet;
public Sprite iconeObjet;
public Sprite spriteMonde;
public string description;
public int rayonUtilisation;
public bool ramassable;
public bool largable;
public bool transportable;
public int prix;
[Range(0, 1)]
public float pourcentageVente;
}
L'InventaireManager gère les données des objets et permet d'ajouter, retirer ou échanger des items dans l'inventaire du joueur. L'UI de l'inventaire utilise des slots qui affichent les icônes et quantités.
Événements et communication
Un système d'événements statiques dans GestionnaireEvenements facilite la communication entre les composants. Par exemple, pour mettre à jour l'UI de l'inventaire :
public static class GestionnaireEvenements
{
public static event Action<localisationinventaire list="">> MiseAJourUIInventaire;
public static void AppelerMiseAJourUIInventaire(LocalisationInventaire localisation, List<objetinventaire> liste)
{
MiseAJourUIInventaire?.Invoke(localisation, liste);
}
}</objetinventaire></localisationinventaire>
Système de temps et transtiions de scène
Le temps de jeu est géré par GestionnaireTemps, avec des secondes, minutes, heures, jours, saisons et années. Des événements notifient les changements. Pour les transitions de scène, GestionnaireTransition charge et décharge les scènes de manière asynchrone, avec un fondu visuel.
Cultures et récoltes
Les cultures sont définies dans un ScriptableObject DonneesCulture_SO. Le GestionnaireCultures gère la plantation, la croissance et la récolte. Les arbres ont des animations de balancement et de chute, avec des effets de particules pour les feuilles.
Pathfinding A* pour les PNJ
L'algorithme A* est implémenté avec des classes Noeud et GrilleNoeuds. Le GestionnairePNJ utilise des itinéraires prédéfinis et des horaires pour déplacer les PNJ entre les scènes, avec des horodatages pour chaque étape.
Dialogue et fonctionnalités des PNJ
Les dialogues sont stockés dans une liste de FragmentDialogue. Le ControlleurDialogue sur les PNJ affiche les dialogues via une UI dédiée. Les PNJ peuvent ouvrir des magasins avec un système de transaction, géré par InterfaceTransaction.
Lumière et son
Les effets de lumière 2D sont ajustés dynamiquement en fonction de l'heure et de la saison, via un ScriptableObject ListeModelesLumiere_SO. Pour l'audio, des banques de sons et de musiques sont chargées par GestionnaireAudio, avec un AudioMixer pour contrôler les volumes.
Sauvegarde et chargement
L'interface ISauvegardable est implémentée par les gestionnaires, avec un GUID unique pour chaque entité. GestionnaireSauvegardeCharge sérialise les données en JSON et les charge depuis des fichiers.
Menus et interface utilisateur
L'UI principale gère les menus, les panneaux de pause et les sélecteurs de sauvegarde. Le système utilise des événements pour ouvrir et fermer les interfaces de jeu.