[DB-AL] OverlapArea : isGrounded toujours en false

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
Avatar de l’utilisateur
Jukaf
Messages : 7
Inscription : 14 Oct 2019 23:50

[DB-AL] OverlapArea : isGrounded toujours en false

Message par Jukaf » 16 Oct 2019 00:00

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: .

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

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

Message par Alesk » 16 Oct 2019 10:36

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

Avatar de l’utilisateur
Jukaf
Messages : 7
Inscription : 14 Oct 2019 23:50

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

Message par Jukaf » 17 Oct 2019 19:13

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?

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

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

Message par Alesk » 17 Oct 2019 19:30

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.

Avatar de l’utilisateur
Jukaf
Messages : 7
Inscription : 14 Oct 2019 23:50

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

Message par Jukaf » 19 Oct 2019 19:19

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é 4385 fois
Capture_3.PNG
Ici le script de mon perso.
Capture_3.PNG (119.7 Kio) Consulté 4385 fois
Capture_1.PNG
Ici mon personnage joueur.
Capture_1.PNG (109.42 Kio) Consulté 4385 fois
Bon peut-être que ça pourrait t'être utile.
Je tenterai d'autres trucs sur mon code voir ce que ça donne.

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

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

Message par Alesk » 19 Oct 2019 19:45

oué... là je vois pas...

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

Avatar de l’utilisateur
Jukaf
Messages : 7
Inscription : 14 Oct 2019 23:50

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

Message par Jukaf » 25 Oct 2019 13:14

Dsl pour le temps de réponse , je t'envoie ça.
Pièces jointes
Export_Projet.rar
Je te le compresse en .rar, je sais pas pourquoi mais la pièce jointe n'était pas acceptée en .unitypackage
(13.19 Kio) Téléchargé 126 fois

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

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

Message par Alesk » 25 Oct 2019 15:10

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.

Avatar de l’utilisateur
Jukaf
Messages : 7
Inscription : 14 Oct 2019 23:50

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

Message par Jukaf » 25 Oct 2019 18:45

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.

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

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

Message par Alesk » 25 Oct 2019 19:38

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.

Répondre

Revenir vers « (C#) CSharp »