游戏开发小结——在Unity中创建RTS和策略游戏的滚动地图

文章介绍了如何在Unity中创建RTS和策略游戏的滚动地图功能,通过监听鼠标位置,当鼠标接近窗口边缘时,利用Camera.ScreenToViewportPoint方法将屏幕空间转换为视口空间,然后根据边界条件调整摄像机位置,实现地图滚动效果。代码示例展示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游戏开发小结——在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;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小云同志你好

谁能书阁下,白首太玄经

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值