C# 鼠标拖动Unity3D时如何执行连续动作?
我的场景中有一个对象,当鼠标向上拖动时,我想在现有对象的上方实例化一个新对象,如果仍然发生向上拖动,我想实例化第三个对象,第四个对象也是如此。但是,例如,如果在生成第二个对象时立即停止向上拖动,则在下次向上拖动之前不应生成下一个对象 鼠标向下拖动则相反,首先,应该删除第四个对象(在顶部),当仍然向下拖动时,也应该删除第三个对象,等等。。。直到第一个对象。而且,如果在删除第四个对象后立即停止向下拖动,则在下次向下拖动之前,不应删除下一个对象 下面是我为拖动机制编写的代码,但是当拖动时,所有3个对象都同时生成!即使在释放阻力时,也会产生下一个阻力C# 鼠标拖动Unity3D时如何执行连续动作?,c#,unity3d,C#,Unity3d,我的场景中有一个对象,当鼠标向上拖动时,我想在现有对象的上方实例化一个新对象,如果仍然发生向上拖动,我想实例化第三个对象,第四个对象也是如此。但是,例如,如果在生成第二个对象时立即停止向上拖动,则在下次向上拖动之前不应生成下一个对象 鼠标向下拖动则相反,首先,应该删除第四个对象(在顶部),当仍然向下拖动时,也应该删除第三个对象,等等。。。直到第一个对象。而且,如果在删除第四个对象后立即停止向下拖动,则在下次向下拖动之前,不应删除下一个对象 下面是我为拖动机制编写的代码,但是当拖动时,所有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上分布对象通过鼠标拖动,通常使用多段线或贝塞尔曲线标记路径,然后沿该路径分布对象。或者,如果是更简单的对象分布,则仅在最小距离(通常为半径)后生成另一个对象从最后一个对象,而不是基于时间或延迟的解决方案。--时间/延迟实际上是正确方法的情况非常非常罕见。