根据分辨率,在 Unity 游戏中拖动速度不相等
Drag with speed in Unity game not equal depending on resolution
我正在用 Unity 做一个游戏,它是一个 space 射击游戏,我已经制作了一个脚本来移动我的 space 飞船。此游戏是为 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);
}
}
在此先致谢并致以最诚挚的问候
触摸 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
无论哪种方法,关键是您需要一些与屏幕分辨率无关的单位。
与上述类似,您也可以使用主相机对场景中的地形、大型飞机或其他碰撞器进行光线投射。
这里的问题是您正在使用 speedMouse
变量。速度应该与此完全无关,这将是您出现问题的确切原因。您应该仅根据 touch/mouse 的位置移动对象。不是速度。因为速度是唯一使您的输出与交叉分辨率不同的因素。
这样想,如果你的速度是 10 pixels/second 你会在更密集的屏幕上移动得更慢,但是如果你只是根据屏幕上的位置更新位置,速度永远不会不同.
我正在用 Unity 做一个游戏,它是一个 space 射击游戏,我已经制作了一个脚本来移动我的 space 飞船。此游戏是为 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);
}
}
在此先致谢并致以最诚挚的问候
触摸 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
无论哪种方法,关键是您需要一些与屏幕分辨率无关的单位。
与上述类似,您也可以使用主相机对场景中的地形、大型飞机或其他碰撞器进行光线投射。
这里的问题是您正在使用 speedMouse
变量。速度应该与此完全无关,这将是您出现问题的确切原因。您应该仅根据 touch/mouse 的位置移动对象。不是速度。因为速度是唯一使您的输出与交叉分辨率不同的因素。
这样想,如果你的速度是 10 pixels/second 你会在更密集的屏幕上移动得更慢,但是如果你只是根据屏幕上的位置更新位置,速度永远不会不同.