[Résolu] Problème avec Input Touch sur iOS

Toutes les questions sur le développement Mobile, y compris la partie script.
rorix
Messages : 48
Inscription : 06 Juil 2019 17:17

[Résolu] Problème avec Input Touch sur iOS

Message par rorix » 03 Juil 2021 11:58

Bonjour,

J’ai un souci avec des contrôles sur iOS. Je développe un petit jeu de vaisseau avec 2 boutons permettant d’activer les moteurs pour faire avancer le vaisseau. (voir ce post viewtopic.php?f=12&t=18083).
  • Si le joueur appuie sur un bouton : le vaisseau pivote
  • Si le joueur appuie sur les 2 boutons : le vaisseau avance
Sur android tout fonctionne bien, mais sur iOS la commande pour que le vaisseau avance se bloque aléatoirement. C’est à dire que :
  • le joueur appuie sur les 2 boutons >> le vaisseau avance
  • le joueur relâche un des 2 boutons >> le vaisseau avance toujours alors qu’il est censé s'arrêter et commencer à pivoter
Voir cette vidéo (au moment où le vaisseau fonce dans le mur, je n’appuie que sur une touche, j’arrête la vidéo au moment où le jeu “comprend” que je n’appuie que sur une touche, le vaisseau arrête d’avancer et pivote) :
https://youtu.be/WxSBuXpjZtU

Voilà le code que j’utilise pour gérer les boutons :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class TouchController : MonoBehaviour
{
    
    private List<RaycastResult> raycastResults = new List<RaycastResult>();
    private Dictionary<int, List<RaycastResult>> raycastResultsByFingerId = new Dictionary<int, List<RaycastResult>>();
    private Touch touch;
    private PointerEventData pointer;

    public GameParentController gameController;

    private void Start()
    {
        pointer = new PointerEventData(EventSystem.current);
    }

    void Update()
    {

        if (Input.touchCount > 0)
        {
            pointer = new PointerEventData(EventSystem.current);

            for (int i = 0; i < Input.touchCount; i++)
            {
                touch = Input.GetTouch(i);

                // Handle finger movements based on TouchPhase
                switch (touch.phase)
                {
                    //When a touch has first been detected, change the message and record the starting position
                    case TouchPhase.Began:
                        // Record initial touch position.
                        //Debug.Log("DEBUT " + i);
                        pointer.position = touch.position;

                        EventSystem.current.RaycastAll(pointer, raycastResults);

                        if (raycastResults.Count > 0)
                        {
                            foreach (var go in raycastResults)
                            {
                                Debug.Log("TOUCH BEGAN : " + go.gameObject.name, go.gameObject);
                                if (go.gameObject.name == "ButtonMoteurGauche")
                                {
                                    gameController.ActiverMoteurDroit();
                                }
                                else if (go.gameObject.name == "ButtonMoteurDroit")
                                {
                                    gameController.ActiverMoteurGauche();
                                }
                                else if (go.gameObject.name == "Fire")
                                {
                                    gameController.Fire();
                                }
                            }
                        }
                        break;

                    case TouchPhase.Ended:
                        // Report that the touch has ended when it ends
                        //Debug.Log("FIN " + i);
                        pointer.position = touch.position;

                        EventSystem.current.RaycastAll(pointer, raycastResults);

                        if (raycastResults.Count > 0)
                        {
                            foreach (var go in raycastResults)
                            {
                                Debug.Log("TOUCH END : " + go.gameObject.name, go.gameObject);
                                if (go.gameObject.name == "ButtonMoteurGauche")
                                {
                                    gameController.StopMoteurDroit();
                                }
                                else if (go.gameObject.name == "ButtonMoteurDroit")
                                {
                                    gameController.StopMoteurGauche();
                                }
                            }
                        }
                        break;
#if UNITY_IOS
                    case TouchPhase.Canceled:
                        // Report that the touch has ended when it ends
                        //Debug.Log("FIN " + i);
                        pointer.position = touch.position;

                        EventSystem.current.RaycastAll(pointer, raycastResults);

                        if (raycastResults.Count > 0)
                        {
                            foreach (var go in raycastResults)
                            {
                                Debug.Log("TOUCH END : " + go.gameObject.name, go.gameObject);
                                if (go.gameObject.name == "ButtonMoteurGauche")
                                {
                                    gameController.StopMoteurDroit();
                                }
                                else if (go.gameObject.name == "ButtonMoteurDroit")
                                {
                                    gameController.StopMoteurGauche();
                                }
                            }
                        }
                        break;
#endif
                }
            }
        }
        //#endif
    }
}

Je ne comprends pas ce qui ne fonctionne pas. Des tests que j’ai pu faire, on dirait que sur iOS le jeu ne passe pas tout de suite dans le TouchPhase.Ended (ou TouchPhase.Canceled). Il y aurait un délai entre le moment où le joueur enlève son doigt et où iOS prend en compte l’action.

J’ai essayé avec et sans le bloc “#if UNITY_IOS” pour TouchPhase.Canceled.

Qu’en pensez-vous ? Est-ce que je fais quelque chose de mal ?
Dernière édition par rorix le 26 Juil 2021 12:03, édité 1 fois.

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

Re: Problème avec Input Touch sur iOS

Message par Max » 03 Juil 2021 12:09

Bonjour,

ta vidéo est privée et donc non accessible en lecture pour les membres.
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

rorix
Messages : 48
Inscription : 06 Juil 2019 17:17

Re: Problème avec Input Touch sur iOS

Message par rorix » 04 Juil 2021 12:58

En effet je ne m'étais pas rendu compte que ça pouvait empêcher de la voir. C'est modifié normalement ça devrait être bon.

rorix
Messages : 48
Inscription : 06 Juil 2019 17:17

Re: [Résolu] Problème avec Input Touch sur iOS

Message par rorix » 26 Juil 2021 12:05

Après de nombreux tests, j'ai trouvé la solution. J'utilise LunarConsole pour avoir les logs pendant les tests. En l'enlevant ça marche. Il doit y avoir conflit entre mon code et celui de Lunar sur la gestion des touches.

Répondre

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