我正在尝试使用统一的lerp
功能翻译棋子,然后向下翻译。但是,每当我触发此脚本时,整个会话都会冻结。
使用统一调试器,我已将问题缩小到这部分代码。
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
因为似乎没有任何变量在改变,因此整个循环是无限的。
以下是专门用于处理移动的整个代码段(向量值当前是任意的)。
public class MovePiece : MonoBehaviour {
Vector3 startPoint;
Vector3 endPoint;
float speed = 10;
float startTime;
private bool moving = false;
private bool up = false;
private bool across = false;
private bool down = false;
public void Start()
{
startPoint = gameObject.GetComponent<Transform>().position;
startTime = Time.time;
moving = true;
Debug.Log("Moving Piece");
}
void Update() {
if (!moving)
{
Destroy(this);
return;
}
moveManager();
}
void moveManager()
{
if (!up)
{
lerpUp();
return;
}
if (!across)
{
lerpAcross();
return;
}
if (!down)
{
lerpDown();
return;
}
}
private void lerpUp()
{
Debug.Log("Upwards");
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(0, 0, 50);
float journeyLength = Vector3.Distance(startPoint, endPoint);
float fracJourney;
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
up = true;
Debug.Log("Upwards Finished");
return;
}
private void lerpAcross()
{
Debug.Log("Across");
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(0, 50, 0);
float journeyLength = Vector3.Distance(startPoint, endPoint);
float fracJourney;
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
across = true;
Debug.Log("Across Finished");
return;
}
private void lerpDown()
{
Debug.Log("Down");
startPoint = gameObject.GetComponent<Transform>().position;
endPoint = startPoint + new Vector3(0, 0, -50);
float journeyLength = Vector3.Distance(startPoint, endPoint);
float fracJourney;
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
down = true;
Debug.Log("Down Finished");
moving = false;
Debug.Log("Moving Finished");
return;
}
}
}
我一直在努力将这个问题缩小,但无济于事,所以任何帮助都会受到高度赞赏。
答案 0 :(得分:2)
do
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
} while (fracJourney <= 1);
Update()
每帧只运行一次,而Time
只会更新一次,所以Time
永远不会改变Update()
,所以{{ 1}}将永远保持不变,因此(Time.time - startTime) * speed
永远不会改变,因此distCovered
永远不会改变,因此fracJourney
永远不会改变,所以你永远陷入循环。
如果您正在寻找修复,您几乎不需要fracJourney <= 1
函数内的while
循环。使用Update()
函数本身作为循环,或者使用Update()
,您可以放弃并让框架通过,如下所示:
IEnumerator
答案 1 :(得分:1)
你在这里遇到了不止一个问题。
首先,你在lerp函数中使用了一个循环。游戏不会更新渲染输出,直到循环结束。如果循环是无限的,它不重要,它不会只执行一次迭代,它将所有(它们也不会帮助Time.time
在此过程中不会发生变化)。
其次,您计算的移动距离是应用程序开始的距离,而不是当前移动的开始。
第三,您正在调用Vector3.lerp()向其传递第三个参数(&#34; float-percentage&#34;),其值为speed
而不是应该为的小数量计算。例如Vector3.Lerp(startPoint, endPoint, 0.5f);
将返回startPoint
和endPoint
之间的中点。
第四,没有理由使用四种方法来播放动画。你只需要一个,但你必须将它传递给所需的目的地(而不是有四个方法暗示不同的目的地)。
第五,尽管您之前已将journeyLength
计算为startPoint
,但您计算endPoint
为endPoint
与startPoint + distance
之间的距离( new Vector3(0,0,50)
是什么:距离!)