Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 鼠标拖动Unity3D时如何执行连续动作?_C#_Unity3d - Fatal编程技术网

C# 鼠标拖动Unity3D时如何执行连续动作?

C# 鼠标拖动Unity3D时如何执行连续动作?,c#,unity3d,C#,Unity3d,我的场景中有一个对象,当鼠标向上拖动时,我想在现有对象的上方实例化一个新对象,如果仍然发生向上拖动,我想实例化第三个对象,第四个对象也是如此。但是,例如,如果在生成第二个对象时立即停止向上拖动,则在下次向上拖动之前不应生成下一个对象 鼠标向下拖动则相反,首先,应该删除第四个对象(在顶部),当仍然向下拖动时,也应该删除第三个对象,等等。。。直到第一个对象。而且,如果在删除第四个对象后立即停止向下拖动,则在下次向下拖动之前,不应删除下一个对象 下面是我为拖动机制编写的代码,但是当拖动时,所有3个对象

我的场景中有一个对象,当鼠标向上拖动时,我想在现有对象的上方实例化一个新对象,如果仍然发生向上拖动,我想实例化第三个对象,第四个对象也是如此。但是,例如,如果在生成第二个对象时立即停止向上拖动,则在下次向上拖动之前不应生成下一个对象

鼠标向下拖动则相反,首先,应该删除第四个对象(在顶部),当仍然向下拖动时,也应该删除第三个对象,等等。。。直到第一个对象。而且,如果在删除第四个对象后立即停止向下拖动,则在下次向下拖动之前,不应删除下一个对象

下面是我为拖动机制编写的代码,但是当拖动时,所有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;
    }
}
公共游戏对象生成ballup1;
公共游戏对象生成ballup2;
公共游戏对象生成ballup3;
浮动比例系数;
浮动阻力;
bool-MovingUp=false;
bool MovingDown=错误;
bool-BallUp1Done=false;
bool-BallUp2Done=false;
bool-BallUp3Done=false;
无效更新(){
if(Input.GetMouseButton(0)和&!Input.GetMouseButtonDown(0)| Input.touchCount>0和&&Input.GetTouch(0).phase==TouchPhase.Moved&!(Input.touchCount>0和Input.GetTouch(0.phase==touchase.begined))
{
scaleFactorY=Input.GetAxis(“鼠标Y”)*10;
if(scaleFactorY<0)
{
如果(!向下移动)
{
向下移动=正确;
}
MovingUp=false;
}
else if(scaleFactorY>0)
{
如果(!MovingUp)
{
MovingUp=true;
如果(!BallUp1Done)
{
BallUp1Done=true;
start例程(BallUp1());
如果(!BallUp2Done)
{
BallUp2Done=true;
start例程(BallUp2());
如果(!BallUp3Done)
{
BallUp3Done=true;
start例程(BallUp3());
}
}
}
}
向下移动=错误;
}
否则如果(比例系数<0.0005f&&DragDistance>-0.0005f)
{
如果(移动)
{
MovingUp=false;
}
如果(向下移动)
{
向下移动=错误;
}
}
}
私有IEnumerator BallUp1()
{
收益率返回新的WaitForSeconds(0.3f);
如果(Ballup1One)
{
GameObject Ball1=实例化(生成Ballup1,transform.position,Quaternion.identity);
Ball1.transform.parent=transform.parent;
}
}
私人IEnumerator BallUp2()
{
收益率返回新的WaitForSeconds(0.6f);
如果(Ballup1One)
{
GameObject Ball2=实例化(生成Ballup2,transform.position,Quaternion.identity);
Ball2.transform.parent=transform.parent;
}
}
私人IEnumerator BallUp3()
{
收益率返回新WaitForSeconds(0.9f);
如果(Ballup1One)
{
GameObject Ball3=实例化(生成Ballup3,transform.position,Quaternion.identity);
Ball3.transform.parent=transform.parent;
}
}

我想我可以回答你一半的问题。原因是“即使在释放阻力时,也会产生下一个阻力!”当您在协程中适当地等待设置的时间时,在那些
WaitForSeconds
调用之后,您没有检查用户是否仍在拖动。这意味着只要用户在启动协程时拖动,对象肯定会生成

若要解决此问题,请在协同程序中添加一个检查,如
if(MovingUp)
,或者如果它仅作为单个拖动的一部分发生很重要,则可以在开始拖动时为每个拖动指定一个ID,然后在生成球之前通过比较拖动ID来检查您是否仍处于相同的拖动中


我不知道为什么它们都同时生成——基于这些协同进程,它们不应该同时生成,除非您的帧速率非常低,并且每秒只能生成1帧。

除了Declan在回答中提到的以外,对于大多数情况,这首先是错误的方法。如果您试图在路径d上分布对象通过鼠标拖动,通常使用多段线或贝塞尔曲线标记路径,然后沿该路径分布对象。或者,如果是更简单的对象分布,则仅在最小距离(通常为半径)后生成另一个对象从最后一个对象,而不是基于时间或延迟的解决方案。--时间/延迟实际上是正确方法的情况非常非常罕见。