我有一個游戲,其中角色只能水平和垂直移動,而不是對角線。
我試圖用這段代碼來實作這一點,它應該檢查播放器是向下/向上還是向左/向右:
if (Input.GetKey("down"))
{
moveHor = false;
moveVer = true;
if(moveVer == true)
{
transform.Translate(Vector3.down * Time.deltaTime * speed);
}
}
if (Input.GetKey("up"))
{
moveHor = false;
moveVer = true;
if (moveVer == true)
{
transform.Translate(Vector3.up * Time.deltaTime * speed);
}
}
if (Input.GetKey("right"))
{
moveVer = false;
moveHor = true;
if(moveHor == true)
{
transform.Translate(Vector3.right * Time.deltaTime * speed);
}
}
if (Input.GetKey("left"))
{
moveVer = false;
moveHor = true;
if (moveHor == true)
{
transform.Translate(Vector3.left * Time.deltaTime * speed);
}
}
此代碼在 Update() 方法中運行。
問題是,它不起作用,我不知道為什么。
我希望有人知道該怎么做。
uj5u.com熱心網友回復:
嘗試使用 else-if 在每個更新周期僅向一個方向平移。我還從您的代碼中洗掉了嵌套的 if 陳述句,這些陳述句是多余且不需要的。
if (Input.GetKey("down"))
{
moveHor = false;
moveVer = true;
transform.Translate(Vector3.down * Time.deltaTime * speed);
}
else if (Input.GetKey("up"))
{
moveHor = false;
moveVer = true;
transform.Translate(Vector3.up * Time.deltaTime * speed);
}
else if (Input.GetKey("right"))
{
moveVer = false;
moveHor = true;
transform.Translate(Vector3.right * Time.deltaTime * speed);
}
else if (Input.GetKey("left"))
{
moveVer = false;
moveHor = true;
transform.Translate(Vector3.left * Time.deltaTime * speed);
}
uj5u.com熱心網友回復:
在這種情況下,您可以讀取所有鍵,并將它們相互歸零。這意味著當按下兩個鍵(例如左和右)時,角色將停止水平移動。
我們還會查看處理順序,因此我們不會執行不必??要的計算。我們通過在鏈中盡可能晚地執行 Vector2/3 計算來做到這一點,因為這些結構通常有 2 或 3 個部分。
我們剩下的是:
private void Update ( )
{
var movement = Vector3.zero;
if ( Input.GetKey ( "left" ) )
movement.x -= -1;
if ( Input.GetKey ( "right" ) )
movement.x = 1;
if ( Input.GetKey ( "down" ) )
movement.y -= 1;
if ( Input.GetKey ( "up" ) )
movement.y = 1;
// If both movement.x and movement.y are not equal to zero, zero out the horizontal, leaving the vertical.
if ( movement.x != 0 && movement.y != 0 )
movement.y = 0;
// multiply the vector last for performance.
transform.Translate ( speed * Time.deltaTime * movement );
}
uj5u.com熱心網友回復:
您可以通過使用和配置 2D 軸而不是按鈕來簡化很多事情
var input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical");
if(input.x > input.y)
{
input.y = 0;
}
else
{
input.x = 0;
}
moveVer = Mathf.Approximately(input.y, 0);
moveHor = Mathf.Approximately(input.x, 0);
if(moveHor || moveVer)
{
transform.Translate(input.normalized * speed * Time.deltaTime);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533269.html
標籤:C#unity3d
