Accueil Forums J’ai besoin d’aide Unity3D [C#] Problème systeme de vie

Ce sujet a 20 réponses, 2 participants et a été mis à jour par  Nex, il y a 2 mois et 1 semaine.

15 sujets de 1 à 15 (sur un total de 21)
  • Auteur
    Messages
  • #1518

    Nex
    Participant

    Bonjour à tous, je n’arrive pas à faire un simple script en C# , pourtant j’ai tout essayé…
    ça paraît simple mais j’ai ce problème depuis une semaine…
    Merci d’avance !

    —- —- —- SCRIPT POUR APPLIQUER UNE VALEUR (Dégât) —- —- —-

    using UnityEngine;
    using System.Collections;

    public class WeaponsDamage : MonoBehaviour {

    public int ApplyDamage = 25; //Le dégât que j’appliquerais avec cette arme.

    void OnCollisionEnter (Collision col)
    {
    if(col.gameObject.tag == “Enemy”) //Le tag est bien en Enemy
    {
    Health -= ApplyDamage;

    }
    }
    }

    —- —- —- SCRIPT POUR L’ENNEMIE (VIE) —- —- —-

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class Enemy : MonoBehaviour {

    public int Health = 100;

    void ApplyDamage(int ApplyDamage)
    {
    Health -= ApplyDamage;

    if (Health <= 0)
    {
    Dead();
    }
    }

    void Dead()
    {
    Destroy(gameObject);
    }
    }

    #1519

    Nex
    Participant

    L’arme est une hache et j’aimerais appliqué 25 dégât /100 sur un ennemie/arbres etc…

    #1527

    Zhass
    Participant

    Salut !

    Est ce que tu appel bien ta fonction ApplyDamage quelque part ? ^^ Parce que la je vois pas où tu l’appelle.

    #1528

    Nex
    Participant

    Salut Zhass, merci pour ta réponse, tu es rapide 🙂
    Elle n’est pas dans le script de l’Ennemie ?
    ” void ApplyDamage(int ApplyDamage) ” ?
    Merci 🙂

    #1529

    Zhass
    Participant

    Pas de problèmes 🙂

    Non, dans cette ligne tu la déclare, tu ne l’appel pas ^^

    Les fonctions c’est comme quelqu’un, si tu l’appel pas, il ne vient pas c’est normal ^^

    Maintenant que tu as déclaré ta fonction ApplyDamage, il faut que tu l’appel au moment où tu veux qu’elle s’exécute en faisant juste ApplyDamage(tonDommage) aux moment ou il y a collision entre la hache et l’objet 🙂

    Il ne faut pas mélanger entre les fonctions globales du moteur (void OnCollisionEnter(),Void OnTriggerEnter()….) et les fonctions que tu crées toi même.

    Car les fonctions globales sont appelées en les déclarant , c’est à dire void OnTriggerEnter(Collider Other).
    Mais les fonctions que tu crées toi, ont besoins d’êtres déclarées comme ceci : void ApplyDamage(int Damage) et appelées au moment voulu en faisant : ApplyDamage(10)

    Comme unity connait déjà les fonctions globales, il sait quand les gérer : au moment d’une collision, d’une entré dans le trigger…. Mais quand ce sont des fonctions personnelles il faut lui dire quand l’exécutée 🙂 En espérant t’avoir éclairci 🙂

    • Cette réponse a été modifiée le il y a 4 mois par  Zhass.
    #1536

    Nex
    Participant

    Oui tu m’éclaircies beaucoup, je te remercie ! 🙂
    Donc il faut que je l’appel, je pense me rapprocher du but final de mon script mais il ne fonctionne pas totalement ^^

    Voici le script (avec les améliorations, j’espère) ^^

    Weapons.cs

    Puis :

    DestroyObject.cs

    Merci 🙂

    • Cette réponse a été modifiée le il y a 4 mois par  Nex.
    • Cette réponse a été modifiée le il y a 4 mois par  Nex. Raison: Quelques erreurs :)
    #1539

    Zhass
    Participant

    Oui ce serait ça 🙂

    Par contre dans le 1er script, au lieux de faire ApplyDamage(25), tu peux faire ApplyDamage(damage)
    Comme tu as créée une variable pour au début du script 🙂

    Mais dans ton deuxième Script tu recrées la fonction ? 🙂

    #1540

    Nex
    Participant

    Ah parfait !
    Oui j’ai remplacer le 25 par (damage), c’est plus pratique tu as raison 😉

    J’ai enlever la fonction sur le deuxième script, cependant j’ai une erreur :

    ça me dis que le int “Health” n’est pas présent dans le script du weapons et le int “damage” est introuvable dans le script du Health, comment je peux liés les “int” entre les deux scripts ?
    Merci à toi 🙂

    Weapons

    Health

    #1543

    Zhass
    Participant

    Alors pour ce problème rien de bien compliqué 🙂 dans ton script weapon :

    Tu fais une variable de type Int qui contiendra la vie de l’ennemi touché
    Donc :

    Int Health = 0; //pour l’instant égale à rien

    Void onCollisionEnter(Collision col)
    {
    if(col.gameobject.tag == “Enemy”)
    {
    Health = col.gameobject.GetComponent<DestroyObject>().Health //ici on récupère la vie de l’ennemi touché que tu pourra utiliser dans la fonction ApplyDamage ensuite

    }
    }

    Et par contre je vois pas pourquoi tu as créé l’autre script ? Car il sert juste à détruire l’ennemi si il n’a plus de vie ?

    Car comme maintenant tu récupères la vie de l’ennemi touché en question, tu peux la checker directement dans le script weapon.cs . Avec :

    If(Health <= 0)
    {
    Destroy (col.gameobject);
    }

    Dans la condition : if(col.gameobject.tag == “Enemy”)

    🙂

    #1544

    Nex
    Participant

    Mec, tu es un dieu, mais vraiment !
    Merci beaucoup pour tes conseils et tes renseignement, depuis le temps que je cherchais tout ça… ^^

    En espérant que ça aide aussi pour les autres qui, comme moi débute dans la programmation 🙂

    J’ai constitué 2 scripts pour modifier dans l’inspector la valeur des vies de chaque personnage

    sur un zombie : Health = 80
    sur un personnage : Health = 100

    car ça m’évite de refaire un script pour chacun,
    ensuite pareil pour les armes :

    avec une hache : damage = 25
    avec une épée : damage = 20

    Par contre je mets quoi après :

    void OnCollisionEnter(Collision col)
    {
    if (col.gameObject.tag == “Enemy”) {
    Health = col.gameObject.GetComponent<DestroyObject>().Health;

    Car ça va récupérer la vie, mais elle n’applique pas le damage de cette fonction ^^ :

    void ApplyDamage(int damage)
    {
    Health -= damage;
    }

    • Cette réponse a été modifiée le il y a 4 mois par  Nex.
    #1546

    Zhass
    Participant

    Je vois pas ce que tu veux dire ^^

    Quand tu récupères Health, c’est la vie de l’objet ennemie. Donc si tu fais Health -= 10, l’objet ennemi va bien avoir 10 points de vie en moins normalement.

    Parce que l’ennemie ne perd pas de vie ? 🙂

    #1547

    Nex
    Participant

    Non, l’ennemie ne perd pas de vie ^^
    Enfaite, je crois que je lui renseigne pas qu’il doit perdre la valeur du “int damage” dans le void OnCollisionEnter()

    Voici ce que j’ai à présent 🙂

    weapons

    destroyobject

    #1548

    Zhass
    Participant

    Je te propose de changer tes scripts parce qu’ils sont assez redondants ^^

    Du coup te voilà un code que je pense qu’il est fonctionnel (je suis pas chez moi sur Unity donc c’est un peux en impro ^^ )

    Script Weapon :

    public int damage = 25;
    private int Health = 0;

    Void OnCollisionEnter(Collision col)
    {
    if(col.gameobject.tag == “Enemy”)
    {
    Health = col.gameobject.GetComponent<DestroyObject>().Health; //donc la on récupère la variable public health de tes ennemis touchés
    Health -= damage; //pas besoins de créer une fonction pour ça, tu peux le faire avec une simple ligne 🙂
    }
    }

    Script sur les ennemies (DestroyObject) :

    public int Health = 100; //ici c’est la variable qu’on récupère dans le script weapon quand cet ennemi sera touché.

    if(Health <= 0)
    {
    Destoy(this.gameobject); //si il n’a plus de vie, on détruit l’object qui possède ce script (pas besoins de faire la fonction Dead ici aussi ) 😉
    }

    Voilà, je pense que cela fonctionnera. Si il y a un problème tu me dis 😉

    #1562

    Nex
    Participant

    Salut, désolé pour la réponse tardive, j’était partie ^^

    J’ai testé ton script, c’est beaucoup plus clair, mais encore une fois, il ne fonctionne pas :/

    J’ai fais un cube bleu avec comme component : Rigidbody, Box collider (trigger on), script destroyObject.cs
    et une hache avec comme component : rigidbody, box collider, script weapons.cs

    et quand je rentre dans le cube avec la hache dans les mains, je regarde l’inspector du cube, il à toujours ses 100 points de vie (Health = 100) :/
    Ceci dit, donc script n’a aucune erreur 🙂

    #1563

    Zhass
    Participant

    Salut, pas de soucis 🙂

    Ah mince, désolé je pensais que le script marchait ^^ mais j’étais pas sur mon pc donc c’est plus compliqué 😛

    Mais du coup, UPLN a fait une vidéo qui pourrait bien t’aidé je pense 😉

15 sujets de 1 à 15 (sur un total de 21)

Vous devez être connecté pour répondre à ce sujet.