Comment utiliser au mieux le Rigid Body pour son controller 2D

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Poyo4
Messages : 2
Inscription : 16 Juin 2023 14:05

Comment utiliser au mieux le Rigid Body pour son controller 2D

Message par Poyo4 » 24 Jan 2025 16:57

Bonjour, merci d'avance à tous ceux qui prendront le temps de m'aider :)
Désolé d'avance avec les fautes, je suis dysorthographique.
Ma question n'est pas forcément extrêmement précise mais je suis curieux d'avoir l'avis de gens plus expérimenté

Pour le contexte je suis en train d'essayer de crée un controller pour un personnage 2D qui irait un peu plus loin que les sysème très basique que j'ai crée jusqu'ici

Voici la méthode que j'appelle dans FixedUpdate pour gérer mon mouvement sur l'axe X

Code : Tout sélectionner

private void MoveManagement()
{
    bool isAccelerating = CurrentDirection.x != 0;
    if (!isAccelerating)
    {
        //deceleration
        AccelerationProgress -= Time.fixedDeltaTime / m_decelerationTime;
        AccelerationProgress = Mathf.Clamp01(AccelerationProgress);
    }
    else
    {
        //acceleration
        if (LastVerticalDirectionBeforStop != CurrentDirection.x)
        {
            //reset acceleration progress if we change direction
            LastVerticalDirectionBeforStop = CurrentDirection.x;
            AccelerationProgress = 0;
        }
        AccelerationProgress += Time.fixedDeltaTime / m_accelerationTime;
        AccelerationProgress = Mathf.Clamp01(AccelerationProgress);
    }
    float curveValue = isAccelerating ? m_accelerationCurve.Evaluate(AccelerationProgress) : m_decelerationCurve.Evaluate(1 - AccelerationProgress);
    float targetSpeed = m_maxSpeed * curveValue * LastVerticalDirectionBeforStop;

    m_rigidBody.linearVelocityX = targetSpeed;
}
AccelerationProgress est un float qui contient une valeur entre 0 et 1 et qui représente le pourcentage de notre vitesse max à la qu'elle ont avance actuellement
Et ensuite grâce au curve (m_accelerationCurve et m_decelerationCurve) ont vas pouvoir faire une accélération/décélération smooth.
Mais si ça vous perd, dite vous que curveValue n'est pas nécessaire et que on pourrait directement la remplacer par AccelerationProgress

le problème c'est que ce script vient constamment reset la vélocité de mon personnage, si un élement exterieurs lui applique une force j'aimerais la garder et que mes inputs viennent simplement la modifier.

J'ai déjà essayer d'utiliser des AddForceX ou de faire des m_rigidBody.linearVelocityX += mais ducoup il dépasse ça maxSpeed, et si je la cappe, les élements exterieurs non plus pourront pas la dépasser.

J'ai aussi éssayer d'utiliser les méthodes style Mathf.Lerp ou Mathf.MoveTowards mais j'avoue que je savais pas trop comment m'y prendre.

Merci pour ce qui prendront le temps de m'aider, j'attends pas forcément une réponse précise, j'ai surtout l'impression que c'est ma manière de voir les choses le problème.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6455
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Comment utiliser au mieux le Rigid Body pour son controller 2D

Message par boubouk50 » 24 Jan 2025 18:37

Salut,

Je vais commencer par le début : souhaites-tu utiliser la physique pour le déplacement ou bien tout programmer ?
L'utilisation de la vélocité pour autre chose que limiter en min et max, c'est opter pour un déplacement programmé.
Sinon, il faut utiliser les forces et configurer le rigidbody et les propriétés physiques correctement pour que les interactions se fassent correctement.
Si tu optes (je pense que oui) pour entièrement programmer ton CharacterController, dans ce cas, il faudrait nous expliquer un peu ce que tu souhaites.
Ici, c'est un peu fouillon dans le calcul.

Que vaut CurrentDirection.x ? tu pourrais utiliser le signe pour déterminer si c'est négatif ou positif. J'ose supposer qu'il ne peut prendre que 2 (voire 3) valeurs -1 ou 1 (voire 0). Il faudrait mieux que ce soit un entier, parce que les comparaisons de float, je m'en méfie (1.0f = 0.9999999999f ou 1.000000001f). Sinon utiliser Mathf.Approximately ().

Pour accélérer, le mieux est effectivement de calculer le prochain delta de déplacement et de l'ajouter. Ensuite, ne pas oublier de faire un Clamp () de la vélocité pour qu'elle ne dépasse pas les limites fixées.
le problème c'est que ce script vient constamment reset la vélocité de mon personnage, si un élement exterieurs lui applique une force j'aimerais la garder et que mes inputs viennent simplement la modifier.
Quelles forces ? Comment ? Comme dit, tu affectes directement la vélocité, donc tu fais fi de la physique et des forces. Notamment parce que le calcul de la vélocité ne tient pas compte de la vélocité en cours, tu la recalcules à partir de données autres. C'est pour cela, qu'il vaut mieux privilégier une approche additive de la vélocité.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Poyo4
Messages : 2
Inscription : 16 Juin 2023 14:05

Re: Comment utiliser au mieux le Rigid Body pour son controller 2D

Message par Poyo4 » 26 Jan 2025 20:42

Salut, déjà merci de prendre le temps de me répondre.

Je pensais utiliser la physique, mais effectivement, comme tu l’as dit, actuellement je reset constamment la vélocité sans prendre en compte l’ancienne, ce qui est stupide.

J’ai un peu du mal à voir comment bien appliquer une approche additive. Si j’enchaîne les add forces dans mon player controller, je vais dépasser ma max speed, mais si je la cap, les éléments extérieurs, comme un bumper qui ferait un add force au joueur par exemple, ne pourront pas dépasser ma max speed de déplacement. Moi, je veux simplement que ma maxSpeed soit la vitesse max que peut atteindre mon joueur en se déplaçant, mais que les éléments extérieurs puissent le faire aller plus vite.

Mais du coup, en lisant ta réponse, je commence à croire que je ne devrais pas utiliser la physique pour les déplacements du joueur. Moi, je n’y suis pas fermé, mais je ne sais pas ce qui est le mieux pour un platformer 2D, parce que j’ai l’impression que, quand je vais vouloir intégrer mes bumpers, par exemple, ça va vachement me compliquer la vie de ne pas avoir de physique.

Mon CurrentDirection.x, c’est un int qui peut valoir 1/0/-1.

Je reprécise du coup mais quand je parle d'un élément extérieur ce serait un objet qui viendrait faire un AddForce sur le Rigid Body du player quand il passe dessus

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6455
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Comment utiliser au mieux le Rigid Body pour son controller 2D

Message par boubouk50 » 27 Jan 2025 10:30

Le déplacement, c'est toi qui le développes, donc je dirai que tu n'es limité que par toi.
Ce n'est peut-être pas la vélocité qu'il faut borner donc, mais la force que tu ajoutes. Plus ton personnage va vite, moins tu peux lui ajouter de la vitesse, jusqu'à ce qu'il se stabilise à une certaine vitesse.
Dans ce cas, ajouter une force extérieure pourra lui procurer une vitesse supérieure.

Par exemple, avec une interpolation linéaire inverse (Mathf.InverseLerp ()), tu peux savoir à quel niveau tu te situes entre deux bornes.
Pour la vitesse, tu décides de te déplacer à une vitesse max de 4.3 (et donc une vitesse min de 0). L'InverseLerp te donnera la valeur correspondante à ta vitesse actuelle entre 0 et 1. (Ici, c'est très simple, il suffit de diviser par 4.3). Ainsi, tu obtiens une valeur d'interpolation entre 0 et 1, que tu peux appliquer à une AnimationCurve pour déterminer l'accélération ou la décélération correspondante. Quand tu es vers 0, tu as une valeur élevée, quand tu es vers 1 tu tends vers 0.
Tu ne travailles donc plus sur la vitesse, mais sur le delta d'accélération ou de décélération. Donc pas de souci pour les forces externes.

C'est une solution parmi d'autres.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »