Unity - 通过鼠标/触摸拖动RigidBody2D Gameobject的最佳方式

时间:2016-11-22 20:37:25

标签: c# unity3d touch drag breakout

我正在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;
}

1 个答案:

答案 0 :(得分:0)

我建议您使用鼠标的位置对x和y轴值进行平移,因为它是通过鼠标的位置值与它之间的相减差来拖动的。 #39;首先被压下来。

总结如下:

  1. 将2D矢量存储为私有字段,称为previousPos(所以 mousedown和mousemove都可以​​访问它)并将其值设置为鼠标当前位置的结果。
  2. 在鼠标拖动功能中,再次获取鼠标位置并指定 值为一个名为currentPos的2D向量,并从中减去 previousPos,它为您提供设置的x和y轴值 paddle的变换位置为。
  3. 然后在拖动功能结束时更新previousPos,然后 为它分配currentPos的值,以便下次绕过它 给出了新的变化,而不是汇总的变化。
  4. *您可能希望有一个布尔值,当鼠标停止时您将其设置为true,并且在拖动结束时将其设置为false。在拖动中使用该bool作为检查,以查看是否需要首先设置桨位置(如果布尔值为真,则仅设置桨位置) - 不确定是否通过仅触发鼠标拖动来为此执行此操作鼠标是否已关闭。

    代码中的一个例子:

    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
    }