Как делать последовательные действия при перетаскивании мышью Unity3D? - PullRequest
0 голосов
/ 08 марта 2020

У меня есть один объект в моей сцене, когда при перетаскивании мышью я хочу создать новый объект выше существующего, и, если перетаскивание все еще происходит, я хочу создать третий объект, и то же самое для четвёртый. Но если, например, перетаскивание заканчивается сразу после появления второго объекта, следующие объекты не должны появляться до следующего перетаскивания вверх.

И наоборот для перетаскивания мышью вниз, сначала четвертого объекта (вверху) ) следует удалить, а при перетаскивании третьего объекта также следует удалить et c ... до первого объекта. А также, если перетаскивание заканчивается сразу после удаления четвертого объекта, следующие объекты не следует удалять до следующего перетаскивания вниз.

Вот код, который я написал для механизма перетаскивания вверх c, но когда перетаскивая вверх, все 3 объекта появляются одновременно! и даже при отпускании перетаскивания, следующий также появляется!

public GameObject SpawnedBallUp1;
public GameObject SpawnedBallUp2;
public GameObject SpawnedBallUp3;
float scaleFactorY;
float DragDistance;
bool MovingUp = false;
bool MovingDown = false;
bool BallUp1Done = false;
bool BallUp2Done = false;
bool BallUp3Done = false;

void Update () {

    if (Input.GetMouseButton(0) && !Input.GetMouseButtonDown(0) || Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved && !(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began))
    {

        scaleFactorY = Input.GetAxis("Mouse Y") * 10;

        if (scaleFactorY < 0)
        {
            if (!MovingDown)
            {
                MovingDown = true;
            }
            MovingUp = false;
        }
        else if (scaleFactorY > 0)
        {
            if (!MovingUp)
            {
                MovingUp = true;
                if (!BallUp1Done)
                {
                    BallUp1Done = true;
                    StartCoroutine(BallUp1());
                    if (!BallUp2Done)
                    {
                        BallUp2Done = true;
                            StartCoroutine(BallUp2());
                        if (!BallUp3Done)
                        {
                            BallUp3Done = true;
                            StartCoroutine(BallUp3());
                        }
                    }
                }
            }
            MovingDown = false;
        }
        else if(scaleFactorY < 0.0005f && DragDistance > -0.0005f)
        {
            if (MovingUp)
            {
                MovingUp = false;
            }
            if (MovingDown)
            {
                MovingDown = false;
            }
        }
    }

private IEnumerator BallUp1()
{
    yield return new WaitForSeconds(0.3f);
    if(BallUp1Done)
    {
        GameObject Ball1 = Instantiate(SpawnedBallUp1, transform.position, Quaternion.identity);
    Ball1.transform.parent = transform.parent;
    }
}

private IEnumerator BallUp2()
{
    yield return new WaitForSeconds(0.6f);
    if (BallUp1Done)
    {
        GameObject Ball2 = Instantiate(SpawnedBallUp2, transform.position, Quaternion.identity);
    Ball2.transform.parent = transform.parent;
    }
}

private IEnumerator BallUp3()
{
    yield return new WaitForSeconds(0.9f);
    if (BallUp1Done)
    {
        GameObject Ball3 = Instantiate(SpawnedBallUp3, transform.position, Quaternion.identity);
        Ball3.transform.parent = transform.parent;
    }
}

1 Ответ

1 голос
/ 08 марта 2020

Я могу ответить на половину вашего вопроса, я думаю. Причина, по которой «даже при отпускании перетаскивания, следующий также появляется!» в том, что, пока вы соответственно ожидаете установленное время внутри сопрограмм, после этих вызовов WaitForSeconds вы не проверяете, чтобы убедиться, что пользователь все еще перетаскивает. Это означает, что, пока пользователь перетаскивал, когда запускались сопрограммы, объекты обязательно будут порождаться.

Чтобы исправить это, добавьте проверку внутри сопрограмм, например if (MovingUp), или, если важно, чтобы она происходит только как часть одного перетаскивания, возможно, дайте каждому перетаскиванию идентификатор, когда он начинается, и затем проверьте, что вы все еще находитесь в том же самом перетаскивании, сравнивая идентификаторы перетаскивания непосредственно перед тем, как шары появляются.

I ' Я не уверен, почему они все появляются одновременно - основываясь на этих сопрограммах, они не должны этого делать, если только у вас слишком низкая частота кадров и вы получаете только 1 кадр в секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...