Salut
C'est quoi le meilleur moyen pour gérer les stats du personange ?
Ceux des ennemies seraient fixe
Mais ceux du joueur évolue en fonction de l'équipement du joueur
Si j'équipe une armure je dois par exemple ajouter + 10 en intelligence au personnage.
Mettre chaque variable sur le personne a la main semble peu structuré.
Tu peux utiliser un tableau avec des clefs/valeurs (il me semble que ça s'appelle un dictionnaire en C#). Tu as ensuite une fonction qui fait la somme de touts les ajouts pour donner la valeur totale, le tableau donnerait quelque chose du genre :
{
"Base" : "+10"
"Items" : +25"
"Bonus" : "+5%"
"Malus" : "-3"
}
La fonction parse donc les valeurs pour savoir si il faut ajouter, retirer ou prendre un pourcentage, puis elle retourne la valeur finale que tu peux utiliser pour le reste de t'es calcules.
Il faut créer une classe pour le modificateur, et une classe "stat".
Fait tes recherches il existe des tutos.
@Le_Tryall : utiliser un dictionnaire pour ça me semble une mauvaise idée, surtout si c'est pour y stocker des strings à parser.
Un tuto qui m'a bien servi, perso : https://youtu.be/HMIeqhXU-6M
Ou ici, la même chose dans un autre tuto : https://youtu.be/aPXvoWVabPY
Je sais plus s'ils utilisent Bolt dans les 2 vidéos par contre, je pense pas que tu verras comment gérer le script pour la modification des stats, je fais tout avec Bolt en-dehors du script du tuto que j'ai copié pour le modifier pour mon jeu.
Le 10 août 2020 à 23:37:08 Scyllis a écrit :
Un tuto qui m'a bien servi, perso : https://youtu.be/HMIeqhXU-6M
Ou ici, la même chose dans un autre tuto : https://youtu.be/aPXvoWVabPYJe sais plus s'ils utilisent Bolt dans les 2 vidéos par contre, je pense pas que tu verras comment gérer le script pour la modification des stats, je fais tout avec Bolt en-dehors du script du tuto que j'ai copié pour le modifier pour mon jeu.
J'utilise Bolt mais les SO se font en C#.
J'ai déjà vu OWS mais ca vidéo est juste la base du fonctionnement d'un SO avec Bolt ca aide pas trop pour faire un truc aussi développé que les Stats.
Par pu hasard pourrait tu partagé ta réalisation ?
¨Dans les tutos que je t'ai mis j'ai trouvé comment faire les stats, après peut-être que t'as besoin de faire un truc que j'ai pas fait ?
J'te partage/explique ça quand j'ai un peu de temps, je re ce soir probablement.
Yep c'est en C# mais je disais ça par rapport au fait que son utilisation était dans Bolt et pas utilisé dans un script.
Pourquoi ne pas crée une classe de base ou une interface Istat qui serait implémenté par tes items, ensuite il suffirait de parcourir tes items et récupérer les infos grace à cette interface.
du genre public interface IStat
{
int Intelligence { get; set; }
int Force { get; set; }
int Endurance { get; set; }
int Dexterite { get; set; }
}
public class Armure : IStat
{
public int Intelligence { get; set; }
public int Force { get; set; }
public int Endurance { get; set; }
public int Dexterite { get; set; }
public string Nom { get; set; }
public int Rang { get; set; }
}
public class Personnage : IStat
{
public int Intelligence { get; set; }
public int Force { get; set; }
public int Endurance { get; set; }
public int Dexterite { get; set; }
public Armure Armure { get; set; }
public Armure Casque { get; set; }
public Armure Gants { get; set; }
public Personnage()
{
Intelligence = 10;
Force = 10;
Endurance = 10;
Dexterite = 10;
Armure = new Armure();
Armure.Nom = "armure malefique";
Armure.Rang = 1;
Armure.Endurance = 10;
Casque = new Armure();
Casque.Nom = "casque malefique";
Casque.Rang = 1;
Casque.Force = 10;
Casque.Dexterite = 5;
CalculerStat(Casque, Armure, Gants);
}
private void CalculerStat(params IStat[] equipements)
{
if (equipements != null)
{
foreach (var item in equipements)
{
if (item != null)
{
this.Dexterite += item.Dexterite;
this.Force += item.Force;
this.Endurance += item.Endurance;
this.Intelligence += item.Intelligence;
}
}
}
}
}
C'est juste une façon de l'écrire à toi de trouver ce qui te convient le mieux, tu peux l'écrire de 1000 façons possible
Re, je sais pas ce que t'as pas compris précisément, donc je vais résumer le fonctionnement :
T'as un script que tu vas mettre sur ton player ou tout GameObject sur lequel tu veux mettre tes stats que j'ai appelé StatsHandler dans lequel tu vas mettre les stats de l'objet, et qui ressemblera à ça :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class StatsHandler : MonoBehaviour
{
[SerializeField]
private CreatureStats stats; // Stats dans l'inspector
private void OnEnable()
{
if(stats != null)
{
this.gameObject.name = stats._name; // Renommer l'objet dans la hiérarchie
this.gameObject.GetComponent<NavMeshAgent>().speed = stats.speed;
this.gameObject.transform.localScale = new Vector3(1f, stats.height, 1f);
this.gameObject.GetComponentInChildren<MeshRenderer>().material = stats.color;
}
}
}Le SerializeField sert à faire apparaître un nouveau champ dans l'objet pour pouvoir mettre les stats dedans.
Juste en-dessous de SerializeField :
CreatureStats c'est le nom de mon script pour les stats.
stats c'est pour nommer la nouvelle ligne "stats" dans le nouveau champs.
Plus bas, si les champs stats ne sont pas vides, la première ligne this.gameObject.name = stats._name; c'est pour renommer le GameObject avec ce qu'on aura mis dans le champs "_name",
la seconde pour changer la vitesse avec le contenu du champs speed des stats,
ensuite pour la hauteur, ici ça change que le scale en Y,
et la dernière ligne pour attribuer la couleur
Ici c'est pour un jeu d'élevage.
Ensuite t'as le script qui te sert à faire tes stats :
using UnityEngine;
[CreateAssetMenu(fileName = "Creature Stats",menuName = "Creature Stat")]
public class CreatureStats : ScriptableObject
{
public string _name; //Underscore pour Bolt
public string stable;
public string breeder;
public bool sex;
public Material color;
public int fertility;
public int age;
public float consanguinity;
public bool savage;
public bool pregnant;
public float pregnancy;
public ScriptableObject mother;
public ScriptableObject father;
// Stats santé
public float health;
public float humidity;
// Stats "réput" + humeur
public float opinion;
public float mood;
// Stats utilité
public string temperament;
public float speed;
public float height;
public float agility;
// Gènes
public string geneRobe1;
public string geneRobe2;
public Color geneYeux1;
public Color geneYeux2;
public string genePoil1;
public string genePoil2;
}[CreateAssetMenu(fileName = "Creature Stats",menuName = "Creature Stat")]Ça c'est pour créer une nouvelle ligne quand tu cliques droit pour ajouter quelque chose dans tes assets, c'est ce qui va ajouter de nouvelles stats attribuables à tes GameObjects.
Après t'as la ligne pour en faire un ScriptableObject.
Puis un champs _name, apparemment l'underscore est important pour pas prendre un autre champs "name" qui existe par défaut pour je ne sais plus quoi.
Puis toutes les lignes dont t'as besoin pour tes stats (mon public ScriptableObject mother; + la ligne en-dessous c'est un essai, aucune idée de si ça marche comme ça).
Ensuite pour ajouter tes stats dans Bolt tu vas sur Unity, dans Tools > Bolt > Setup Wizard, y a une fenêtre qui s'ouvre. Tu fais next, choisis ce que tu veux, tu vas en bas, tu fais next, tu re-vas en bas puis tu cliques sur le + si pas déjà fait et tu ajoutes ton script de stats, puis tu fais Generate.
Maintenant dans Bolt tu peux connecter les champs de tes stats.
Tu vas dans ton dossier scripts, tu clic droit > Create > tu cliques sur le nouveau champs que t'as ajouté grâce au script des stats, pour moi c'est "Creature Stat", ça créée de nouvelles stats avec tous les champs que tu as mis.
Ensuite tu vas sur ton GameObject du perso auquel tu veux mettre les stats, tu lui ajoute le script Stats Handler.
Dans le champs vide dans le script tu glisses les stats du perso que tu viens de créer.
Dans ton GameObject de ton perso tu créée une variable (variable object donc), tu la nommes "Stats", tu la mets de type "Creature Stats" (pour moi, pour toi c'est le nom de ton script de stats, celui que t'as mis dans Bolt). Dans Value tu glisses là aussi les stats de ton perso.
Maintenant pour récupérer tes stats il te suffit de faire un Get Variable Object. Soit tu laisses sur Self si le script est dans l'objet concerné, soit à la place de self tu mets ton objet.
En sortie tu mets ce dont t'as besoin, en gros dans la recherche de bolt tu vas mettre le nom du script que tu as chargé dans Bolt, ici Creature Stats, et il te proposera expose Creature Stats si t'as besoin de tous tes champs, et les champs un par un (Get Age, Set Age...).
Tu mets Get si t'as besoin de récupérer le contenu, set si tu veux modifier le contenu.
En gros t'as la variable que t'appelle pour récupérer les stats, puis tu lui dis de quelle partie tu as besoin.
Par exemple ici, en haut à gauche je récupère la variable, puis récupère la partie Fertility parce que je veux que mes animaux deviennent stériles au bout d'un certain nombre de repros. Donc je vérifie que la stat Fertility est supérieure à 0.
Sur la droite je récupère Pregnant qui est un bool pour savoir si elle est déjà enceinte ou pas.
Bref, j'espère que c'était clair, je sais pas si ça répond à ta question ?
Merci de ton message.
Du coup avec ca tu peux créer des stats différentes pour tous tes persos.
Et après pour mon personnage je peux modifiers les stats quand j'équipe un item.
Ca va modifier les stats sur mon perso ou le scriptable object ?.
J'ai pas encore essayé de faire un système de stuff, je n'en ai pas eu besoin pour l'instant, donc pour les détails je ne sais pas encore, faudra fouiller un peu.
Mais en ayant compris ce que je t'ai expliqué et en cherchant un peu, y a pas de raison pour que t'y arrives pas, c'est une addition entre les stats du stuff et les stats de base, quoi. Après je vais pas t'expliquer étape par étape avec ce que je pense, parce que si ça se trouve y aura des trucs auxquels j'aurais pas pensé, donc faut tester.
Bref, vois si t'as compris ce que j'ai expliqué plus haut, fais tes stats, puis vois comment tu peux faire ça proprement pour le stuff, et si ça marche pas tu cherches pourquoi. Tu apprendras pleins de choses en cherchant, largement plus que si tu copies une solution toute faite (surtout sans la comprendre).