游戏开发小结——在Unity中创建RTS和策略游戏的滚动地图
使用屏幕鼠标位置在地图上移动(像文明或星际争霸那样)。
在战略和RTS游戏中,玩家可以通过将鼠标指针放在游戏窗口的边缘附近来查看地图:这样做,摄像机就会在选定的x轴和z轴方向上开始滚动。这对于这种类型的游戏非常重要,而且很容易实现。
要实现这一点,有一些需要记住的事情。首先,这种滚动效果只有在光标接近窗口边缘时才会发生。因此,我们需要设置一些边界来开始滚动。对于这些边界,我们将给它们的值设置为0到0.5之间,因为我们将考虑它们作为视口(也就是屏幕大小)的百分比。
然后,我们需要获取鼠标位置,使用Input.MousePosition。需要记住的重要事情是,Input.MousePosition在屏幕空间中给出鼠标位置,而我们需要在视口空间中使用它。这就是摄像机的作用:Unity中的摄像机可以处理不同世界空间之间的转换。在这种情况下,我们可以使用Camera.ScreenToViewportPoint方法将屏幕空间转换为视口空间。
最后,将视口空间中的光标位置与所选边界进行比较,并相应地滚动地图:我们的摄像机系统完成了!
代码非常简单并带有大量注释,随意使用:
public class MouseScreenScroller : MonoBehaviour
{
public Camera mCamera;
[Header("Settings")]
public float mCameraSpeed = 5f;
public Vector2 mBoundsTolerance = new Vector2(0.10f, 0.10f); //从边缘开始滚动
public bool bLockCameraOnStart = true; //限制相机于游戏屏幕
//缓存相机transform
private Transform _mCameraTransform;
//分配内存以避免GC
private Vector3 _mMousePosition;
private Vector3 _mCameraTranslation = new Vector3();
private void Start()
{
_mCameraTransform = mCamera.transform;
if (bLockCameraOnStart) {
Cursor.lockState = CursorLockMode.Confined;
}
}
//每帧调用一次Update
void Update()
{
_mCameraTranslation.x = 0f;
_mCameraTranslation.z = 0f;
// 交换y和z以协调不同的空间参考,例如,相机在地面上方俯瞰视角,因此我们只关心x和z轴。
_mMousePosition = mCamera.ScreenToViewportPoint(Input.mousePosition);
_mMousePosition.z = _mMousePosition.y;
_mMousePosition.y = 0f;
// 检查是否超出了屏幕? 如果是,则不移动。 如果光标被限制在游戏屏幕内,则不需要进行此操作。
if (_mMousePosition.x < 0f || _mMousePosition.x > 1f || _mMousePosition.z < 0f || _mMousePosition.z > 1f)
{
// 提前返回
return;
}
// 现在检查鼠标位置是否达到阈值。
//我们使用视口空间,它将屏幕内的坐标视为属于范围[0,1],因此我们可以将我们的边界视为百分比:
//如果鼠标位于屏幕最左边或最右边的X%,则需要将相机向该方向移动。
if(_mMousePosition.x < mBoundsTolerance.x)
{
_mCameraTranslation.x = -1f;
} else if (_mMousePosition.x > 1f - mBoundsTolerance.x)
{
_mCameraTranslation.x = 1f;
}
if (_mMousePosition.z < mBoundsTolerance.y)
{
_mCameraTranslation.z = -1f;
}
else if (_mMousePosition.z > 1f - mBoundsTolerance.y)
{
_mCameraTranslation.z = 1f;
}
_mCameraTransform.localPosition += Time.deltaTime * _mCameraTranslation * mCameraSpeed;
}
}