Page 2 sur 4

Re: Collision pas au top

Publié : 01 Sep 2017 12:06
par boubouk50
1/ Désactivation temporaire du Collider d'un objet touché?
2/ Un objet touché est déclaré 'touché' (via booléen publique) dans le OnCollider/TriggerEnter ()? Cette variable est réinitialisée par le gameObject touché à partir d'un certain temps.
3/ Récupération des colliders touchés dans une liste -> test?

Re: Collision pas au top

Publié : 01 Sep 2017 16:24
par E3DStef
Oui plutot le 1)

Le but recherché est de comptabiliser le nombre de fois que ma voiture touche un mur, un pieton, une barrière.
Ors quand je touche, les GO se touchent x fois et je ne veux compter que = 1 fois

Mais ton idée de désactiver le collider/trigger me semble direct une bonne piste.
Je pourrai le réactiver quand je serai à x pixels de lui (et ainsi détecter une 2e touche du mm GO) ^^

Ce qui m'amène une autre question : Peux-t-on identifier un collider en particulier quand son GO en as plusieurs ?

Genre dé à 6 faces à qui on mets 6 colliders et qu'on laisse tomber.
Comment connaitre la face touchée vu que c'est le mm GO qui a 6 colliders différents ?

Merci de vos éclaircissements.

A+
Stef

Re: Collision pas au top

Publié : 01 Sep 2017 17:07
par boubouk50
Ne pas mettre les Colliders sur le même GO, mais faire des enfants peut être une solution.
Créer une liste des Colliders du GO puis comparer le Collider touché avec ceux de la liste peut-être.

Comme l'information reçu est le Collider touché, celui-ci n'a pas d'information propre.

Re: Collision pas au top

Publié : 02 Sep 2017 11:10
par cortoh
J'ai trouvé une solution pour rectifier la postion de mon cube.
J'ai creé une variable int qui me donne la position en cours de mon cube, une fois que mon cube c'est arrêté je récupère la valeur int pour repositionner mon cube, ex: si mon cube c'est arrêté sur une position de 3.056, je peux avec la valeur entière le repositionner en 3 et ça fonctionne très bien, cela dit je n'arrive pas à le transcrire en C# car Unity n'accepte pas la variable int et m'oblige à utiliser un float, y a t-il un moyen de convertir éventuellement le float en int ou une autre solution ?
Merci.

Re: Collision pas au top

Publié : 02 Sep 2017 11:25
par E3DStef
cortoh a écrit :
02 Sep 2017 11:10
y a t-il un moyen de convertir éventuellement le float en int ou une autre solution ?
Dans ce genre de besoin le plus simple est de chercher du coté des ToInt.

Une simple recherche "unity3d c# float to int" m'a donnée plusieurs résultats dont :


floatVariable.ToString

Code : Tout sélectionner

floatVariable.ToString ("0")

//this displays only full numbers, if you put "0.0" instead it would 
//display numbers with just one decimal
> source : https://forum.unity3d.com/threads/conve ... ger.27511/


Mathf.RoundToInt

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        Debug.Log(Mathf.RoundToInt(10.0F));
        Debug.Log(Mathf.RoundToInt(10.2F));
        Debug.Log(Mathf.RoundToInt(10.7F));
        Debug.Log(Mathf.RoundToInt(10.5F));
        Debug.Log(Mathf.RoundToInt(11.5F));
        Debug.Log(Mathf.RoundToInt(-10.0F));
        Debug.Log(Mathf.RoundToInt(-10.2F));
        Debug.Log(Mathf.RoundToInt(-10.7F));
        Debug.Log(Mathf.RoundToInt(-10.5F));
        Debug.Log(Mathf.RoundToInt(-11.5F));
    }
}
> source : https://docs.unity3d.com/ScriptReferenc ... ToInt.html


Perso j'utilisais la 2e solution (extraite de la doc) ou Mathf.FloorToInt mais la 1ere me semble réellement intéressante.
A+

Stef

Re: Collision pas au top

Publié : 02 Sep 2017 13:05
par cortoh
j'ai testé avec

Code : Tout sélectionner

int myfloat = (int) posiEnCours;
ça fonctionne pas mal, merci pour les liens.

Re: Collision pas au top

Publié : 02 Sep 2017 13:20
par Max
Bonjour,

ToString() te produira une chaine de caractères. C'est pas ce que tu cherches.

donc pour toi, les options possibles de base:

Code : Tout sélectionner

float posiEnCours;
posiEnCours = conteneurcube.transform.localPosition.z;

int localZ = Mathf.FloorToInt(posiEnCours); // sans arrondi
(ou)
int localZ = Mathf.RoundToInt(posiEnCours); // avec arrondi
(ou)
int localZ = (int) posiEnCours;
Voilou ;)

Re: Collision pas au top

Publié : 02 Sep 2017 14:10
par cortoh
Dans la console j'ai bien la confirmation que ma variable est convertie en int mais je n'arrive pas à la récupérer pour repositionner le cube, est-ce que c'est parce ce que je suis dans la fonction Trigger ? je pensais faire

Code : Tout sélectionner

conteneurcube.transform.position.z = int myfloat;


Mon code C#;

Code : Tout sélectionner

public float posiEnCours;		
public int speed = 3;
public int action;
public int contact;
public Transform conteneurcube;

void OnMouseDown() {

	if (contact == 0) {
	action = 1;

	}
	}

void OnTriggerEnter() {
	
	contact = 1;
	action = 0;

	posiEnCours = conteneurcube.transform.localPosition.z;  // Console affiche: 3.036288
	int myfloat = (int) posiEnCours; // Conversion
	print (myfloat); // Console affiche: 3 (c'est ok)
	conteneurcube.transform.position.z = int myfloat; // ?§!!!

	}

void OnTriggerExit() {

	contact = 0;

	}

	void Update() {

	if (action == 1) {
	conteneurcube.transform.Translate(Vector3.forward * speed * Time.deltaTime);

	}
	}
	}


Re: Collision pas au top

Publié : 02 Sep 2017 14:20
par Max
pourquoi le 'int' devant myfloat ?
dans ce cas tu devrais écrire

Code : Tout sélectionner

conteneurcube.transform.position.z = myfloat;
Sinon, dans le nommage de tes données, petit conseil en passant, essais d'être plus rigoureux.
Tu nommes un int avec "myfloat". Cela ne peut qu'apporter de la confusion. Si je parcours rapidement ton code, en lisant cette ligne je m'attends à ce que 'myfloat' soit ... un float.
Dans tes codes, qui seront au fil du temps de plus en plus important, tu te rendra compte de l'importance que cela a, pour toi, mais aussi pour tous ceux qui seront amené à les lire ;)

Re: Collision pas au top

Publié : 02 Sep 2017 14:47
par E3DStef
Max a écrit :
02 Sep 2017 14:20
tu te rendra compte de l'importance
(...) des règles de nommage
+1 @Max