Page 4 sur 4

Re: Collision pas au top

Publié : 08 Sep 2017 13:53
par simonj
Moi 1971 a écrit :
08 Sep 2017 10:31
Bonjour,
Il ne faut pas gérer le déplacement en fonction des positions, mais en fonction des distances.
NE PAS FAIRE :
Si ( position de 1 == position de 2 ) Alors ....
FAIRE :
Si ( ValeurAbsolue de position de 1 - ValeurAbsolue de position de 2 ) < 1 Alors ...


Bonne continuation.
Effectivement et je dirais même plus :

Code : Tout sélectionner

Vector3.Distance(position1, position2) < 1;
(Avec la document officielle).

Re: Collision pas au top

Publié : 08 Sep 2017 21:11
par cortoh
Bonsoir,
Merci de vous intéresser à mon problème, je galère vraiment et du coup je ne n'avance plus dans mon projet.
Je suis désolé mais je n'ai pas saisi vos réponses, je me permet de faire une récap sur la scène et le problème rencontré.
J'ai un plateau tel un damier sur lequel il y à des cubes fixes (murs) et des cubes mobiles qui losque l'on clique sur l'une de ses faces se déplace et s'arrete quand il touche un autre bloc mobile ou bloc fixe, jusque là aucun soucis, le problème c'est que les cubes rentrent plus ou moins dans les cubes qu'il rencontres au lieu de s'arréter pile-poil devant créant un décalage inaceptable.
Delà j'ai pour rectifier ce problème creé une variable (Int) qui indique la position du cube sur son axe Z ou X , ainsi quand l'un des blocs mobile s'arrète on utilise cette variable pour le repositionner sur une valeur entière, exemple un cube qui rencontre un autre cube se trouvant en position -3 le cube en action devrais s'arreter en -2 et non en -2.0893, pour ça j'ai ce code

Code : Tout sélectionner

		Vector3 localPosition = conteneurcube.transform.localPosition;  
		localPosition.z = (int) localPosition.z; 
		conteneurcube.transform.position = localPosition;
qui ma été complété par les membres du forum, cela dit ça ne fonctionne pas à cent pour cent comme je l'ai expliqué dans le post précédent.
Gros merci d'avance si vous pouvez m'aider.

Re: Collision pas au top

Publié : 09 Sep 2017 10:56
par Max
Hello,

La solution proposé plus haut, te permet de connaitre la distance séparant deux points, donc facile de déterminer entre deux cubes le moment où il faudra s’arrêter. Çà se complique si ta scène comprend un certains nombre d'objets, qui plus est avec des formes complexes (mur en L, etc...).
Comme je te l'avais suggéré dans un autre sujet, ton approche n'est pas la plus simple (voir alambiquée, donc source d'erreurs). Pour déplacer des éléments comme tu sembles vouloir le faire et tester si il y a une interaction avec, soit la scène, soit avec d'autres éléments en mouvement, la solution conseillée et souvent la plus utilisée reste celle des raycast.

Re: Collision pas au top

Publié : 09 Sep 2017 11:01
par Moi 1971
Bonjour,
Ta façon de faire, avec les positions, implique de gérer tous les cas possibles avec des IF en cascade. Avec la notion de distance, il n'y a plus qu'un seul cas a gérer. Il faut tout revoir.
Ton cas présent se résume à ça :
M = Cube mobile
F = Cube fixe
CAS QUI FONCTIONNE :
(Début : F en 4, M en 2 => Situation attendue : F en 4, M en 3)
M = 2.0 => Pas contact => action = 1
M = 2.1 => Pas contact => action = 1
M = 2.2 => Pas contact => action = 1
M = 2.3 => Pas contact => action = 1
...
M = 2.9 => Pas contact => action = 1
M = 3.0 => Pas contact => action = 1
M = 3.1 => contact => action = 0 => Int (3.1) = 3

CAS QUI NE FONCTIONNE PAS :
(Début : F en 4, M en 6 => Situation attendue : F en 4, M en 5)
M = 6.0 => Pas contact => action = 1
M = 5.9 => Pas contact => action = 1
M = 5.8 => Pas contact => action = 1
M = 5.7 => Pas contact => action = 1
...
M = 5.1 => Pas contact => action = 1
M = 5.0 => Pas contact => action = 1
M = 4.9 => contact => action = 0 => Int (4.9) = 4 <= FAUX 4 et non 5 !

Bonne continuation

Re: Collision pas au top

Publié : 09 Sep 2017 19:34
par cortoh
Bonjour,

Bon et bien je vais suivre le conseil de Max et tout revoir en utilisant les raycasts que je n'ai encore jamais utilisé, merci pour vos soutiens, je vous donne des nouvelles de mes premiers résultats.

Re: Collision pas au top

Publié : 11 Sep 2017 22:35
par cortoh
Alors voila j'ai réalisé un premier jet mais ça reste vraiment compliqué à maitrisser à mon niveau.
Le raycast intercept bien le cube qui se trouve devant lui mais aussi d'autre élément du décort alors comment cibler essentiellment celui qui se trouve dans l'axe de déplacement, du coup je ne peux pas vérifier que la méthode pour stopper mon cube mobile devant un autre cube fonctionne.
A savoir que mon cube est composé de quatre quads chacuns ayant son script relatiF à leur direction.

Code : Tout sélectionner

	
	// SCRIPT POUR LA FACE  FORWARD /////////////////////////////////////////////////////
	// VARIABLES //////////////////////////////////////////////////////////////////////////////

	public GameObject conteneurcube;
	public int action;


	// ACTIVER LE CUBE //////////////////////////////////////////////////////////////////////////////

	void OnMouseDown() {

		action = 1;

	}

	// UPDATE //////////////////////////////////////////////////////////////////////////////

	void Update() {


		RaycastHit hit;
		float theDistance;

		if (Physics.Raycast (transform.position, Vector3.forward, out hit)) {
			
			Debug.Log(theDistance + " " + hit.collider.gameObject.name ); 

		}


		Vector3 localPosition = conteneurcube.transform.localPosition;

		if (action == 1){

			theDistance = hit.distance;

		if (localPosition.z == theDistance -1 ) {
				
			speed = 0; // Arrêt du cube


		} else {

			conteneurcube.transform.Translate (Vector3.forward * speed * Time.deltaTime); // déplacement du cube

		}
		}



	} // FIN UPDATE //////////////////////////////////////////////////////////////////////////////
	} // FIN SCRIPT //////////////////////////////////////////////////////////////////////////////

Re: Collision pas au top

Publié : 12 Sep 2017 18:16
par Max
Bonsoir,
cortoh a écrit :
11 Sep 2017 22:35
Le raycast intercept bien le cube qui se trouve devant lui mais aussi d'autre élément du décort alors comment cibler essentiellment celui qui se trouve dans l'axe de déplacement,
Tu peux déjà jouer sur deux paramètres que tu n'intègres pas dans la fonction raycast comme tu l'as écrite pour le moment, et qui pourraient t'être utile.
Là, tu fais un raycast avec une distance de test qui est considérée (par défaut) comme 'infinie'. Déjà tu peux définir une distance maxi pour ton rayon, ce qui limiterait la porté du test: Raycast( origin, direction, out hitInfo, maxDistance) .
En suite, ce qui peut aussi être utile, c'est de filtrer ton test, en particulier pour éviter que tes rayons ne détectent par exemple les éléments du décor. Pour cela il te faut passer par les Layers. Tu pourras faire en sorte que certaines éléments (avec un/des layers spécifiques) soient ignorés lors du test de collision avec la fonction Raycast. La fonction pourrait s'écrire: Raycast( origin, direction, out hitInfo, maxDistance, layermask)

Voiloù pour les bonnes pistes je pense ;)

Re: Collision pas au top

Publié : 12 Sep 2017 20:56
par cortoh
Ok, merci pour infos Max je vais travailler dans ce sens.
Histoire d'avoir un aperçu de ma scène, voici une image d'une scène lembda comprenant les murs et 3 cubes mobiles.

Image