2014-10-31 44 views
0

我正在製作2D空間射擊遊戲。我正在設置一個邊界,以便船舶不會離開屏幕。您可以通過傾斜手機來移動該船。我有一個shipController.cs附加到我的ship對象。這是我的固定更新功能:使用Mathf.Clamp統一綁定

public float xMin, xMax, yMin, yMax; 
void FixedUpdate() 
{ 
    //tilt to move ship 
    transform.Translate(Input.acceleration.x * speed, Input.acceleration.y * speed, 0); 

    //create boundries 
    rigidbody2D.position = new Vector2(
     Mathf.Clamp(rigidbody2D.position.x, xMin, xMax), 
     Mathf.Clamp(rigidbody2D.position.y, yMin, yMax) 
    ); 
} 

最小值和最大值在unity inspector中定義。 如果您在PC上測試,此代碼效果很好。但是,當出口到手機,運動是非常緊張和毛刺。這艘船將進入邊界並開始跳躍。傾斜時的運動也不是很平滑。有沒有其他方法可以使這個更平滑?

回答

2

嘗試將您的代碼更改爲Update而不是FixedUpdate。我猜測在固定更新之間調用了多個更新。出於這個原因,該船在多個框架上首先越過邊界,然後在下一個固定更新時返回。

使用Update時,您需要自己處理增量時間。否則速度在不同的fps下會有所不同。這可以通過簡單地將速度DeltaTime相乘來完成:

public float xMin, xMax, yMin, yMax; 
void Update() 
{ 
    //tilt to move ship 
    transform.Translate(Input.acceleration.x * speed * Time.DeltaTime, Input.acceleration.y * speed * Time.DeltaTime, 0); 

    //create boundries 
    transform.position = new Vector2(
     Mathf.Clamp(transform.position.x, xMin, xMax), 
     Mathf.Clamp(transform.position.y, yMin, yMax) 
    ); 
} 

DeltaTime相乘後的speed值大概是這樣太小。所以你需要花一些時間爲它找到合適的價值。

+0

這確定了船在移動時的順利問題,但一旦碰到邊界,它仍然是跳躍式的。我確實改變了它來更新。 – Doctor06 2014-10-31 20:08:21

+0

沒有看到跳躍,我的下一個猜測是'transform.Translate'直接影響位置,但'rigidbody2D.position'被髮送到物理引擎,但更新的結果在下一幀中看到。嘗試將'rigidbody2D.position'改爲'transform.position'。我編輯了原始答案中的代碼以符合此。 – maZZZu 2014-10-31 21:13:35

+0

這真是太神奇了。那工作完美。我不相信我沒有嘗試過。我想這就是你長時間盯着代碼所得到的結果。謝謝。 – Doctor06 2014-11-01 04:07:59