繁体   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