Collision pas au top

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
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
Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: Collision pas au top

Message par simonj » 08 Sep 2017 13:53

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).

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Collision pas au top

Message par cortoh » 08 Sep 2017 21:11

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.

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Collision pas au top

Message par Max » 09 Sep 2017 10:56

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.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Collision pas au top

Message par Moi 1971 » 09 Sep 2017 11:01

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

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Collision pas au top

Message par cortoh » 09 Sep 2017 19:34

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.

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Collision pas au top

Message par cortoh » 11 Sep 2017 22:35

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 //////////////////////////////////////////////////////////////////////////////

Avatar de l’utilisateur
Max
Messages : 8763
Inscription : 30 Juil 2011 13:57
Contact :

Re: Collision pas au top

Message par Max » 12 Sep 2017 18:16

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 ;)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

cortoh
Messages : 159
Inscription : 22 Nov 2014 23:05

Re: Collision pas au top

Message par cortoh » 12 Sep 2017 20:56

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

Verrouillé

Revenir vers « (Js) Javascript »