[RESOLU]Pivoter Grille

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
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

[RESOLU]Pivoter Grille

Message par EmileF » 19 Juin 2020 18:20

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
Dernière édition par EmileF le 20 Juin 2020 09:07, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Pivoter Grille

Message par EmileF » 19 Juin 2020 22:52

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;
        }
    }


La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « (C#) CSharp »