Problème temps de latence écran tactile jeu Android

Toutes les questions sur le développement Mobile, y compris la partie script.
qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

Problème temps de latence écran tactile jeu Android

Message par qwerty31 » 13 Avr 2018 19:22

Bonjour à tous,

Je fais appel à vous car j'ai un problème que je n'arrive pas à résoudre correctement, ou alors partiellement et par des moyens à faire friser les cheveux de n'importe quel développeur digne de ce nom :gene:

J'ai créé un jeu avec des triangles qui tombent du haut de l'écran, du style Piano Tiles, qui est disponible ici et que j'ai présenté . Le jeu est fonctionnel mais j'aimerais améliorer la réponse de l'écran tactile.
Si vous jouez au jeu, vous remarquerez que plus les triangles tombent vite, plus il faut cliquer vers le bas du triangle pour le toucher, voire même cliquer carrément en-dessous du triangle pour que le jeu prenne le clic en compte. Le problème, vous vous en doutez, c'est que ça frôle la limite du désagréable.
Il me semble selon moi qu'il s'agit d'un problème dû au temps de réponse de l'écran tactile, le temps que l'information arrive au jeu le triangle est déjà arrivé plus bas et le clic n'est pas pris en compte.
Le seul moyen "peu académique" que j'ai à moitié réussi à mettre en place est de décaler avec du code le clic sur l'écran en fonction de la vitesse du triangle afin de compenser le problème (je ne sais pas si c'est très clair...?)
Je cherche donc un moyen plus académique/pratique de régler ce problème, mais je n'ai absolument aucune idée de comment faire...

C'est pour cela que je fais appel à vous ;-)

Si jamais vous avez des idées sur comment régler ce problème autrement qu'en compensant le décalage par le code, ou si vous pensez que le problème ne vient pas de là, je suis toute ouïe :-D

Je vous remercie par avance pour toutes les réponses que vous pourrez m'apporter, et si jamais vous avez des questions n'hésitez pas :mrgreen:
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

Override
Messages : 143
Inscription : 04 Nov 2016 20:08

Re: Problème temps de latence écran tactile jeu Android

Message par Override » 14 Avr 2018 11:33

Comme tu dit le décalage de code, il me semble que c'est de l'extrapolation, c'est très utilisé dans certains jeux comme les FPS ou la va par exemple prédire la position du joueur à la prochaine image et comme ça commencer à enticiper des truc comme la collision

C'est plutôt ingénieu comme technique détrompe toi c'est vraiment une bonne idée que t'a eu surtout en le découvrant tout seul !

Après il me semble pas que tu puisses faire encore plus optimisé avec le tactile, peut-être qu'il va falloir que tu augmente le nombre de FPS et que tu performe toujours plus ton système de prédiction

Bonne chance :hehe:
:merci:

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Problème temps de latence écran tactile jeu Android

Message par F@B » 14 Avr 2018 13:25

Qu'est ce qu'il faut pas lire sans blague............ :pleur4:

Donc non c'est pas une bonne idée, si il fallait faire ça pour avoir les bons positionnements tactile de doigts on serait pas sortit de l'auberge.

pour piger ce qui déconne il faudrait voir comment tu as codé ça ? comment son tes colliders et le setup de ta scene, etc..

unity (comme tout moteur) fonctionne par Frame, (void Update())
Sur une Frame, on sait si tu as un (ou deux) doigt ,posé ou non sur l'écran et ou et dans quelle phase ils sont (began, moved, Ended etc...)

voir la doc, et voir comment tu as implémenté tout ça, tu as surement un problème dans ton algo de détection.
https://docs.unity3d.com/ScriptReference/Touch.html
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

Re: Problème temps de latence écran tactile jeu Android

Message par qwerty31 » 15 Avr 2018 21:20

Bonsoir, merci pour vos réponses.

@Override, je ne savais pas que ce "décalage de code" pouvait être considéré comme du code propre, je vais me renseigner sur cette extrapolation...

@F@B, j'utilise pour la détection de mes triangles un Event Trigger (un Component de base d'Unity) qui permet de détecter le clic et qui appelle ensuite une fonction Click() que j'ai écrite et qui effectue tout ce qui est nécessaire lorsqu'un triangle a été cliqué (+1 au score, etc...).

Est-ce que serait ce moyen de détection qui ne serait pas adapté à mon jeu ? J'ai lu la doc et je connaissais déjà le fonctionnement de Input pour les mobiles mais j'ai préféré utiliser un Event Trigger car cela me paraissait plus facile à coder... Il me semble que la meilleure solution en utilisant le Mobile Input serait d'utiliser un RayCast à chaque frame, est-ce que cela serait plus efficace ?

Merci à vous et bonne soirée !
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Problème temps de latence écran tactile jeu Android

Message par F@B » 16 Avr 2018 11:22

en théorie ça devrait être bon aussi je pense, même si l'UI est pas forcement adéquat pour un jeu complet, faut voir...

https://docs.unity3d.com/Manual/EventSystem.html

tu pourrais faire un Debug frame par frame pour voir, et simuler un touch, et voir si c'est pas ton algo qui déconne, tu peux aussi nous montrer le bout de code qui correspond ?

peut être que ton décalage vient du moment ou est Repaint l'UI et le click, un jeu 2D ne se fait pas avec l'UI en principe.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

Re: Problème temps de latence écran tactile jeu Android

Message par qwerty31 » 18 Avr 2018 18:28

Bonjour,

Je pense que je vais faire une copie de mon jeu et essayer de passer en Input Mobile et RayCast voir s'il y a une amélioration...

Je vais également essayer ce que tu as dit, de mettre un Debug frame par frame et de voir avec le Profiler ce qui ce passe.

Pour ce qui est du code, voici la fonction Click() qui est appelée lorsque un triangle est cliqué :

Code : Tout sélectionner

public void Click()
	{
		if (PlayerPrefs.GetInt("gameStopped") == 0) {
			PlayerPrefs.SetInt ("score", PlayerPrefs.GetInt ("score") + 1);
			PlayerPrefs.SetInt ("trianglesNb", PlayerPrefs.GetInt ("trianglesNb") + 1);
			gameObject.GetComponent<Image> ().enabled = false;
			gameObject.GetComponentInChildren<ParticleSystem> ().Play ();
			gameObject.GetComponent<AudioSource> ().Play ();
			gameObject.tag = "DeadPlayer";
		}
	}
Je précise que ce script est présent sur chaque instance de mes triangles.

Je vous tiens au courant de mes tests et de mes avancées.

Merci à vous et bonne soirée !
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

Avatar de l’utilisateur
F@B
Messages : 1844
Inscription : 01 Août 2013 10:41
Contact :

Re: Problème temps de latence écran tactile jeu Android

Message par F@B » 19 Avr 2018 12:03

déjà d'aller loader les playerpref chaque click ça me parait très lourd ! le playerpref n'est pas fait pour ça !

pourquoi n'utilises-tu pas des variables savoir si on jeu est en cours ? et tu stockes dans playerPref que quand tu veux sauvegarder ! la tu fais des accès disque chaque coup

tu devrais mettre en cache et ne pas faire des GetComponent tout le temps, c'est lourd aussi.
ʕ·͡ᴥ·ʔ ==> Mon Portfolio <== ʕ·͡ᴥ·ʔ

Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: Problème temps de latence écran tactile jeu Android

Message par Iwa » 19 Avr 2018 12:12

Hello,

tient nous au jus de tes tests
qwerty31 a écrit :
18 Avr 2018 18:28

Je précise que ce script est présent sur chaque instance de mes triangles.
Ouchy. En effet, ça n'aide pas, faire du GetComponent et GetComponentInChildren à chaque instance ça pique. Tu pourrais ne serait-ce que les mettre en param de ton script plutôt que d'aller les pêcher à chaque coup.
Pour te donner une idée c'est comme si toutes les secondes voire moins je venais te voir et t'enfoncer un doigt dans les côtes en te demandant "hey, t'as mal?" :).

Ensuite , question toute con mais ça sert à quoi d'avoir dans tes players pref le nombre de triangles cliqués ET le score qui semble s'incrémenté de la même façon?

Et ensuite tout ce qu'à dit Fab aussi, pas d'accès sauvage au Player Pref, c'est gourmand et pas utile :).

Bon courage à toi :)

P.S : Pense à dégager tes débugs log après test, ça aussi ça mange de la ressource bêtement :)
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

qwerty31
Messages : 30
Inscription : 15 Nov 2016 17:38
Contact :

Re: Problème temps de latence écran tactile jeu Android

Message par qwerty31 » 29 Avr 2018 10:16

Merci pour vos conseils.

@Iwa, c'est parce qu'il y a également des triangles en or qui valent 50 points et des bombes qui te font perdre 100 points dans le jeu ;) eux aussi il y a un décalage, mais vu que le script est également le même que pour mes triangles je n'aurais juste qu'à transposer :-D
Je vais donc réécrire mon script afin d'éviter les accès mémoire et les GetComponent. J'ai également essayé d'écrire un script qui permettrait de détecter le clic sur un triangle sans l'UI, uniquement avec le InputMobile, le RayCast et des Collider2D sur chacun de mes triangles, ce qui donne ça :

Code : Tout sélectionner

	private Ray ray;
	private RaycastHit info;

	void Update()
	{
		foreach (Touch touch in Input.touches) {
			if(touch.phase == TouchPhase.Began) {
				ray = Camera.main.ScreenPointToRay (new Vector3 (touch.position.x, touch.position.y, 0));
				Physics.Raycast (ray, out info);
				if (info.transform.gameObject.tag == "triangle")
					Destroy (info.transform.gameObject);
			}
		}
	}
Sauf que ça n'a pas l'air de fonctionner... Des idées pour comment détecter un clic sur l'écran et faire correspondre à ce qu'il y a sur l'écran en 2D ?

Merci à vous !
Mon premier jeu (gratuit) sur Android, réalisé avec Unity3D, Touch'em All ! est disponible sur le Play Store. N'hésitez pas à le tester ! :hehe:

Répondre

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