簡體   English   中英

Unity-通過鼠標/觸摸拖動RigidBody2D游戲對象的最佳方法

[英]Unity - best way to drag a RigidBody2D Gameobject by mouse/touch

我正在Unity中創建一個2D游戲,想看看是否有人對我如何改進腳本的建議,在該腳本下方我會在突破/ arkanoid風格的游戲中拖動槳葉。 我知道有更復雜的拖動對象的方法,但是對我來說這行得通,但是我遇到的唯一問題是,當我在移動設備上測試游戲時,拖動並非100%清晰,而當我停止拖動槳時似乎滯后曾經如此輕微。 我玩過從Play商店下載的其他突破游戲時,移動設備沒有任何問題,並且拖動非常清晰。

以下腳本已附加到槳上。

Vector3 dist;
float posX;
float posY;

void OnMouseDown(){
    dist = Camera.main.WorldToScreenPoint(transform.position);
    posX = Input.mousePosition.x - dist.x;
    posY = Input.mousePosition.y - dist.y;

}

void OnMouseDrag(){
    Vector3 curPos = new Vector3(Input.mousePosition.x - posX, Input.mousePosition.y - posY, dist.z);  

    Vector3 worldPos = Camera.main.ScreenToWorldPoint(curPos);

    transform.position = worldPos;
}

我建議您使用鼠標的位置進行x和y軸值的平移,因為它是通過第一次按下時鼠標位置值之間的差值減去而被拖動的。

總結如下:

  1. 將2D向量存儲為私有字段,稱為previousPos(因此mousedown和mousemove都可以​​訪問它),並將其值設置為鼠標當前位置的結果。
  2. 在鼠標拖動功能中,再次獲得鼠標位置,然后將該值分配給一個稱為currentPos的2D向量,並從previousPos中減去該值,這將為您提供x軸和y軸值,以將球拍的變換位置設置為該值。
  3. 然后在拖動功能的末尾更新previousPos,並為其分配currentPos的值,以便下次在它周圍給出新更改,而不是匯總更改。

*您可能想擁有一個布爾值,當鼠標按下時將其設置為true,在拖動結束時將其設置為false。 在拖動中使用該布爾值作為檢查對象,以檢查是否需要首先設置槳葉位置(如果布爾值為true,則僅設置槳葉位置)-不確定是否僅在以下情況下觸發鼠標拖動才能為您做到這一點鼠標是否按下。

代碼示例:

private Vector2 _previousPos;
private bool _isMouseDown;

void OnMouseDown(){
    _isMouseDown = true; //because we're in the on mouse down function
    _previousPos = Input.mousePosition; //get the current mouse position
}

void OnMouseDrag(){
    if(!_isMouseDown)
        return;

    Vector2 currentPos = Input.mousePosition; //get updated mouse pos 
    Vector2 paddlePos = currentPos - previousPos; //the delta change

    transform.position = paddlePos; //new paddle position

    _isMouseDown = false; //drag is complete, mouse btn is no longer down
    _previousPos = currentPos; //reset previous pos for next mouse move
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM