Page 1 sur 1

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

Publié : 03 Juil 2021 11:58
par rorix
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 ?

Re: Problème avec Input Touch sur iOS

Publié : 03 Juil 2021 12:09
par Max
Bonjour,

ta vidéo est privée et donc non accessible en lecture pour les membres.

Re: Problème avec Input Touch sur iOS

Publié : 04 Juil 2021 12:58
par rorix
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.

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

Publié : 26 Juil 2021 12:05
par rorix
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.