我統一創建了一個游戲,玩家可以使用箭頭鍵在地圖上移動并使用滑鼠更改方向,但是我試圖讓相機在玩家按住空格鍵但繼續向前移動時回頭看.
所以有這段代碼可以將相機旋轉 180 度,但如果我按住空格鍵閃爍,就好像它在面向前方和面向后方之間切換一樣。我如何阻止這種情況發生?
private void Update()
{
if (Input.GetKey(KeyCode.Space) && !globalScript.lookBack)
{
globalScript.lookBack = true;
transform.Rotate(new Vector3(14, 180, 0));
}
else {
globalScript.lookBack = false;
}
}
我還試圖讓玩家即使在相機向后看時也總是向前移動(我已經將我的玩家設定為朝著相機所面對的方向移動)所以換句話說,當玩家回頭看時,他們仍然在移動與攝像機朝前時他們移動的方向相同。
我想出這個來根據我認為正在作業的相機在前進和前進之間切換,但我認為沒有正確訪問回溯,我不知道為什么。
Vector3 moveDir;
if (globalScript.lookBack)
{
moveDir = Quaternion.Euler(0f, targetAngle, 0f) * -Vector3.forward;
}
else
{
moveDir = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
}
controller.Move(moveDir.normalized * playerMoveSpeed * Time.deltaTime);
我該如何解決這個問題,以便我在向后看時仍然可以向前移動?
uj5u.com熱心網友回復:
您的第二個塊幾乎每幀都會觸發,包括沒有按下任何幀空間以及任何globalScript.lookBack真實的幀。您需要確保它僅在兩者都lookBack為真且未按下空間時觸發。
似乎還存在一個問題,即您的旋轉沒有恢復到以前的位置。如果您改用四元數,這將變得很容易。您可以使用Quaternion.Inverse來反轉您為轉身所做的旋轉,然后將其應用于旋轉
共:
private void Update()
{
Quaternion halfRot = Quaternion.Euler(14, 180, 0);
if (Input.GetKey(KeyCode.Space))
{
if (!globalScript.lookBack)
{
globalScript.lookBack = true;
transform.rotation *= halfRot;
}
}
else if (globalScript.lookBack) {
globalScript.lookBack = false;
transform.rotation *= Quaternion.Inverse(halfRot));
}
}
或者,使用更“平衡”的格式:
private void Update()
{
Quaternion halfRot = Quaternion.Euler(14, 180, 0);
if (Input.GetKey(KeyCode.Space))
{
if (!globalScript.lookBack)
{
globalScript.lookBack = true;
transform.rotation *= halfRot;
}
}
else
{
if (globalScript.lookBack) {
{
globalScript.lookBack = false;
transform.rotation *= Quaternion.Inverse(halfRot));
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/425053.html
