[RESOLU]Une boule oui, pas l'autre

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

[RESOLU]Une boule oui, pas l'autre

Message par EmileF » 30 Mars 2020 16:34

Bonjour à tous et bon confinement.

J'ai un petit truc qui me fait plutôt ch... depuis quelques heures et donc je n'arrive pas à trouver la solution.

Dans un cadre, je déplace 2 boules à la fois en cliquant sur des flèches.
Toutes les valeurs et conditions pour les déplacements sont les mêmes pour les 2 boules.
Horizontalement Tout va bien,
Verticalement elles m'énervent.
Voilà les images:
Vers le haut: on voit que la boule rouge reste éloignée du bord
Image
Vers le bas : c'est la boule beige cette fois ci qui reste éloignée
Image
Vers la gauche: Les 2 boules sont au bord
Image
Vers la droite: les 2 boules sont au bord aussi
Image

Voila mon script:

Code : Tout sélectionner

public class Mur_Boules : MonoBehaviour
{
    public Camera Camera;
    public Transform[] Boutons;
    public Transform[] Boules;
    public Transform[] Trous;//non utilisé pour le moment
    public Vector3 Org; //Vector3(-2, 6, 2.6) valeur attribuée dans l'inspector
    public Vector3 Pas; //Vector3(0.8, 0.8, 0)valeur attribuée dans l'inspector
    public Vector3 Max;//Vector3(2, 2, 2.6)valeur attribuée dans l'inspector
    public bool move;
    public Vector3[] dest;

    private void Start()
    {
        dest = new Vector3[Boules.Length];
    }


    private void Update()
    {
        if (!move)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Vector3 dir = Vector3.zero;
                for (int i = 0; i < Boutons.Length; i++)
                {
                	//Extension de Camera pour repérer si le joueur a cliqué sur le transform
                    if (Camera.RayCastObjet(Boutons[i]))
                    {
                        if (i == 0)
                            dir = Vector3.up; //haut
                        else if (i == 1)
                            dir = Vector3.down; //bas
                        else if (i == 2)
                            dir = Vector3.left; //gauche
                        else if (i == 3)
                            dir = Vector3.right; //droite
                    }
                }
                if (dir != Vector3.zero)
                {
                    for (int i = 0; i < 2; i++)
                    {
                        bool ok = true;
                        Vector3 pos = Boules[i].localPosition;
                        //si la bille est en haut à gauche et que la direction est à droite on bloque
                        if (pos == new Vector3(Org.x, Org.y, Org.z) && dir == Vector3.right)
                            ok = false;
                        //si la bille est en haut et presque à gauche et que la direction est à gauche on bloque
                        if (pos == new Vector3(Org.x + Pas.x, Org.y, Org.z) && dir == Vector3.left)
                            ok = false;
                        //si la bille est en bas à droite et que la direction est vers la gauche on bloque
                        if (pos == new Vector3(Max.x, Max.y, Max.z) && dir == Vector3.left)
                            ok = false;
                        //si la bille est en bas à et presque à droite et que la direction est vers la right on bloque
                        if (pos == new Vector3(Max.x - Pas.x, Max.y, Max.z) && dir == Vector3.right)
                            ok = false;
                        //si la bille est en haut à droite et que la direction est vers le bas, on bloque
                        if (pos == new Vector3(Max.x, Org.y, Org.z) && dir == Vector3.down)
                            ok = false;
                        //si la bille est presque en haut à droite et que la direction est vers le haut, on bloque
                        if (pos == new Vector3(Max.x, Org.y - Pas.y, Org.z) && dir == Vector3.up)
                            ok = false;
                        //si la bille est en bas a gauche et que la direction est vers le haut, on bloque la bille
                        if (pos == new Vector3(Org.x, Max.y, Org.z) && dir == Vector3.up)
                            ok = false;
                        //si la bille est presque en en bas et à gauche et que la direction est vers le bas, on bloque la bille
                        if (pos == new Vector3(Org.x, Max.y + Pas.y, Org.z) && dir == Vector3.down)
                            ok = false;
                        if (ok)
                        {
                            dest[i] = pos + Vector3.Scale(Pas, dir);
                            //si la bille ne sort pas du cadre
                            if (dest[i].x <= Max.x && dest[i].y >= Max.y && dest[i].x >= Org.x && dest[i].y <= Org.y)
                            {
                            	//Local move est une extention perso du transform vers une fonction iTween, 
                            	//"EndMove" est la fonction appelée quand le movement est terminé
                                Boules[i].LocalMove(dest[i], 1, 0, "EndMove", gameObject, i);
                                move = true;
                            }
                        }
                    }

                }
            }
        }
    }

	//ceci est le retour quand le déplacement de la boule est terminé	
    public void EndMove(int i)
    {
        Boules[i].localPosition = dest[i];
        move = false;
    }
}
Ce qui m'étonne le plus c'est qu'une boule sur les 2 ne va pas bien. Est-ce que quelqu'un aurait un embryon de solution s'il vous plait.

Edit:
A j'ai oublié de préciser que les boules se déplacent de cases en cases comme dans une grille.
Et qu'il faut un clic à chaque fois sur une flèche pour déclencher le déplacement
Dernière édition par EmileF le 30 Mars 2020 17:40, édité 1 fois.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Une boule oui, pas l'autre

Message par djulio74 » 30 Mars 2020 16:50

Au hasard:
Il n'y aurais pas un décalage du point de pivot ?
Ton script n'as pas l'air de faire interagir une boule avec l'autre ?

J'ai pas pu test sur unity suis pas sur l'ordi mais au vu comme ça, ça me paraît un peut compliquer comme procédé, surtout si tu veux déplacer tes obstacles et trou.
Pourquoi ne pas utiliser des collider et ray cast ?
Des collider pourtour et obstacle
Quand tu clique une direction :
- Si terrain détecté, la position cible est le hit. Point- rayon de la sphère,
- si sphère détectée, tu récupère le hit. Point du raycast de la sphère détectée, et la position cible ce hit. Point- 2x rayon

Comme ça pas de if à répétition, modulaire..

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: Une boule oui, pas l'autre

Message par EmileF » 30 Mars 2020 17:02

Bonne idée,

mais là je n'ai pas de problème avec mes obstacles dans les coins
ce que je n'arrive pas à comprendre c'est pourquoi une boule va bien vers le bas, pas l'autre et inversement vers le haut.

Je pense que ce doit être une question de valeur des floats qui ne sont pas toujours pile exacte

En tout cas merci, et je vais me pencher un peu, (sans tomber) sur ta proposition.
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: Une boule oui, pas l'autre

Message par djulio74 » 30 Mars 2020 17:26

Juste pour essayer de comprendre :
- quelle est la position de base des boules ?
- pas de soucis de pivot ? position parent enfant ?
- détection de position inter-boules ?

Pourquoi pas sinon un tableau corresponant aux cases, avec les déplacement impossibles des cases ?

Pourquoi pas avoir un parent réduit au scale voulu, et en enfant tes boules pour pouvoir te servir que de int avec des Vector3Int pour les déplacement, pour éviter les problème peut être des float et des comparaison de position.

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

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

Re: Une boule oui, pas l'autre

Message par EmileF » 30 Mars 2020 17:34

Ta première idée a été excellente.

Voilà la correction:

Code : Tout sélectionner

                if (dir != Vector3.zero)
                {
                    for (int i = 0; i < 2; i++)
                    {
                    	//RaycastObjet est une extension perso qui lance un rayon de longueur indiquée 
                    	//dans la direction indiquée et me renvoit un transform s'il y a quelque chose
                        Transform obstacle = Boules[i].RayCastObjet(dir, 0.8f);
                        if (obstacle == null)//S'il renvoie rien c'est bon
                        {
                            move = true;
                        }
                        else//Si c'est une autre boule et qu'on peut déplacer cette autre boule on déplace
                        {
                            for (int b = 0; b < Boules.Length; b++)
                            {
                                if (Boules[b] == obstacle && obstacle.RayCastObjet(dir, 0.8f) == null)
                                    move = true;
                            }

                        }
                        if (move)//on déplace
                        {
                            Vector3 pos = Boules[i].localPosition;
                            dest[i] = pos + Vector3.Scale(Pas, dir);
                            Boules[i].LocalMove(dest[i], 1, 0, "EndMove", gameObject, i);
                        }
                    }
                }

Ca marche nickel, et je vais pouvoir me servir de ça pour les trous.
Impeccable.

J'avais aussi fait un test avec mon autre script en ajoutant ou enlevant selon le cas une tolérance, et ça a marché.
C'est donc bien les floats qui créaient soucis.

En tout cas merci Djulio, tu es un as.

Edit:
Pour répondre à tes questions
La position des boules est au hasard mais en respectant des positions précises
et pas de soucis de pivot ni de parent ou enfant
Ton idée a réglé ce dernier point (détection de position inter-boules)
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [Resolu]Une boule oui, pas l'autre

Message par djulio74 » 30 Mars 2020 17:52

Parfait, ravi d'avoir pu aider. :)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Répondre

Revenir vers « Scripting »