You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D:将键盘水平轴输入改为带宽度限制的触摸拖拽控制

实现移动端触摸拖拽的水平移动(带范围限制)

没问题,我帮你调整FixedUpdate()里的代码,完美实现移动端触摸拖拽控制,同时保留你原来的水平移动范围限制逻辑。下面是具体的实现方案:

首先,你需要在脚本类里添加几个私有变量,用来记录拖拽的状态和初始位置:

private Vector2 _touchStartScreenPos; // 触摸开始时的屏幕坐标
private float _playerStartWorldX;     // 触摸开始时玩家的世界X坐标
private bool _isDragging;             // 是否正在拖拽的标记

接下来,修改FixedUpdate()方法,替换原来的Input.GetAxis("Horizontal")逻辑,换成触摸拖拽的处理:

private void FixedUpdate()
{
    // 检测是否有触摸输入
    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);
        
        switch (touch.phase)
        {
            // 触摸开始:记录初始位置
            case TouchPhase.Began:
                _isDragging = true;
                _touchStartScreenPos = touch.position;
                _playerStartWorldX = transform.position.x;
                break;
            
            // 触摸移动:计算偏移并更新玩家位置
            case TouchPhase.Moved:
                if (_isDragging)
                {
                    // 计算触摸的水平偏移量(屏幕空间)
                    float touchDeltaX = touch.position.x - _touchStartScreenPos.x;
                    
                    // 将屏幕偏移转换为世界空间的移动量(系数可根据手感调整)
                    float worldMoveDelta = touchDeltaX * 0.01f;
                    
                    // 计算目标X位置,加上初始玩家X,再做范围限制
                    float targetX = _playerStartWorldX + worldMoveDelta;
                    targetX = Mathf.Clamp(targetX, -mapWidth, mapWidth);
                    
                    // 更新玩家位置(保持Y、Z轴不变)
                    transform.position = new Vector3(targetX, transform.position.y, transform.position.z);
                }
                break;
            
            // 触摸结束/取消:重置拖拽状态
            case TouchPhase.Ended:
            case TouchPhase.Canceled:
                _isDragging = false;
                break;
        }
    }
}

关键细节说明:

  • 相对拖拽逻辑:记录触摸开始时的玩家位置和触摸位置,确保拖拽是相对移动,不会出现玩家突然跳变的情况。
  • 屏幕到世界的转换系数:0.01f这个系数可以根据你的游戏分辨率和需求调整,数值越大拖拽灵敏度越高,反之越低。
  • 范围限制:通过Mathf.Clamp(targetX, -mapWidth, mapWidth)严格限制玩家的水平移动范围,和你原来的逻辑保持一致。
  • 拖拽状态管理:_isDragging标记确保只有在触摸开始后才处理移动,避免误触。

如果你的移动需要和物理系统交互(比如用Rigidbody),可以把位置更新改成修改Rigidbody的position,比如:

// 假设你有Rigidbody组件引用
_rb.position = new Vector3(targetX, _rb.position.y, _rb.position.z);

内容的提问来源于stack exchange,提问作者Justin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:07:12