Bouger mon personnage suite à une collision

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Youtaka
Messages : 5
Inscription : 09 Fév 2021 20:03

Bouger mon personnage suite à une collision

Message par Youtaka » 09 Fév 2021 20:21

Hello tout le monde !

Je viens de me mettre au travail sur un petit jeu 2D où le but est de sauter dans le vide, et de réaliser quelques objectifs avant d'atteindre le sol.

Au cours de la chute du personnage, celui-ci va rencontrer quelques obstacles / objets qui vont avoir une incidence sur ses mouvements.

Cependant, il se trouve que peu importe la manière que j'utilise pour modifier la position de mon personnage, celui-ci ne réagit jamais (les mouvements de bases avec ZQSD quant à eux fonctionnent très bien)

Voici un petit bout de script :

Code : Tout sélectionner

void Awake()
{
    rigidBody = GetComponent<Rigidbody2D>();
}

void OnTriggerEnter2D(Collider2D collider)
{
    if (collider.CompareTag("Wind"))
    {
    	Debug.Log("Triggered");
        rigidBody.AddForce(new Vector2(0, 100f), ForceMode2D.Impulse);
    }
}
J'entre bien dans OnTriggerEnter2D, le Log s'affiche bien dans ma console, en revanche rien ne se passe au niveau de mon personnage.
J'ai essayé différentes manières comme d'agir directement sur rigidBody.velocity, même soucis. J'ai également essayé de jouer avec la masse, rien à faire non plus.

Et voici le GameObject sur lequel je veux effectuer les modifications de position :
Image

Auriez-vous une idée du soucis ? Je vous remercie d'avance ! :)

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: Bouger mon personnage suite à une collision

Message par DevAmat » 10 Fév 2021 11:07

Bonjour,

Le souci peux venir de votre script "Mouvement", comment faites vous bouger votre personnage? Avez vous essayé en désactivant ce script?

Youtaka
Messages : 5
Inscription : 09 Fév 2021 20:03

Re: Bouger mon personnage suite à une collision

Message par Youtaka » 10 Fév 2021 15:07

Hello !

Je fais bouger mon personnage avec la méthode MovePosition, comme ceci :

Code : Tout sélectionner

void FixedUpdate()
{
    Vector3 input = Vector3.zero;

    input.x = Input.GetAxis("Horizontal");

    Vector3 direction = input.normalized;
    Vector3 movement = direction * moveSpeed * Time.fixedDeltaTime;

    rigidBody.MovePosition(transform.position + movement);
}
J'avais déjà essayé en le désactivant (en désactivant d'ailleurs quasiment tout), le soucis était toujours présent

Il semblerait que le soucis soit l'utilisation de ForceMode2D.Impulse lorsque j'utilise la méthode AddForce :

Code : Tout sélectionner

rigidBody.AddForce(new Vector2(0, 100f), ForceMode2D.Impulse);
Lorsque je le retire, mon personnage est bien propulsé dans les airs, le nouveau soucis en faisant de la sorte, c'est que le personnage se téléporte au lieu d'être "éjecter" de manière "smooth", c'est assez embêtant :lol:

Avatar de l’utilisateur
DevAmat
Messages : 435
Inscription : 23 Nov 2016 11:50

Re: Bouger mon personnage suite à une collision

Message par DevAmat » 10 Fév 2021 16:38

Bon alors attention je touche très peu à la physique, donc prends ceque je vais te dire avec des pincettes..

Mais si tu veux garder la physique pure, alors tu ne peux pas garder "MovePosition".
Au lieu de ca je te conseille d'utiliser "AddForce" pour bouger ton personnage.
Donc on récupère "'input" dans "Update" et dans "FixedUpdate" on joue avec la physique.
On peux y ajouter une limite de vélocité (en latéral par exemple).

Maintenant tu peux faire bouger ton "GameObject", tu peux aussi ajouter du "Linera Drag" dans le "Rigidbody2D" pour freiner l'objet.

Code : Tout sélectionner

private void Update()
    {
        input.x = Input.GetAxis("Horizontal");
    }

    private void FixedUpdate()
    {
        Vector3 direction = input.normalized;
        Vector3 movement = direction * moveSpeed * Time.fixedDeltaTime;

        rigidBody.AddForce(movement, ForceMode2D.Impulse);

        if (Mathf.Abs(rigidBody.velocity.x) > topSpeed)
        {
            if (rigidBody.velocity.x <= 0)
                rigidBody.velocity = new Vector2(-topSpeed, rigidBody.velocity.y);
            else if (rigidBody.velocity.x > 0)
                rigidBody.velocity = new Vector2(topSpeed, rigidBody.velocity.y);
        }
    }
Il y a pas mal de solutions pour bouger un "GameObject", utiliser la physique n'est pas toujours le plus judicieux. Cela dépends vraiment de ton gameplay.

Youtaka
Messages : 5
Inscription : 09 Fév 2021 20:03

Re: Bouger mon personnage suite à une collision

Message par Youtaka » 11 Fév 2021 11:26

Hey ! :)

En effet il semblerait que MovePosition fonctionne bien pour une utilisation de base, mais il pose soucis lorsque l'on veut effectuer quelques traitements sur notre GameObject

Je suis donc passé avec AddForce comme tu le suggères, les déplacements fonctionnent bien (même si j'aimerais faire en sorte que mon personnage change de direction plus rapidement, là il met un peu de temps, j'imagine que c'est une question de paramètre)

En tout cas j'ai bien réussi à faire ce que je voulais, plutôt que d'utiliser OnTriggerEnter2D et d'effectuer mes actions dedans, j'ai utilisé un Area Effector 2D sur l'objet concerné, ça fonctionne plutôt bien et ça réponds à mon besoin ! :)

Répondre

Revenir vers « Scripting »