我有两个课程:static TimeManager
和ball
,其中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&#39;时,else
中的ball.cs
语句并不总是执行。我相信这是因为执行时间很快。
答案 0 :(得分:1)
看看你的方法有点解释你的问题。
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。所以在下一帧,你再次进行Timer动作。
结果,只有一帧没有进行操作。最后,你似乎只看到物品在移动而且永不停止。
isMoving需要通过另一个条件来设置,而不是假的。
编辑:当你描述预期的效果时,我不明白为什么你要使用这个逻辑。看来你的球总是要移动,然后我不明白为什么你需要重置。从我看来,你需要创造一个锯齿波。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到2的0到2。