0

我正在 Unity 中创建一个 2D 游戏,并想看看是否有人对我如何改进下面的脚本有任何建议,我使用该脚本在突破/打砖块风格的游戏中拖动桨。我知道有更复杂的方法来拖动对象,但这对我来说没问题,但我遇到的唯一问题是,当我在移动设备上测试我的游戏时,拖动不是 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;
}
4

1 回答 1

0

我建议您使用鼠标的位置来翻译 x 和 y 轴值,因为它是通过鼠标第一次按下时鼠标的位置值之间的减去差异来拖动的。

总结将是:

  1. 将 2D 向量存储为私有字段,称为 previousPos(因此 mousedown 和 mousemove 都可以访问它)并将其值设置为鼠标当前位置的结果。
  2. 在鼠标拖动函数中,再次获取鼠标位置并将该值分配给一个名为 currentPos 的 2D 向量,然后从 previousPos 中减去该值,这将为您提供 x 和 y 轴值来设置桨的变换位置。
  3. 然后在拖动函数结束时更新 previousPos,并将 currentPos 的值分配给它,以便下次它给出新的变化而不是聚合变化。

*您可能希望在鼠标按下时将布尔值设置为 true 并在拖动结束时将其设置为 false。在拖动中使用该布尔值作为检查是否需要首先设置桨叶位置(如果布尔值为真,则仅设置桨叶位置) - 不确定统一是否通过仅触发鼠标拖动时为您执行此操作鼠标是否向下。

代码中的一个例子:

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
}
于 2016-11-22T21:07:20.050 回答