声明获胜';t执行,因为CPU同时执行

本文关键字:执行 因为 CPU 获胜 声明 | 更新日期: 2023-09-27 18:28:40

我有两个类:static TimeManagerball,其中ball依赖于TimeManager

TimeManager.cs:

void FixedUpdate()
{
    if (isMoving) Timer();
    else
    {
        //isMoving = true;   //<- When I uncomment this, the problem occurs
    }
}
void Timer()
{
    currentTimeMove += Time.deltaTime * TimeDeductSpeed;
    if (currentTimeMove >= timeToMove)
    {
        isMoving = false;
        currentTimeMove = 0;
        perc = 0;
    }
    else perc = currentTimeMove / timeToMove;            
}

Ball.cs:

void FixedUpdate() => MovePerBlock();
void MovePerBlock()
{
    if (TimeManager.ins.isMoving)
        transform.localPosition = Vector3.Lerp(startPosition, endPosition, TimeManager.ins.perc);
    else //<- This statement does not execute when TimeManager.isMoving = true is uncommented
    {
        startPosition = transform.localPosition;
        endPosition = startPosition + transform.forward;
    }
}

每个ball实例上的移动将取决于TimeManager。它们一起移动和停止。如果我等到它们停止移动,然后在检查器处手动设置isMoving,甚至重复相同的操作,脚本就可以正常工作。

当我取消注释"isMoving=true"时,ball.cs中的else语句并不总是执行。我相信这是因为执行时间很快。

声明获胜';t执行,因为CPU同时执行

查看您的方法可以解释您的问题。

void FixedUpdate()
{
    if (isMoving) Timer();
    else // this is same as else if(isMoving == false)
    {
        //isMoving = true;   //<- When I uncomment this, the problem occurs
    }
}

当isMoving为true时,会调用Timer方法。在Timer中,您可以执行一些操作,在某个时刻,当操作完全完成时,Timer会将isMoving设置为false。

但在下一帧中,Timer方法将isMoving设置为false(else语句),在else语句中,isMoving被设置为true。所以,就在下一帧,您将再次执行计时器操作。

因此,只有一个帧没有执行该操作。最后,你似乎只看到物品在移动,从未停止过。

isMoving需要通过另一个条件来设置,而不是通过自身为false来设置。

编辑:当你描述预期效果时,我不明白你为什么要使用这种逻辑。你的球似乎总是要移动的,那么我不明白你为什么需要重置。在我看来,你需要创造一个锯齿波。

public float amplitude = 2f;
public float period = 2f;
void Update(){
    float tOverP = Time.time / period;
    float result = (tOverP - Mathf.Floor(tOverP)) * amplitude;
    Debug.Log (result);
}

有了这个过程,你不需要重置任何东西,你可以继续跳下去。perc变量是结果变量。

振幅是你想要的运动大小。使用此设置,它将从0变为2。周期变量定义从0到振幅的持续时间。因此,使用此设置,在2秒内从0到2。