suite à plusieurs vidéos proposés par YT, j'ai fait quelques essais avec Chat GPT. Voici mon dernier essai, je l'ai trouvé plutôt pas mal, et le voici :
[Moi] Pour Unity, fais moi un composant Health
[Chat GPT] Bien sûr ! Voici un exemple de composant Health pour Unity qui peut être ajouté à un GameObject :
Code : Tout sélectionner
using UnityEngine;
public class Health : MonoBehaviour
{
public float maxHealth = 100f;
public float currentHealth;
public bool isDead = false;
void Start()
{
currentHealth = maxHealth;
}
public void TakeDamage(float damage)
{
currentHealth -= damage;
if (currentHealth <= 0 && !isDead)
{
Die();
}
}
void Die()
{
isDead = true;
Debug.Log(gameObject.name + " is dead.");
// Ajoutez ici du code pour gérer la mort du GameObject, par exemple le désactiver ou le détruire.
}
}
Pour utiliser ce composant, ajoutez-le à un GameObject en sélectionnant le GameObject dans l'éditeur Unity et en cliquant sur "Add Component" dans le volet "Inspector". Vous devriez voir les propriétés du composant dans le volet "Inspector" et vous pourrez les configurer selon vos besoins. Vous pouvez également appeler la méthode TakeDamage depuis d'autres scripts pour infliger des dégâts au GameObject.
[Moi] Pourquoi initialises-tu currentHealth dans Start et pas dans Awake ?
[Chat GPT] La méthode Start est appelée une fois que tous les objets du jeu ont été initialisés et que leurs liens ont été établis. Elle est donc idéale pour initialiser des valeurs qui dépendent de l'état d'autres objets.
En revanche, la méthode Awake est appelée avant que tous les objets du jeu ne soient initialisés et que leurs liens ne soient établis. Elle est donc plus adaptée pour l'initialisation de données indépendantes des autres objets.
Dans le cas du composant Health, l'initialisation de currentHealth à la valeur de maxHealth n'a pas besoin d'être effectuée avant que les autres objets du jeu soient initialisés. Par conséquent, il est plus approprié de le faire dans la méthode Start plutôt que dans la méthode Awake.
Il est également possible de surcharger la méthode OnEnable pour initialiser des valeurs chaque fois que le composant est activé, par exemple après avoir été désactivé avec la méthode GameObject.SetActive(false). Cela peut être utile dans certains cas, mais ce n'est pas nécessaire dans l'exemple du composant Health donné.
[Moi] C'est ce que je me demandais si on construit un pool d'ennemis avec le composant Health. Dans ce cas il vaut mieux utiliser OnEnable.
[Chat GPT] Oui, vous avez raison. Si vous utilisez un système de pool d'ennemis qui réactive des GameObjects au lieu de les détruire et de les recréer, il est préférable d'initialiser les valeurs de currentHealth et isDead dans la méthode OnEnable plutôt que dans la méthode Start. Cela garantit que ces valeurs sont correctement initialisées chaque fois que l'ennemi est réactivé à partir du pool.
Voici comment le composant Health pourrait être modifié pour utiliser la méthode OnEnable :
Code : Tout sélectionner
using UnityEngine;
public class Health : MonoBehaviour
{
public float maxHealth = 100f;
public float currentHealth;
public bool isDead = false;
void OnEnable()
{
currentHealth = maxHealth;
isDead = false;
}
public void TakeDamage(float damage)
{
currentHealth -= damage;
if (currentHealth <= 0 && !isDead)
{
Die();
}
}
void Die()
{
isDead = true;
Debug.Log(gameObject.name + " is dead.");
// Ajoutez ici du code pour gérer la mort du GameObject, par exemple le désactiver ou le détruire.
}
}
--- fin du test ---
Alors bien sûr, il y a des limitations, assez bien décrites par CodeMonkey dans une de ses vidéos :
- L'apprentissage de l'AI s'arrête en 2021 : donc rien sur les nouveautés 2022 (et 2023
)
- Pour Unity et le C#, beaucoup de choses viennent des tutos, dont la qualité est variable. Par exemple, tous les champs du script Health sont déclarés en public, ce qui n'est pas vraiment une bonne pratique.