Page 1 sur 1

[RESOLU]Pivoter Grille

Publié : 19 Juin 2020 18:20
par EmileF
Bonjour,

J'ai besoin d'un petit coup de main.
Voilà, j'ai une grille hexagonale de bulle genre comme dans Bubble Witch Saga 2
et je voudrai faire pivoter cette grille comme dans la vidéo quand une bulle vient percuter un élément de la grille.

J'ai la direction de la bulle qui arrive et la position de contact, par rapport à ceci, est-ce que quelqu'un peut me mettre sur la voie pour le calcul de cette rotation sachant qu'il n'est pas prévu que j'utilise les forces physiques?

Merci d'avance pour tout renseignement

Re: Pivoter Grille

Publié : 19 Juin 2020 22:52
par EmileF
Voilà, la solution que j'ai trouvée

J'ai créé un collider2D en forme de croix, fixe, au centre de la grille les branches de la croix inclinées à 45°

Ensuite, je lance un rayon à partir de l'avant dernière position de la bulle en direction de la dernière position pour avoir la direction.

Selon le bras de la croix touché par le rayon et la direction du tir, je calcule une force en rapport avec l'éloignement du centre de la croix.

Voilà mon script si ça peut aider quelqu'un.

Code : Tout sélectionner

    float force;
    private void PivoterGrille(List<Vector3> path)
    {
        Vector3 dir = (path[path.Count - 1] - path[path.Count - 2]).normalized;
        Ray2D ray = new Ray2D(path[path.Count - 2], dir);
        
        //ça c'est juste pour ne controler que les collider situé en z = -2
        ContactFilter2D filter = new ContactFilter2D();
        filter.useDepth = true;
        filter.maxDepth = -2;
        filter.minDepth = -2;
        
        RaycastHit2D[] hits = new RaycastHit2D[1];
        int nbr = Physics2D.Raycast(ray.origin, ray.direction,filter, hits);
        if (nbr > 0)
        {
            print(hits[0].transform.name + " " + dir + " " + hits[0].point);
            Vector2 pos = hits[0].point;
            switch (hits[0].transform.name) //nom des colliders
            {
                case "BD":
                    if (dir.x > 0 && dir.y > 0)
                        force = 10 * (pos.x + pos.y);
                    if (dir.x < 0 && dir.y < 0)
                        force = -10 * (pos.x + pos.y);
                    break;
                case "BG":
                    if (dir.x < 0 && dir.y > 0)
                        force = -10 * (-pos.x + pos.y);
                    if (dir.x > 0 && dir.y < 0)
                        force = 10 * (-pos.x + pos.y);
                    break;
                case "HG":
                    if (dir.x > 0 && dir.y > 0)
                        force = -10 * (-pos.x + pos.y);
                    if (dir.x < 0 && dir.y < 0)
                        force = 10 * (-pos.x + pos.y);
                    break;
                case "HD":
                    if (dir.x < 0 && dir.y > 0)
                        force = 10 * (pos.x + pos.y);
                    if (dir.x > 0 && dir.y < 0)
                        force = -10 * (pos.x + pos.y);
                    break;
                default:
                    break;
            }
        }
    }
    private void Update()
    {
        if (force != 0)
        {
            transform.Find("Pivot").Rotate(new Vector3(0, 0, force) * Time.deltaTime);
            force -= Mathf.Sign(force) * Time.deltaTime * 10;
            if (Mathf.Abs(force) < 0.1f)
                force = 0;
        }
    }