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
Vers le bas : c'est la boule beige cette fois ci qui reste éloignée
Vers la gauche: Les 2 boules sont au bord
Vers la droite: les 2 boules sont au bord aussi
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;
}
}
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