[C#] - Petits pblm de "touch"

Toutes les questions sur le développement Mobile, y compris la partie script.
Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

[C#] - Petits pblm de "touch"

Message par E3DStef » 17 Juin 2015 00:28

Salut à tous

J'ai un étrange petit pblm que je vous soumets ici

Le concept est simple, Une sphere centrale autour de laquelle gravite 4 écrans.
la rotation des écrans est auto si pas de doigt, manuelle si l'on pose un doigt.
Si l'on bouge 2 doigts (posés sur écran) cela zoom l'écran face caméra ou dézoom si écran zoomé
La caméra ne bouge pas.

Bref mon petit test fonctionne bien mais parfois quand je zoom, l'écran zoom et dézoom immédiatement (comme si dans mon script j'étais passé 2 fois dans la condition de test IF 2 DOIGTS)
Et ce alors que mes doigts n'ont mm pas quitté l'écran ?

Voici le code, merci de vos lumières là moi je ne vois plus rien ;-)

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class RotationScript : MonoBehaviour 
{
	
	bool multiTouchEnabled;
	
	private float Rotspeed = 0.2f;

	public GameObject ObjEcran1;
	public GameObject ObjEcran2;
	public GameObject ObjEcran3;
	public GameObject ObjEcran4;

	bool CCOroutine = false;
	bool FlagZoomDeZoom = false;

	private Animation SCriptZoom1;
	private Animation SCriptZoom2;
	private Animation SCriptZoom3;
	private Animation SCriptZoom4;

// ---------------------------DEBUT START-----------------------------------------------
	void Start () 
	{
		multiTouchEnabled = true;

		SCriptZoom1 = ObjEcran1.GetComponent<Animation>();
		SCriptZoom2 = ObjEcran2.GetComponent<Animation>();
		SCriptZoom3 = ObjEcran3.GetComponent<Animation>();
		SCriptZoom4 = ObjEcran4.GetComponent<Animation>();
	}
// ---------------------------FIN START-----------------------------------------------



// ---------------------------DEBUT UPDATE-----------------------------------------------
	void Update () 
	{

// Touch = 0
		// TANT QUE NO TOUCH (pas de touch écran)
		if (Input.touchCount == 0)
		{
			if (FlagZoomDeZoom) // FlagZoomDeZoom à true donc Zoom demandé/en cours
			{
				// On ne fait rien pas de rotation car l'écran est zoomé, donc on attends que écran soit dézommé pour reprendre la rotation (FlagZoomDeZomm = False)
				Debug.Log (" FlagZoomDeZoom Update Touch 0 : " + FlagZoomDeZoom);
			}
			else // FlagZoomDeZoom à false donc pas de fenetre zoomé, on applique une pause de 4 sec SSI un doigt a été précdement appuyé sinon on reprends la rotation
			{
				if (CCOroutine) // CCOroutine à true donc un doigt a été précédement appuyé
				{
					StartCoroutine(Wait4Sec(3.0F)); // Pause 4 secondes
				} 
				else // Pas de doigt avant donc on fait tourner
				{
					gameObject.transform.Rotate(Vector3.up, Rotspeed);
				}
			}
		}
		// Fin TANT QUE NO TOUCH

// Touch = 1
		// Si 1 DOIGT QUI BOUGE
		if (Input.touchCount == 1) // && Input.GetTouch (0).phase == TouchPhase.Moved)
		{
			//Vector2 touchDeltaPosition2 = Input.GetTouch (0).deltaPosition;
			Touch Doigt = Input.GetTouch (0);

			//float MouvX = touchDeltaPosition2.x;
			float MouvX = Doigt.deltaPosition.x;
			float CoordX = Doigt.position.x;
			float CoordY = Doigt.position.y;
			MouvX  = (MouvX / 2);

			if (FlagZoomDeZoom== false)// FlagZoomDeZoom à faux donc pas de Zoom en cours donc ok pour rotation d/g
			{
				gameObject.transform.Rotate (0, -MouvX, 0);
				CCOroutine =true; // On passe CCOroutine à vrai pour qu'une fois le doigt enlevé on ai une pause de 4s avant de reprendre la rotation automatique
			}
		}
		// Fin Si 1 DOIGT QUI BOUGE

// Touch = 2
		// Si 2 DOIGTS QUI BOUGENT
		if (Input.touchCount == 2 && Input.GetTouch (0).phase == TouchPhase.Moved)
		{
			this.FunctionDetecPositionEcran();
		}
		// Fin Si 2 DOIGTS QUI BOUGENT

	}
// --------------------------FIN UPDATE------------------------------------------------

	

// ---------------------------DEBUT VOID ZOOM -----------------------------------------------
	void FunctionZoom (string NumEcranAZoom)
	{
		multiTouchEnabled = false;
		switch(NumEcranAZoom)
		{
		case "car_1":
			gameObject.transform.Rotate (0,-gameObject.transform.localEulerAngles.y,0);
			SCriptZoom1.animation[NumEcranAZoom].speed = 1.0f;   // Zoom
			SCriptZoom1.animation.Play(NumEcranAZoom);
			break;
		case "car_2":
			gameObject.transform.Rotate (0,(90 - gameObject.transform.localEulerAngles.y),0);
			SCriptZoom2.animation[NumEcranAZoom].speed = 1.0f;   // Zoom
			SCriptZoom2.animation.Play(NumEcranAZoom);
			break;
		case "car_3":
			gameObject.transform.Rotate (0,(180 - gameObject.transform.localEulerAngles.y),0);
			SCriptZoom3.animation[NumEcranAZoom].speed = 1.0f;   // Zoom
			SCriptZoom3.animation.Play(NumEcranAZoom);
			break;
		case "car_4":
			gameObject.transform.Rotate (0,(270 - gameObject.transform.localEulerAngles.y),0);
			SCriptZoom4.animation[NumEcranAZoom].speed = 1.0f;   // Zoom
			SCriptZoom4.animation.Play(NumEcranAZoom);
			break;
		}
		FlagZoomDeZoom  =true;
		StartCoroutine(Wait4Sec(1.0F)); // Pause 4 secondes
		multiTouchEnabled = true;
	}
// ---------------------------FIN VOID ZOOM   ------------------------------------------------



// ---------------------------DEBUT VOID DEZOOM -----------------------------------------------
	void FunctionDeZoom (string NumEcranADeZoom)
	{
		switch(NumEcranADeZoom)
		{
		case "car_1":
			SCriptZoom1.animation[NumEcranADeZoom].speed = -2.0f;   // DeZoom
			SCriptZoom1.animation[NumEcranADeZoom].time = SCriptZoom1.animation[NumEcranADeZoom].length;
			SCriptZoom1.animation.Play(NumEcranADeZoom);
			break;
		case "car_2":
			SCriptZoom2.animation[NumEcranADeZoom].speed = -2.0f;   // DeZoom
			SCriptZoom2.animation[NumEcranADeZoom].time = SCriptZoom2.animation[NumEcranADeZoom].length;
			SCriptZoom2.animation.Play(NumEcranADeZoom);
			break;
		case "car_3":
			SCriptZoom3.animation[NumEcranADeZoom].speed = -2.0f;   // DeZoom
			SCriptZoom3.animation[NumEcranADeZoom].time = SCriptZoom3.animation[NumEcranADeZoom].length;
			SCriptZoom3.animation.Play(NumEcranADeZoom);
			break;
		case "car_4":
			SCriptZoom4.animation[NumEcranADeZoom].speed = -2.0f;   // DeZoom
			SCriptZoom4.animation[NumEcranADeZoom].time = SCriptZoom4.animation[NumEcranADeZoom].length;
			SCriptZoom4.animation.Play(NumEcranADeZoom);
			break;
		}
		FlagZoomDeZoom = false; // Passe à false pour dire que DeZoomé
	}
// ---------------------------FIN VOID DEZOOM   ------------------------------------------------



// ---------------------------DEBUT VOID POSTION - ECRAN -----------------------------------------------
	void FunctionDetecPositionEcran ()
	{
		if (gameObject.transform.localEulerAngles.y > -0.9999 &&  gameObject.transform.localEulerAngles.y < 35)
		{		
			if (FlagZoomDeZoom)// FlagZoomDeZoom à true donc Zoom en cours
			{
				this.FunctionDeZoom("car_1");
			}	
			else
			{
				this.FunctionZoom("car_1");
			}
			
		}
		if (gameObject.transform.localEulerAngles.y > 45 &&  gameObject.transform.localEulerAngles.y < 125)
		{
			if (FlagZoomDeZoom)// FlagZoomDeZoom à true donc Zoom en cours
			{
				this.FunctionDeZoom("car_2");
			}	
			else
			{
				this.FunctionZoom("car_2");
			}
		}
		if (gameObject.transform.localEulerAngles.y > 135 &&  gameObject.transform.localEulerAngles.y < 215)
		{
			if (FlagZoomDeZoom)// FlagZoomDeZoom à true donc Zoom en cours
			{
				this.FunctionDeZoom("car_3");
			}	
			else
			{
				this.FunctionZoom("car_3");
			}
		}
		if (gameObject.transform.localEulerAngles.y > 235 &&  gameObject.transform.localEulerAngles.y < 315)
		{
			if (FlagZoomDeZoom)// FlagZoomDeZoom à true donc Zoom en cours
			{
				this.FunctionDeZoom("car_4");
			}	
			else
			{
				this.FunctionZoom("car_4");
			}
		}
		if (gameObject.transform.localEulerAngles.y > 335 &&  gameObject.transform.localEulerAngles.y < 361)
		{
			if (FlagZoomDeZoom)// FlagZoomDeZoom à true donc Zoom en cours
			{
				this.FunctionDeZoom("car_1");
			}	
			else
			{
				gameObject.transform.Rotate (0,(360 - gameObject.transform.localEulerAngles.y),0);
				this.FunctionZoom("car_1");
			}
		}
	}
// ---------------------------FIN VOID POSTION - ECRAN  ------------------------------------------------



// ---------------------------DEBUT PARAM COROUTINES-----------------------------------------------

	IEnumerator Wait4Sec(float waitTime)
	{
		yield return new WaitForSeconds(waitTime);
		//Debug.Log ("Waited a sec : " + waitTime);
		if (FlagZoomDeZoom == false) 
		{
			CCOroutine = false;
		}
	}
}
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6243
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [C#] - Petits pblm de "touch"

Message par boubouk50 » 17 Juin 2015 09:24

j'ai pas tout lu mais déjà, là je ne pense pas que ce soit la bonne condition:

Code : Tout sélectionner

if (Input.touchCount == 2 && Input.GetTouch (0).phase == TouchPhase.Moved)
{
this.FunctionDetecPositionEcran();
}
En effet, tu ne rentres dedans que si c'est le premier doigt qui bouge.

Code : Tout sélectionner

if (Input.touchCount == 2) {
   if (Input.GetTouch (0).phase == TouchPhase.Moved || Input.GetTouch (1).phase == TouchPhase.Moved) //1 doigt ou les 2
   {
      this.FunctionDetecPositionEcran();
   }
}
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: [C#] - Petits pblm de "touch"

Message par E3DStef » 17 Juin 2015 22:29

Pt## t'as grave raison ;-)

lol je j'avais pas vu celle là, bravo le cc stef, bravo on copie colle son code sans faire gaffe... :roll: :roll:

Oui oui je voulais entrer dans la boucle SSI les 2 doigts bougent !

Merci boubouk50, si tu vois autre chose ;-)

A+

Stef
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6243
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [C#] - Petits pblm de "touch"

Message par boubouk50 » 18 Juin 2015 09:32

Je pense que le comportement est lié au fait que ta condition de reconnaissance de 2 doigts est toujours insuffisante.
Tu zoomes et dézoomes sur la même condition, donc une fois que tu zoomes et que tu as les 2 doigts encore dessus et s'ils bougent alors le dézoom est enclenché. Il faut un peu plus de contrôle, par exemple jouer sur le deltaPosition du touch pour éviter les tout petit mouvements une fois le zoom terminé, ou bien repasser obligatoirement par un touchCount < 2 (ou = 0), pour changer de 'phase' (zoom ou dézoom). La condition devrait être: Si je bouge, je zoome sans me préoccuper des touchs et une fois le zoom terminé, je dézoome si j'ai un nouveau mouvement significatif.
Si ton utilisateur doit faire un pinch, alors tu peux jouer avec le deltaPosition pour savoir si les doigts se rapprochent ou s'éloignent.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
E3DStef
Administrateur
Administrateur
Messages : 1646
Inscription : 14 Juil 2013 18:30
Localisation : https://www.carte-des-membres.com/fr/Unity3D-France/

Re: [C#] - Petits pblm de "touch"

Message par E3DStef » 19 Juin 2015 00:35

Oui tu as raison...les doigts restent collés et on repasse dans la boucle...

Sinon oui j'avais déjà fait des tests pinch où je décelais si les doigts s'écartaient ou se rapprochaient mais c t pas fluide (à l'époque)...

Je vais certainement opter pour cette solution

Merci de ton aide boubouk50, je teste et je poste ici les résultats pour info ou questions ;-)

A+
Le Savoir n'est Précieux que s'il est Partagé

Si besoin urgent de me contacter, faites moi un mail sur : franceunity3d@gmail.com

Répondre

Revenir vers « Développement plateformes mobile Iphone et Android »