2016-11-22 208 views
0

我在Unity中创建了2D游戏,并且想要查看是否有人有任何关于如何改进脚本的建议,一个突破/ arkanoid风格的游戏。我知道有更复杂的方法来拖动对象,但这对我来说确实很好,但我遇到的唯一问题是,当我在移动设备上测试我的游戏时,拖动不是100%锐利,而且当我停止拖动桨时似乎滞后曾经如此轻微。我的移动设备没有任何问题,因为我玩过从Play商店下载的其他分组游戏,并且拖动非常脆。Unity - 通过鼠标/触摸拖动RigidBody2D Gameobject的最佳方式

下面的脚本附在桨上。

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; 
} 
+0

不要你的意思'Camera.main.ScreenToWorldPoint'? –

回答

0

我会建议做你使用鼠标的位置的X轴和Y轴的值转换为它正在通过与鼠标的位置值是什么,因为它是第一个按下减去差拖累。

这方面的一个总结是:

  1. 存储2D向量作为私有字段,称为previousPos(所以 鼠标按下和鼠标移动既可以访问),并设置它的价值,鼠标的电流的结果位置。
  2. 在鼠标拖动功能,再次获得鼠标位置和 值分配给一个2D矢量称为currentPos并减去从 的previousPos,它给你的x和y轴的值来设置 桨的变换位置至。
  3. 然后在拖动函数结束时更新previousPos,并且 将currentPos的值赋给它,以便下次围绕它 给出新的更改而不是聚合的更改。

*您可能想要一个布尔值,当鼠标关闭并且拖动结束时将其设置为false时,您将设置为true。在拖动中使用该布尔作为检查来查看是否需要首先设置桨的位置(如果布尔值为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 
} 
+0

嗨,感谢您的建议,虽然我似乎有心理障碍,因为我无法弄清楚你的意思。你会善意证明这一点吗? – Kaz

+0

当然可以。更新了答案。 –

+0

非常感谢凯尔,我会试试这个。 – Kaz

相关问题