我正在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);
}
}
提前多多谢意和最好的问候
答案 0 :(得分:7)
触摸position
和deltaPosition
以像素为单位,因此您无法假设结果在不同分辨率下保持一致。
根据您的设计需求,有几种方法可以缓解这种情况......
您可以将触摸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像素/秒,您将在更密集的屏幕上移动更慢,但是如果您只是根据屏幕上的位置更新位置,速度将永远不会有所不同。