Unity - сенсорный ввод с разделенным экраном случайным образом перестает работать в середине игры - PullRequest
0 голосов
/ 09 октября 2018

У меня есть простая трехмерная баскетбольная игра, над которой я работаю, используя Unity (v 2017.3.1f1 64 bit) с многопользовательским режимом с разделенным экраном ... в основном, если вы проведете пальцем по обе стороны экрана, эта сторона будетстреляйте по мячу, и я проверяю, чтобы независимо от того, сколько пальцев вы проведете пальцем, только один шарик будет сбит с каждой стороны, используя идентификаторы пальцев в классе сенсорного ввода Unity ... кажется, все работает нормально, включая одновременную стрельбус обеих сторон, однако он случайным образом перестанет работать на одной стороне, а затем перестанет принимать входные данные для этой стороны ... иногда он возвращается через несколько секунд, иногда он просто не работает для остальной части игры ... Я могукажется, не повторяет это последовательно, но это будет происходить довольно часто ... это также случается чаще, когда я использую несколько пальцев на каждой стороне одновременно, но это происходило с использованием одного пальца на каждой стороне, или иногда, когдатолько смахивание на одну сторону .... Я уверен, что код мог бы быть написан лучше, но мы хотели сохранить его как можно прощеи, по возможности, явно ... я что-то здесь упускаю? ... возможно, это перегрузка массива Touch или что-то в этом роде? .. цель сборки - ПК, и проблема видна как в редакторе Unity, так и в полной сборкена разных сенсорных экранах, включая ИК и емкостные экраны ... заранее благодарю за любую помощь ... вот соответствующий код:

int screenMidPoint
int finId1 = -1;
int finId2 = -1;

 void Start()
{
    Input.multiTouchEnabled = true;
    screenMidPoint = Screen.width / 2;
}

void Update()
{

    if (Input.touchCount > 0)
    {
        foreach (var touch in Input.touches)
        {
            if (touch.phase == TouchPhase.Began)
            {
                //For left half screen
                if (touch.position.x <= screenMidPoint && finId1 == -1)
                {
                    p1StartPos = touch.position;
                    p1StartTime = Time.time;
                    finId1 = touch.fingerId;
                }
                //For right half screen
                else if (touch.position.x > screenMidPoint && finId2 == -1)
                {
                    p2StartPos = touch.position;
                    p2StartTime = Time.time;
                    finId2 = touch.fingerId;
                }
            }
            else if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)

            {
                if (touch.fingerId == finId1 && Time.time > p1NextFire)
                {
                    p1NextFire = Time.time + fireRate;
                    p1EndTime = Time.time;
                    p1EndPos = touch.position;
                    p1DeltaSwipe = p1EndPos - p1StartPos;

                    if (p1DeltaSwipe.y > 0)
                    {
                        // p1 Shoot code is here

                    }

                    finId1 = -1;

                }
                else if (touch.fingerId == finId2 && Time.time > p2NextFire)
                {
                    p2NextFire = Time.time + fireRate;
                    p2EndTime = Time.time;
                    p2EndPos = touch.position;
                    p2DeltaSwipe = p2EndPos - p2StartPos;

                    if (p2DeltaSwipe.y > 0)
                    {
                        // p2 Shoot code is here

                    }

                    finId2 = -1;

                }
            }
        }
    }

}

1 Ответ

0 голосов
/ 09 октября 2018

Вы должны сбросить finId1 и finId2, когда соответствующее касание закончено или отменено независимо от условий скорострельности.Попробуйте это:

void Update()
{
    if (Input.touchCount > 0)
    {
        foreach (var touch in Input.touches)
        {
            if (touch.phase == TouchPhase.Began)
            {
                //For left half screen
                if (touch.position.x <= screenMidPoint && finId1 == -1)
                {
                    p1StartPos = touch.position;
                    p1StartTime = Time.time;
                    finId1 = touch.fingerId;
                }
                //For right half screen
                else if (touch.position.x > screenMidPoint && finId2 == -1)
                {
                    p2StartPos = touch.position;
                    p2StartTime = Time.time;
                    finId2 = touch.fingerId;
                }
            }
            else if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)
            {
                if (touch.fingerId == finId1)
                {
                    finId1 = -1;

                    p1EndTime = Time.time;
                    p1EndPos = touch.position;
                    p1DeltaSwipe = p1EndPos - p1StartPos;

                    if (p1DeltaSwipe.y > 0 && Time.time > p1NextFire)
                    {
                        p1NextFire = Time.time + fireRate;

                        // p1 Shoot code is here
                    }
                }
                else if (touch.fingerId == finId2)
                {
                    finId2 = -1;

                    p2EndTime = Time.time;
                    p2EndPos = touch.position;
                    p2DeltaSwipe = p2EndPos - p2StartPos;

                    if (p2DeltaSwipe.y > 0 && Time.time > p2NextFire)
                    {
                        p2NextFire = Time.time + fireRate;

                        // p2 Shoot code is here
                    }
                }
            }
        }
    }
}
...