[DB AL]Faire une barre de vie

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

[DB AL]Faire une barre de vie

Message par Nemo67 » 02 Nov 2019 16:35

Bonjour,

Je suis un débutant et j'utilise la dernière version d'Unity (2019.2.11f1).

Pour mon projet je souhaite créer une barre de vie qui décroit lorsque que le FPS player tombe de trop haut sur le terrain).
Pour l'instant j'ai mis en place un Canvas avec un ButtonSpacebarSprite.

J'utilise comme FPS player le prefab de base d'Unity RigidBodyFPSController.
Je pense qu'il faudrait chopper quelque part la valeur de vélocité d'Y et baisser la barre de vie en fonction de la chute.

Quelqu'un pourrait m'aider ou me filer un petit script pour faire cela ?

Merci d'avance,

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB AL]Faire une barre de vie

Message par Max » 02 Nov 2019 18:03

Bonjour,

Nemo67 a écrit :
02 Nov 2019 16:35
J'utilise comme FPS player le prefab de base d'Unity RigidBodyFPSController.
Je pense qu'il faudrait chopper quelque part la valeur de vélocité d'Y et baisser la barre de vie en fonction de la chute.
Pour la vélocité, tu peux la récupérer sur le m_Rigidbody au niveau du script du RigidBodyFPSController, voir la doc sur Rigidbody.velocity.

Concernant la barre de vie, là c'est l'autre aspect (à la base indépendant). Les tuto ne manquent pas sur le sujet.

Quand tu auras passé les deux étapes, il faudra alors songer à lier les deux ;)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: [DB AL]Faire une barre de vie

Message par Nemo67 » 03 Nov 2019 00:49

Merci pour les conseils.

En fait j'essaye d'adapter un scripte qu'on m'avait filer et qui était conçu initialement pour un FirstPersonController classique.
Dans ce scripte la vélocité était chopée dans CharacterController mais je ne sais pas comment l'adapter pour un RigidBodyFPSController ? Une âme charitable pourrait m'aider à faire les changements ? L'objectif étant d'afficher le Deatmenu lorsque la vie <=0.

Code : Tout sélectionner

private void OnControllerColliderHit(ControllerColliderHit hit) // fonction gerant la detection de chute
    {
        if(GetComponent<CharacterController>().velocity.y <= -minimumFalling && !falling)
        {
            GetFallDamage(GetComponent<CharacterController>().velocity.y);
            falling = true;
        }

    }
    void GetFallDamage(float yVelocity) // fonction qui gere les degats de chute
    {
        pv -= Mathf.RoundToInt( -yVelocity * fallingRatio);
        SetPvBar();
        StartCoroutine(ResetFallingBool());

        if (pv <= 0) DeathMenu();

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB AL]Faire une barre de vie

Message par Max » 03 Nov 2019 11:36

Bonjour,

là tu pars sur du bricolage, pas très sein comme approche.
Pour ce qui est de chopper la vélocité de ton Player, je t'ai donné en grande partie la réponse dans mon précédent message. Tu l'auras par le biais de m_RigidBody.velocity, donc pour la partie verticale: m_RigidBody.velocity.y.

Dans ton cas le principe est de se dire:
Si on touche un élément du sol avec une vélocité verticale trop grande, alors je soustrait des points de vie.
Donc au niveau du script RigidbodyFirstPersonController, pour détecter quand le player touche le sol tu peux t'aider de la methode GroundCheck(), et pour tester la valeur de descente donc de m_RigidBody.velocity.y.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: [DB AL]Faire une barre de vie

Message par Nemo67 » 03 Nov 2019 12:14

Merci.
Tu n'as pas un lien vers un exemple de code proche de ce que je voudrais faire ?

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB AL]Faire une barre de vie

Message par Max » 03 Nov 2019 13:18

Nemo67 a écrit :
03 Nov 2019 12:14
Tu n'as pas un lien vers un exemple de code proche de ce que je voudrais faire ?
Non, et tu as bien peu de chance d'en trouver un. Si pour chaque implémentation d'une nouvelle mécanique dans ton jeu tu comptes la dessus, tu es mal barré.
A un moment, si tu veux vraiment t'impliquer dans la création de ton projet, il va falloir apprendre les bases, et passer outre le bricolage de bout de script trouvé ça et là. Après, pour des explications et autres conseils, le forum est ton ami.

Dans mes messages, je t'es donné l'essentiel. Regarde le fonctionnement de la méthode GroundCheck() dans le script du controller. Elle permet de savoir si ton player est sur le sol ou pas. Après, tu peux très bien y ajouter un test mesurant la vélocité vertical du RigidBody (qui sera négative dans ce cas pour une descente), et voir si elle est supérieure à une valeur de consigne définis par test soin. Une fois cela fait, tu passeras à l'étape suivante, avec l'impact sur les points de vie.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Nemo67
Messages : 35
Inscription : 29 Juil 2017 16:45
Localisation : Alsace

Re: [DB AL]Faire une barre de vie

Message par Nemo67 » 03 Nov 2019 18:05

J'ai trouvé une vidéo qui explique de façon très simple comment appliquer des dégâts d'une chute à un FPS controller.
Je voudrais l'utiliser comme base pour l'adapter à ma situation.

https://www.youtube.com/watch?v=OAbOeeoRy_I

Seulement ça n'est valable que pour un FPS controller qui utilise un character controller et cela ne fonctionne pas avec le RigidBodyFPSController.

Dans ce petit scripte il faudrait, entre autre, que je trouve le moyen de tester la variable m_IsGrounded définie dans le RigidBodyFPSController. GroundCheck étant private je ne sais pas si c'est possible ?
Dans la vidéo, l'auteur utilise le y du transform ; je pense que ça pourrait fonctionner dans mon cas mais le résultat serait surement plus juste avec la vélocité ?

Code : Tout sélectionner

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


public class FPSDamageScript : MonoBehaviour
{

    float lastPositionY = 0f;
    public float fallDistance = 0f;
    public float MaxFall = 5f;
    Transform Player;
    public Text TxHealth;
    public int Health = 100;
    CharacterController Cc;
    
    
    // Start is called before the first frame update
    void Start()
    {

        Cc = GetComponent<CharacterController> ();
        Player = GetComponent<Transform> ();
                   
    }

    // Update is called once per frame
    void Update()
    {
        TxHealth.text = "Health" + Health;

        // Si LP Y est plus grand que pos Y du player -> Il tombe -> Calcul FallDistance
        if(lastPositionY>Player.transform.position.y)
        {
            fallDistance += lastPositionY - Player.transform.position.y;
        }

        if(fallDistance>=MaxFall && Cc.isGrounded)
        {
            Health -= 10;
            ResetVar();
        }

        if(fallDistance < MaxFall && Cc.isGrounded)
        {
            ResetVar();
        }


        // Maj de LastPositionY
        lastPositionY = Player.transform.position.y;
    }
    void ResetVar()
    {
        fallDistance = 0;
        lastPositionY = 0;

    }
}

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB AL]Faire une barre de vie

Message par Max » 03 Nov 2019 21:09

Dans ton cas, ce genre de calcul ne te sert pas vraiment, tu disposes de la vélocité de ton player, comme déjà évoqué plus haut.
Nemo67 a écrit :
03 Nov 2019 18:05
la variable m_IsGrounded définie dans le RigidBodyFPSController. GroundCheck étant private je ne sais pas si c'est possible ?
Tout est possible. C'est la base.
Pour une donnée private, tu peux créer dans le script RigidBodyFPSController une methode public permettant la récupération de m_IsGrounded (moins conseillé, mais tu peux aussi passer m_IsGrounded de private en public).
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

mikart
Messages : 20
Inscription : 20 Mai 2014 23:36

Re: [DB AL]Faire une barre de vie

Message par mikart » 11 Nov 2019 18:49

Bonjour,

Il faut que tu calcule la distance entre ton sol et le player que tu récupère dans une variable
Et que tu calcule l’ancienne position de ou tu es tombé

Je te donne un code ce soir : exemple de code

Code : Tout sélectionner

public Vector3 Velocity;
public Rigidbody RidgedBody;
public bool Vivant = true;
private double dectolerance = 12.0;
 
     void Start() 
     {
         RidgedBody = GetComponent<Rigidbody>();
     }
     void FixedUpdate() 
     {
         if(Vivant)
         {
             // calcule de la distance entre A et B pour voir si le joueur est Vivant
             Vivant = Vector3.Distance(RidgedBody.velocity, Velocity) < dectolerance;
             Velocity = RidgedBody.velocity;
      }
}

Voici une vidéo il faut adapter les code : https://www.youtube.com/watch?v=J1mf2kDOoT0

Répondre

Revenir vers « (C#) CSharp »