2017-08-28 121 views
1

我正在寫一個3D國際象棋遊戲,因爲它幫助我學習Unity。我正試圖在鼠標中鍵被按下時實現相機拖動。下面的代碼做到這一點,但問題是,它的速度慢:在Unity 3D中添加相機拖動

bool wasDraggingCamera = false; 
Vector3 lastScreenMousePosition; 
Ray lastMousePosition; 

void Update() 
{ 
    UpdateDrag(); 
} 

void UpdateDrag() 
{ 
    var willDragCamera = wasDraggingCamera; 
    wasDraggingCamera = Input.GetMouseButton(2); 
    var mousePosition = Camera.main.ScreenPointToRay(Input.mousePosition); 
    if (willDragCamera && Input.mousePosition != lastScreenMousePosition) 
     transform.position = transform.position - (mousePosition.origin - lastMousePosition.origin); 
    lastScreenMousePosition = Input.mousePosition; 
    lastMousePosition = mousePosition; 
} 

你看,主要問題是,相機在世界空間上的兩個點之間的增量是非常小的取決於你有多遠從主題國際象棋棋盤,但放大它乘以(mousePosition.origin - lastMousePosition.origin)的產品實際上會導致例如指數速度增加。我不太清楚,但有人可以幫我弄清楚,實際上我可以通過上面的代碼來增加拖動發生的速度嗎?我在這裏有點難過。

+0

怎麼樣從板的距離的一些線性係數乘以增量?所以你離它越遠,delta乘數就越大。或更好,但只是基於[屏幕座標](https://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html)移動相機位置,而不是世界座標。 – ryeMoss

回答

0

我想通了一些更簡單的邏輯:

Vector3 lastDragPosition; 

void Update() 
{ 
    UpdateDrag(); 
} 

void UpdateDrag() 
{ 
    if (Input.GetMouseButtonDown(2)) 
     lastDragPosition = Input.mousePosition; 
    if (Input.GetMouseButton(2)) 
    { 
     var delta = lastDragPosition - Input.mousePosition; 
     transform.Translate(delta * Time.deltaTime * 0.25f); 
     lastDragPosition = Input.mousePosition; 
    } 
}