在Unity游戏中以速度拖动不等于分辨率

时间:2015-11-19 19:39:12

标签: c# android unity3d touch screen-resolution

我正在Unity中做一个游戏,它是一个太空射击游戏,我制作了一个移动我的宇宙飞船的脚本。这个游戏是为Android设备开发的,我正在用Touch移动这个游戏。这就像把船拖到你想要的位置。另外一个人必须注意,我不考虑你是否触摸船的中心以便拖动它。 但是我有问题,根据我工作的设备,船没有正确跟踪拖拽,例如,如果我在平板电脑上,如果我用手指移动,让我们说3英寸,我的船只是移动一个。但是,在我的移动设备上它工作正常。

我做错了什么?我附上了运动的代码:

void MovePlayer (Vector3 movement)
{
    GetComponent<Rigidbody> ().velocity = movement;
    GetComponent<Rigidbody> ().position = new Vector3 
        (Mathf.Clamp (GetComponent<Rigidbody> ().position.x, boundary.xMin, boundary.xMax), 
         0.0f, 
         Mathf.Clamp (GetComponent<Rigidbody> ().position.z, boundary.zMin, boundary.zMax));
    GetComponent<Rigidbody> ().rotation = Quaternion.Euler 
        (0.0f, 
         0.0f, 
         GetComponent<Rigidbody> ().velocity.x * -tilt);
}

void FixedUpdate ()
{
    if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Moved) {

        // Get movement of the finger since last frame
        Vector2 touchDeltaPosition = Input.GetTouch (0).deltaPosition;

        float moveHorizontal = touchDeltaPosition.x;
        float moveVertical = touchDeltaPosition.y;

        Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical) * speedMouse;
        MovePlayer (movement);
    }
}

提前多多谢意和最好的问候

2 个答案:

答案 0 :(得分:7)

触摸positiondeltaPosition以像素为单位,因此您无法假设结果在不同分辨率下保持一致。

根据您的设计需求,有几种方法可以缓解这种情况......

您可以将触摸deltaPosition表示为屏幕分辨率的一小部分:

float screenSize = Mathf.Max(Screen.width, Screen.height);
Vector2 touchDeltaPosition  = Input.GetTouch(0).deltaPosition;
Vector2 touchDeltaPercentage = touchDeltaPosition / screenSize;

//touchDeltaPercentage values will now range from 0 to 1
//you can use that as you see fit

您可以使用主摄像头将屏幕坐标转换为世界位置,然后检查它们之间的差异:

Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;

Vector3 screenCenter = new Vector3(Screen.width * 0.5f, Screen.height * 0.5f, 1f);
Vector3 screenTouch = screenCenter + new Vector3(touchDeltaPosition.x, touchDeltaPosition.y, 0f);

Vector3 worldCenterPosition = Camera.main.ScreenToWorldPoint(screenCenter);
Vector3 worldTouchPosition = Camera.main.ScreenToWorldPoint(screenTouch);

Vector3 worldDeltaPosition = worldTouchPosition - worldCenterPosition;

//worldDeltaPosition now expresses the touchDelta in world-space units
//you can use that as you see fit

无论采用哪种方法,都需要一些与屏幕分辨率无关的单位。

与上述类似,您还可以使用主摄像头对地形,大型平面或场景中的其他一些对撞机进行光线投射。

答案 1 :(得分:2)

这里的问题是你使用的是speedMouse变量。速度应该与此完全无关,这将是你的问题的确切原因。您应该仅根据触摸/鼠标的位置移动对象。没有速度。因为速度是唯一会使输出与交叉分辨率不同的东西。

以这种方式思考,如果您的速度是10像素/秒,您将在更密集的屏幕上移动更慢,但是如果您只是根据屏幕上的位置更新位置,速度将永远不会有所不同。