[英]How to move an object between two points in Unity?
我正在嘗試使用lerp
功能向上,向下,向下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;
}
}
}
我一直在嘗試將問題縮小到無濟於事,所以任何幫助將不勝感激。
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()
,因此(Time.time - startTime) * speed
將始終保持不變,因此distCovered
永遠不會改變,因此fracJourney
永遠不會改變,因此fracJourney <= 1
永遠不會改變,因此您將永遠陷入困境。
如果您正在尋找修復程序,幾乎不需要while
Update()
函數內部進行while
循環。 使用Update()
函數本身作為循環,或者使用IEnumerator
,在其中您可以屈服並讓幀通過,例如:
public IEnumerator MyLoop()
{
while (fracJourney <= 1)
{
float distCovered = (Time.time - startTime) * speed;
fracJourney = distCovered / journeyLength;
Debug.Log(fracJourney);
transform.position = Vector3.Lerp(startPoint, endPoint, speed);
yield return null; //< --- yield out and let a frame pass
}
}
您在這里遇到了多個問題。
首先是您在lerp函數內部使用了循環。 直到循環結束 ,游戲才會更新渲染輸出。 循環是否無限是無關緊要的,它不會只執行一次迭代,而是會執行所有迭代(這也沒有幫助Time.time
在此過程中不變)。
其次,您正在計算從應用程序 開始而不是當前移動開始的距離量。
第三,您要調用Vector3.lerp(),並向其傳遞第三個參數(“ float-percentage”),該參數的值不是speed
而是應該計算的分數。 例如Vector3.Lerp(startPoint, endPoint, 0.5f);
將返回startPoint
和endPoint
之間的中點。
第四,沒有理由使用四種方法來控制動畫。 您只需要一個,但是您也必須將其傳遞給所需的目的地(而不是使用四個暗示不同目的地的方法)。
第五,盡管先前endPoint
計算為startPoint + distance
(盡管這是new Vector3(0,0,50)
是一個距離!),但您journeyLength
將journeyLength
計算為startPoint
和endPoint
之間的距離。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.