1 回答

TA貢獻1744條經驗 獲得超4個贊
你在向量 3 的 y 方向得到了速度 x
if (Direction == "U")
{
rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveUp);
}
if (Direction == "D")
{
rb.velocity = new Vector3(rb.velocity.x, DragonSpeed * MoveDown);
}
當您覆蓋后續(xù)語句中的值時,它在您的播放器腳本中起作用。
float MoveSide = Input.GetAxis("Horizontal"); //eg 1
float MoveVert = Input.GetAxis("Vertical"); // eg 1
// setting your x velocity incorrectly to the y (vert) velocity speed and keeping y the same velocity as start of frame
rb.velocity = new Vector3(Speed * MoveVert, rb.velocity.y);
// Set the y to the x value of the statement above so it is now in the correct vector and set the x to the correct hoz velocity
rb.velocity = new Vector3(Speed * MoveSide, rb.velocity.x);
// effectively doing
rb.velocity = new Vector3(Speed * MoveSide, Speed * MoveVert);
您還應該使用 MovePosition,因為它不會直接影響物理引擎(使用速度可能會對碰撞和觸發(fā)器產生連鎖反應并產生意想不到的物理效果)。您的游戲對象必須被標記為運動學,否則下面的內容將導致它們立即傳送到新位置。
var movementDirection = new Vector3(Speed * MoveSide, Speed * MoveVert);
rb.MovePosition(transform.position + movementDirection * Time.deltaTime);
并且 * Time.deltaTime 確保移動對于不同的幀率是一致的。如果您在 30 fps 的機器上運行游戲,游戲對象的移動速度將低于 60 fps。Time.deltaTime 計算自上一幀以來經過的物理時間,并確保無論幀速率如何,行進的距離都是相同的。
例如,假設游戲對象每幀更新移動 1 次。在 30 fps 的機器上一秒鐘后,物體將移動 30。在 60 fps 的機器上一秒鐘后,物體將移動 60。
Time.deltaTime=.2s on 30 fps so 1 movement * .2 = move .2 per frame * 30 frames in the second = 60 moved
Time.deltaTime=.1s on 60 fps so 1 movement * .1 = move .1 per frame * 60 frames in the second = 60 moved
- 1 回答
- 0 關注
- 153 瀏覽
添加回答
舉報