[RESOLU][DB-AL] Changer la gravité au cours du jeu

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
Kamiloo95
Messages : 72
Inscription : 06 Avr 2015 10:14

[RESOLU][DB-AL] Changer la gravité au cours du jeu

Message par Kamiloo95 » 01 Mars 2018 09:19

Bonjour à tous,
je suis sur un petit projet en ce moment et j'ai un petit soucis :
je souhaite faire tourner un joueur autour d'une sphère dans un premier temps, ce qui est relativement simple.
Cependant, lorsque je clique sur le touche "espace", je veux que celui-ci saute d'une sphère à l'autre, et que lorsqu'il touche cette deuxième sphère, qu'il se mette à tourner autour de celle-ci.
Alors j'ai testé pas mal de choses comme faire ça directement avec Transform.RotateAround, mais les résultats n'étaient pas concluants. Alors je me suis orienté vers le Physics2D.gravity qui m'avait l'air d'être la bonne solution. Mais, alors, je dois faire tourner le joueur autour de la sphère d'une différente manière. J'ai donc pensé à appliquer une force au joueur dans la direction de la tangente à la sphère. Et pour que le joueur saute, je lui appliquerai une force contraire à la force de gravité. Cela parait simple, mais dans mon script ... rien ne fonctionne. Le joueur ne saute pas dans la bonne direction, je ne trouve aucun moyen d'appliquer une force tangente à un sphère (il faudrais alors que j'applique cette force de sorte à ce qu'elle soit perpendiculaire à la force de gravité, donc produit scalaire entre les deux vecteurs = nul (?) ), et enfin il y a un problème évident au niveau de la gravité mais je ne sais pas lequel.

Pour que vous compreniez mieux mon problème je vous fait un schéma vous résumant ce que j'attends de mon joueur, je vous montre mon script puis je vous met un lien afin que vous puissiez voir par vous même le résultat.

Voici un schéma de ce que j'attends :
Sans titre.png
Sans titre.png (22.2 Kio) Consulté 3323 fois
Voici l'unique script de la simulation :

Code : Tout sélectionner

public GameObject grav;
    public bool isGrounded;
    public float jumpForce = 200;
    
    // Use this for initialization
	void Start () {
        isGrounded = false;
	}
	
	// Update is called once per frame
	void Update () {
        if (grav)
        {
            Vector2 newGravity = grav.transform.position;
            Physics2D.gravity = grav.transform.position - transform.position;
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            isGrounded = false;
            Vector2 jumpDirection = - Physics.gravity * jumpForce;
            GetComponent<Rigidbody2D>().AddForce(jumpDirection);
        }

        if(!isGrounded)
            Physics2D.gravity = new Vector2(0, -9.8f);
    }

    void OnCollisionEnter2D (Collision2D info)
    {
        if (!isGrounded)
        {
            isGrounded = true;
            grav = info.collider.gameObject;
        }
        
    }

    public void ReloadScene()
    {
        SceneManager.LoadScene(0);
    }
Voici ce que j'obtiens :
Fichier ZIP du rendu

Pouvez-vous me dire si le problème vient de l'idée ou du script ? Avez-vous une autre idée de comment faire cela ?
Merci d'avance.
Dernière édition par Kamiloo95 le 02 Mars 2018 06:21, édité 2 fois.

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

Re: [DB-AL] Changer la gravité au cours du jeu

Message par boubouk50 » 01 Mars 2018 10:43

Salut,
Pour moi c'est surtout une mauvaise compréhension de la physique.
il faudrais alors que j'applique cette force de sorte à ce qu'elle soit parallèle à la force de gravité
La gravité va vers le centre de la sphère (i.e. la gravité terrestre) et la vélocité de ton personnage est la tangente.
Le saut doit donc aller à l'inverse de la gravité, mais faut-il tenir compte de la vélocité du personnage?

Je pense que dans ce jeu, tu pourrais alterner entre deux états physiques. La gravitation et le saut.
Lorsque tu es en gravitation autour d'une planète, tu pourrais tout simplement enlever la physique pour faire un RotateAround (), ou bien une parenté ou tout autre solution qui te convienne. Et au moment du saut, tu récupères le vecteur entre le centre de la sphère et la position du joueur (normalisé) et tu repars en physique avec un AddForce () (considérant la vélocité nulle alors) et détachant ton joueur.

Ceci est une vision mais je ne connais pas ton gamePlay, donc c'est à étudier.
Il y a un post sur ce forum qui traite du même problème, il te faudrait le retrouver.
"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

Kamiloo95
Messages : 72
Inscription : 06 Avr 2015 10:14

Re: [DB-AL] Changer la gravité au cours du jeu

Message par Kamiloo95 » 01 Mars 2018 11:17

boubouk50 a écrit :
01 Mars 2018 10:43
Salut,
Pour moi c'est surtout une mauvaise compréhension de la physique.
il faudrais alors que j'applique cette force de sorte à ce qu'elle soit parallèle à la force de gravité
La gravité va vers le centre de la sphère (i.e. la gravité terrestre) et la vélocité de ton personnage est la tangente.
Le saut doit donc aller à l'inverse de la gravité, mais faut-il tenir compte de la vélocité du personnage?
Salut, en fait je suis désolé, mais au lieu de "parallèle" je voulais mettre "perpendiculaire" car je parlais de la force que je mettrai au joueur pour qu'il tourne autour de ma sphère, ce qui est donc la tangente. Mais je n'ai pas trouvé de manières de faire ça.

Ton idée est très bonne mais j'avais déjà pensé à la même chose, sauf que lorsque je fais sauter le personnage, celui-ci ne tombais pas, si on manquais de toucher l'autre shpère lors du saut, il retombais juste sur la première, ce qui n'allais pas avec mon gameplay. Mais c'est peut-être dû à une erreur de code de ma part il faudrais que je rééssaye. J'avais aussi abandonné cette idée parce que les scripts étaient brouillons et qu'il y avait trop de possibilités de bugs entre activer et désactiver la physique. Enfin, lorsque j'avais testé cette idée, étant donné que la physique était désactivée, je ne pouvais pas savoir si le joueur touchais l'autre sphère :triste1:

Si je ne trouve pas d'autres façon de faire cela, j'opterai pour cette option.

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

Re: [DB-AL] Changer la gravité au cours du jeu

Message par boubouk50 » 01 Mars 2018 11:29

Ce n'est pas ce que j'ai écrit.
Les moments de saut doivent être contrôlé par la gravité, mais pas celle de la planète.
Comme je te dis, je ne connais pas ton jeu ni ton gamePlay, donc difficile d'être juste dans la réponse. Néanmoins, il est tout a fait possible de gérer la gravité des sphères autrement, avec une simple parenté notamment. Tu ne la gères donc pas physiquement.
Tu gardes a tout moment une gravité unique, vers la bas, simplement, lorsque tu touches une sphère, tu attaches ton personnage à cette sphère (ou un gameObject spécifique). Il est donc toujours sur la sphère (et tourne selon son parent) ce qui simule donc la gravité. Au moment, du saut, tu détaches et tu fais un AddForce () en Up local, ton perso est donc libre et soumis à la gravité "globale" et tombera dans rien s'il ne touche aucune sphère.
"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

Kamiloo95
Messages : 72
Inscription : 06 Avr 2015 10:14

Re: [DB-AL] Changer la gravité au cours du jeu

Message par Kamiloo95 » 02 Mars 2018 00:50

Ok j'ai compris ce que tu voulais dire.
Par contre je n'ai pas trouvé comment faire tourner un objet autour de son parent sans rotateAround.
Si je fais ça avec un rotateAround, dans ce cas la parenté n'est pas nécessaire ?
Je crée simplement une variable publique de type Transform qui représentera la planète sur laquelle je suis (la dernière que je touchée donc).

Je vais tester ca de suite et je te reviens.

EDIT:
J'ai fait ce que tu as dit et ca marche très bien et ca correspond exactement au type de gameplay que je souhaite.
Cependant, il arrive que le joueur ne saute pas dans la direction voulue, après quelques sauts enchainés, il se met à sauter de travers ou encore, il arrive qu'il saute de moins en moins haut à chaque saut :?
De plus, est-ce que tu saurais comment faire pour que mon joueur soit tout le temps dirigé de sorte à ce qu'il ait les pieds sur la sphère ? Comme ça je pourrai simplement diriger le saut avec un

Code : Tout sélectionner

gameObject.transform.up
EDIT 2:
J'ai reussi à faire ca avec

Code : Tout sélectionner

transform.up = (sphere.position - transform.position) * -1;

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

Re: [RESOLU][DB-AL] Changer la gravité au cours du jeu

Message par boubouk50 » 02 Mars 2018 10:04

Tu n'es pas obligé d'utiliser un RotateAround (). Tu peux simplement attacher un enfant Empty à chaque sphère qui tourne à une vitesse prédéterminée. Tu mets ton perso enfant et il tournera. Comme ça tu peux définir la vitesse de rotation sur chaque enfant Empty.
Concernant le saut, cela pourrait venir de la vélocité qui n'est pas nulle au moment du saut.
"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 « (C#) CSharp »