Page 1 sur 2

[DB-AL] OverlapArea : isGrounded toujours en false

Publié : 16 Oct 2019 00:00
par Jukaf
Salut tout le monde !

En ce moment je débute sur Unity2D et je suis en train de crée mon premier perso.
Je rencontre un problème pour faire sauter mon perso, en gros pour détecter le contact du perso avec sol j'utilise "OverlapArea". Je met un extrait du code (je met pas tout le code, que ce qui est en rapport avec le groundCheck) :

Code : Tout sélectionner

using System.Collections;
using UnityEngine;

public class Player_Controller : MonoBehaviour
{
    Rigidbody2D rigBody;
    public float jumpForce = 600f;
    public LayerMask Ground;
    public bool isGrounded;

    private void Start()
    {
        rigBody = GetComponent<Rigidbody2D>();
    }

    public void Update()
    {
        isGrounded = Physics2D.OverlapArea(new Vector2(transform.position.x - 1.25f, transform.position.y - 2.5f), new
Vector2(transform.position.x + 1.25f, transform.position.y - 3f), Ground);
        if ((isGrounded) && (Input.GetKeyDown(KeyCode.UpArrow)))
        {
            rigBody.AddForce(new Vector2(0, jumpForce));
        }

    }
}
Dans la fonction "public void Update" je suis censé déterminer la zone dans laquelle je veux tester la variable isGrounded avec "OverlapArea" non ?
J'ai bien appliqué le LayerMask "Ground" sur mon sol, et j'ai aussi dis au joueur de reconnaitre le Layermask "Ground".
Le truc c'est que la variable "isGrounded" reste toujours en false même quand je suis en contact avec le sol.
J'ai beau faire pleins de tests, je vois pas pourquoi cette variable reste en false, ducoup je me demande si c'est possible d'avoir votre avis la dessus :triste1: .

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 16 Oct 2019 10:36
par Alesk
Salut,

Tu n'as aucun message d'erreur dans la console ?
Je viens de regarder dans la doc : https://docs.unity3d.com/ScriptReferenc ... pArea.html

Et je ne vois pas de déclaration de cette fonction qui retourne un bool.
C'est soit un collider, soit un int, donc rien qui ne soit compatible avec le type bool de ta variable isGrounded

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 17 Oct 2019 19:13
par Jukaf
Merci pour ta réponse,

Je n'ai aucun message d'erreur sur la console non.

J'utilise "OverlapArea" car j'ai tiré ça d'une vidéo : https://www.youtube.com/watch?v=MFM_-wlwRag

C'est vrai que c'est pas censé retourner un bool.
Et j'ai regarder la doc, je comprends pas trop ce que ça veut dire que la fonction "retourne un collider", en d'autres termes, qu'est-ce qui est stocké dans la variable "isGrounded" de mon code?

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 17 Oct 2019 19:30
par Alesk
Quand je dis "retourner un collider" ça veut dire que la fonction va retourner un pointeur vers le collider qui est en contact avec ton collider de détection du sol.

Apparement, le fait qu'il y ait un collider ou non de retourné est automatiquement converti en true ou false pour renseigner la valeur de la variable isGrounded.
Je viens d'apprendre un truc :p (mais bon, normalement le fait de typer les variables ça sert justement à éviter ce genre de mix)... Bref... ça ne règle pas ton problème.

Il doit il y avoir un souci de réglage quelques part... mais ça va être compliqué de savoir où précisément sans mettre les doigts dans ton projet. Pour commencer, revérifie que le layermask est bien bon.

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 19 Oct 2019 19:19
par Jukaf
Bon j'ai reset le nom du layermask j'ai tout modifié, et toujours rien, aucune erreur, la variable "is grounded" est toujours en "false" quand je teste...

Après j'imagine que c'est pas facile pour toi de faire une analyse correcte vu que t'a pas le projet entre les mains.
Je te met 2-3 screen:
Capture_4.PNG
Ici t'a tout les Layers
Capture_4.PNG (20.63 Kio) Consulté 4480 fois
Capture_3.PNG
Ici le script de mon perso.
Capture_3.PNG (119.7 Kio) Consulté 4480 fois
Capture_1.PNG
Ici mon personnage joueur.
Capture_1.PNG (109.42 Kio) Consulté 4480 fois
Bon peut-être que ça pourrait t'être utile.
Je tenterai d'autres trucs sur mon code voir ce que ça donne.

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 19 Oct 2019 19:45
par Alesk
oué... là je vois pas...

Exporte un package de ton projet et passe le moi, ça sera plus simple.

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 25 Oct 2019 13:14
par Jukaf
Dsl pour le temps de réponse , je t'envoie ça.

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 25 Oct 2019 15:10
par Alesk
J'ai trouvé.

Le scale de ton personnage est à 0.2, mais les coordonnées que tu utilises pour détecter la collision sont calées à l'échelle 1.
Donc là ça se trouve bien plus bas, en dessous du sol.

Ajoute ce bout de code dans ta classe Player_Controller

Code : Tout sélectionner

void OnDrawGizmos(){

        Vector2 v1 = new Vector2(transform.position.x - 1.25f, transform.position.y - 2.5f);
        Vector2 v2 = new Vector2(transform.position.x + 1.25f, transform.position.y - 3f);     
        Gizmos.color = Color.red;
        Gizmos.DrawLine(v1,v2);
    }
Et tu verras la diagonale de ton rectangle de détection de collision.

Il vaut mieux éviter au maximum de changer le scale des objets, là tu n'as aucune raison de le faire.
Je te recommande donc de tout laisser à 1, surtout que c'est aussi mieux de rester à cette échelle pour que le moteur physique fonctionne bien.

Ensuite j'ai vu dans ton code que tu utilisais 4 fois

Code : Tout sélectionner

GameObject.Find("Weapon").GetComponent<Weapon>()
... dans la fonction update.

Il faut fuir GameObject.Find() comme la peste, c'est super lent cette fonction.

Pour éviter ça, le mieux est de créer une variable de type Weapon et de lui assigner ton arme une seule fois au démarrage. Et ensuite tu auras juste à réutiliser cette variable dans ton code. Ce sera bien plus rapide.

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 25 Oct 2019 18:45
par Jukaf
Okay ça marche bien mieux maintenant pour le jump :)

Sinon pour ta remarque sur la fonction "GameObject.Find", j'ai modifié mon code en ajoutant ça au démarrage :
Wpn = GameObject.Find("/Perso_1/Weapon");
et après j'utilise que la variable "Wpn", c'est vrai que ça simplifie pas mal le truc.

En tout cas merci pour ton aide c'était tout bête comme erreur mais fallait la voir.

Re: [DB-AL] OverlapArea : isGrounded toujours en false

Publié : 25 Oct 2019 19:38
par Alesk
Parfait.

Sinon tu pouvais aussi faire :

Code : Tout sélectionner

public Weapon wpn;
Et lui assigner le gameObject de l'arme directement depuis l'éditeur... ça trouvera automatiquement le script Weapon qui lui est associé et l'assignera à la variable wpn.

Pour ce qui est de la syntaxe, je te recommande de suivres les règles par défaut : première lettre en minuscule pour les noms de variables, et majuscule pour les noms de fonctions.
ça permet de mieux s'y retrouver.