Mon objet finit par ralentir alors que je veux qu'il garde une vitesse constante

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
ced_le_dingue
Messages : 70
Inscription : 29 Oct 2019 21:58

Mon objet finit par ralentir alors que je veux qu'il garde une vitesse constante

Message par ced_le_dingue » 22 Sep 2020 13:26

Salut les amis,

Il y a vraiment un truc que je comprends pas.... J'ai crée:

- 1 sol
- Des briques (pas de rigidbody)
- 1 balle
- Des petits cubes (avec rigidbody) qui sont généré lors d'une explosition (jm ne t'inquietes pas je mettrai des particules à la place, là je voulais juste comprendre pourquoi ma boule ralenti avant)

TOUS ont un matériaux rebond assigné dans leur colliders:
Image

J'applique une force à ma balle comme ceci:

Code : Tout sélectionner

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

public class Boule : MonoBehaviour
{
    public float vitesseBalle = 600f;
    private Rigidbody rb;
    private bool BalleEnJeu;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    void FixedUpdate()
    {
        if (Input.GetButtonDown("Jump") && BalleEnJeu == false)
            {
            transform.parent = null;
            BalleEnJeu = true;
            rb.isKinematic = false;
            rb.AddForce(new Vector3(-vitesseBalle, 0, -vitesseBalle));
            //rb.AddRelativeForce(new Vector3(-vitesseBalle, 0, -vitesseBalle));
            //rb.velocity = new Vector3(-13, 0, -13);
        }  
    }
}

Pourtant, bien que j'applique une force à ma balle à chaque frame grace à mon Update*, elle finit par ralentir:
Image
*j'ai essayé avec fixedupdate ça ne change rien, pas étonnant car si j'ai bien compris, ça sert que pour que tous les pc qui liront le programme le feront à la même "vitesse" vu que la fonction est indépendante du framerate

Du coup, ce que je suppose, c'est qu'elle n'est pas censée ralentir vu que:

- 1) Mon matériaux a une friction à zéro et un bounciness au max
- 2)Je lui applique une force à chaque frame (ou je devrait peut etre utiliser AddrelativeForce je ne sais pas...?)

Et que donc c'est l'interaction avec mes petits carré rouge (qui explosent) qui la ralentissent quand la boule roule dessus...


Du coup voici mes 2 questions:

1) : Est ce que les paramètres (rebond à chacun des 3 objets et addforce dans mon update) sont adéquate pour que ma boule, si elle ne touche que ces objets, se déplace toujours à la même vitesse indéfiniment? (et que donc c'est mes petits cubes qui la ralentissent)

2): Si la supposition que c'est les petits cubes qui la ralentissent est la bonne, est il possible de faire en sorte que ma boule n'ai des collisions qu'avec des objets définis (par exemple qu'elle puisse passer à travers les petits cubes, mais pas à travers mon sols et mes murs.... et que les petits cubes gardent leur boxcollider (qui leur permet de pouvoir s'entrechoquer entre eux et pas se passer au travers les uns les autres))

Merci beaucoup les gars :amen:
Dernière édition par ced_le_dingue le 22 Sep 2020 14:14, édité 2 fois.

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Mon objet finit par ralentir alors que je veux qu'il garde une vitesse constante

Message par jmhoubre » 22 Sep 2020 14:12

Bonjour,

quelques précisions :
  • FixedUpdate () ne sert pas à fixer la vitesse du framerate. Si tu veux "égaliser" le framerate entre des plateformes différentes, tu utilises Time.deltaTime dans l'Update (). FixedUpdate () est l'endroit où effectuer ce qui concerne la physique. Par exemple, on récupère les inputs du joueur dans l'Update (), et on les injecte comme force dans FixedUpdate ().
  • Si j'ai bien compris ton script, tu ne lui appliques pas une force à chaque frame : seulement quand le bouton "Jump" est actionné.
  • AddForce et AddRelativeForce sont très semblables, mais AddForce utilise le système d'axes du monde (global), alors qu'AddRelativeForce utilise les axes de l'objet (local).
une question :
  • Si tu désactives tes petits cubes, la balle ralentit-elle toujours ?
et des réponses :
  1. Je pense que oui, mais sans certitude.
  2. Oui, il faut aller dans le menu Edit -> Project Settings, dans la section Physics, en bas, il y a une matrice de collision. Si tu mets tes petits cubes dans une couche personnalisée, tu peux les isoler du reste de tes objets.

ced_le_dingue
Messages : 70
Inscription : 29 Oct 2019 21:58

Re: Mon objet finit par ralentir alors que je veux qu'il garde une vitesse constante

Message par ced_le_dingue » 22 Sep 2020 15:29

Salut Jm,

Ah oui merci...faut que j'assimile ces différences...
il y a une matrice de collision.
Ouaaa mais pourquoi n'y ai je pas pensé tu as raison (comme toujours)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Donc j'ai fait ce que tu m'a dit: j'ai rajouté un Layer à ma balle et à mes petits cubes, et hop plus de ralentissement hahaa.
Par contre, elle accelère (elle le faisait déjà avant) à chaque fois qu'une brique explose et à mon avis c'est à cause de mon AddForceExplosion du coup (non?)....

Mais le soucis c'est que ce sont mes briques qui ont le script de l'explosion, donc je peux pas lui mettre le layer des petits cubes sinon ma balle va passer aussi à travers mes briques (j'ai testé haha)... ce qui fait que comme l'explosion vient des briques, je dois trouver un moyen pour qu'elle n'affecte pas ma boule (sans passer par les layer du coup)

Donc je viens d'essayer 2 choses qui ne marchent pas (ma boule accélère toujours lors des explosions):

-1) J'ai rajouté un tag condition pour que l'explosion n'affecte pas ma boule: (ma boule contient le tag "Player")

Code : Tout sélectionner

[/b]
        Vector3 Centre_explosion = transform.position;
        Collider[] colliders = Physics.OverlapSphere(Centre_explosion, Angle_explosion);

        foreach (Collider hit in colliders)
        {
            if (hit.tag != ("Player"))
            {
                Rigidbody rb = hit.GetComponent<Rigidbody>();
                if (rb != null)
                {
                    rb.AddExplosionForce(ForceExplosion, transform.position, Angle_explosion,Explosion_Upward);
                }
            }
        }
-2) Juste après mon explosion, j'ai essayé de mettre ça, mais ça marche pas non plus, ça décuple quand même sa vitesse (600f étant la force que je lui ai mise au lancement du jeu):

Code : Tout sélectionner

rb_balle.velocity = Vector3.zero;
rb_balle.AddForce(new Vector3(-600f, 0f, -600f));
// Et puis de toute façon je viens d'y penser, ça marche mais 
//ça me redirige toujours vers le même vecteur donc pas bon

Une idée? (J'ai peut être mal identifié le problème)



N.B : je viens de m’apercevoir d'un autre soucis: quand la vitesse de ma balle est trop importante suite à une explosion, elle sort complètement du jeu.... Pourtant je lui ai mis des contraintes pour qu'elle ne sorte pas du jeu, donc je comprends pas (ma balle se déplace sur mon jeu sur les axes x et z):
Image

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Mon objet finit par ralentir alors que je veux qu'il garde une vitesse constante

Message par jmhoubre » 22 Sep 2020 16:32

Je n'ai pas le temps de tester, mais à priori :
- tu peux régler le rayon d'effet de l'explosion (je me doute que cela ne va pas être simple, puisque ta balle touche la brique)
- solution plus compliquée : tu gères toi-même l'explosion, en ajoutant dans l'Awake des petits cubes un addforce (mais cela t'oblige à mettre un rigidbody aux cubes, pas top pour les performances). Je pense qu'on peut aussi faire l'explosion en gérant les transform, mais je n'ai pas creusé.

Pour la balle qui sors du jeu, tu dois passer les rigidbody concernés et mettre Collision Detection sur Continuous (regarde la doc, parce qu'il y a 2 autres paramètres qui sont peut être plus adaptés dans ton cas).

ced_le_dingue
Messages : 70
Inscription : 29 Oct 2019 21:58

Re: Mon objet finit par ralentir alors que je veux qu'il garde une vitesse constante

Message par ced_le_dingue » 22 Sep 2020 18:31

ah ouai ok, autant passer tout de suite aux particules alors :hehe: tant mieux de toute façon ça sera mieux en tout point avec les particules car pas d'interactions avec le reste :modo:
tu dois passer les rigidbody concernés et mettre Collision Detection sur Continuous
Je vais pas pouvoir bien lire la doc avant tard ce soir, mais déjà j'ai testé vite fait de faire ça et en effet ma boule ne semble plus jamais sortir, même quand la vitesse est décuplée (problème de vitesse qui sera solutionné en utilisant les particules du coup ::d ). Merci beaucoup jm, je vais me mettre aux particules dès ce soir si je rentre pas trop tard du sport :)

Répondre

Revenir vers « Scripting »