0
votes

Vérifier si RigidBody est mis à la terre?

J'ai un GameObject avec un Rigidbody, un Mesh Collider, un Skinned Mesh Renderer et le script ci-dessous.

J'essaye de vérifier si elle est mise à la terre, mais la console crache continuellement "Not Grounded!" quand c'est le cas, il est donc évident que quelque chose ne va pas ici. quelqu'un peut-il aider s'il vous plait?

public class GroundCheck : MonoBehaviour
{
    public float Height;
    bool IsGrounded;
    Ray ray;
    MeshRenderer renda;

    private void Start()
    {
        Height = renda.bounds.size.y;
    }

    void Update()
    {
        if (Physics.Raycast(transform.position, Vector3.down, Height))
        {
            IsGrounded = true;
            Debug.Log("Grounded");
        }
        else
        {
            IsGrounded = false;
            Debug.Log("Not Grounded!");
        }
    }
}


0 commentaires

3 Réponses :


1
votes

J'ai vérifié votre code avec une scène simple avec un avion et un cube, et cela fonctionne.

Il ne fait apparaître NotGrounded que lorsqu'il est clairement «flottant» ou que l'objet a la moitié de son corps à l'extérieur de l'avion.

Vérifiez ces éléments qui dessinent le rayon, cela devrait vous donner plus d'informations sur ce qui ne va pas avec votre maillage.

De plus, si le problème est de savoir comment le jeu perçoit la hauteur de votre maillage skinned, vous pouvez également utiliser SkinnedMeshRenderer.localBounds qui renvoie l'AABB de l'objet.


2 commentaires

C'est bon à savoir. J'ai remarqué que lorsque je clique sur play, la "Hauteur" reste à 0, donc même si mon SkinnedMeshRenderer a un maillage, il ne saisit pas du tout la hauteur du maillage. Enquête ...


J'ai mis à jour ma réponse, peut-être que le deuxième lien pourrait aider à tester plus d'approches ^^



3
votes

Une autre option pour vérifier si le rigidBody est mis à la terre utilise la fonction OnTriggerStay .

void OnTriggerStay(Collider other)
    {
        if (other.Transform.Tag == "Ground")
        {
            IsGrounded = true;
            Debug.Log("Grounded");
        }
        else
        {
            IsGrounded = false;
            Debug.Log("Not Grounded!");
        }
    }


4 commentaires

Merci, cette approche a fonctionné. Je ne comprends toujours pas pourquoi je n'ai pas pu obtenir l'autre façon de travailler même avec la technique LocalBounds, mais pour le moment, je suis juste heureux d'avoir quelque chose qui fonctionne. . . !


Quoi qu'il en soit, cette approche est meilleure pour détecter les collisions et les touches la plupart du temps


Bonne prise! Mais je suis curieux de savoir pourquoi cela fonctionnera avec ce déclencheur et non avec la mise à jour? C'est parce que le collisionneur "touche très vite" c'est un autre collisionneur?


Le déclencheur vérifie s'il y a un toucher et le raycast utilise une méthode différente, il est plus compliqué d'utiliser le raycast mais s'il est utilisé correctement, il devrait fonctionner dans la fonction de mise à jour.



0
votes

Il existe un meilleur moyen de vérifier si votre corps rigide est mis à la terre que la vérification des collisions et les rayons. Mais d'abord, pourquoi la vérification des collisions n'est pas une bonne idée: si votre niveau est un modèle unique, les murs seront également étiquetés avec la balise "Ground" et frapper un mur retournera vrai, ce que vous ne voulez pas. Les rayons peuvent être utilisés, mais c'est trop de calculs avec lesquels vous n'avez pas besoin de perdre de temps.

Au lieu d'utiliser de nouveaux objets et méthodes, vérifiez simplement si la position change:

private float lastYposition;
private bool grounded;

void Start() {
    lastYposition = transform.position.y;
}

void Update() {
    grounded = (lastYposition == transform.position.y); // Checks if Y has changed since last frame
    lastYposition = transform.position.y;
}

À partir de là, c'est à vous de décider quelle logique vous allez ajouter.


0 commentaires