Unity如何让物体缓慢移动?背景同时向多方向移动问题解决
问题根源
你当前的BackgroundMove()每次被调用时,会在同一帧内依次执行四个方向的等距位移:向右、向下、向左、向上。四个位移的移动距离完全相等,方向两两相反,单帧内的总位移矢量和为0,运行时只会出现无意义的微抖动,不可能产生定向移动的效果。
修正方法
根据你的实际移动需求调整即可,核心原则是同一时间只给背景施加你想要的移动方向的位移,不要同时调用反向的Translate。
场景1:固定方向持续移动(绝大多数滚动背景的需求)
直接删掉多余的三行反向位移代码,只保留你需要的移动方向即可。比如要做2D横版游戏常见的向左滚动背景,代码如下:
public float bgspeed = 1.5f; // 按实际需求调整速度,一般背景移动速度设1-3就有比较自然的缓慢效果 public void BackgroundMove(){ // 只保留目标方向的位移,比如要斜向移动就直接合成方向矢量,不要拆成多段反向调用 // 示例:向左缓慢移动 bg.transform.Translate(Vector3.left * Time.deltaTime * bgspeed); // 如果要斜向移动,比如朝左下方,直接写成: // bg.transform.Translate((Vector3.left + Vector3.down).normalized * Time.deltaTime * bgspeed); }
场景2:按固定路径循环移动(右→下→左→上循环走矩形路径)
如果你的需求是让背景按四个方向依次切换移动,而不是同一帧往四个方向动,需要加计时状态控制方向切换,不能每帧把四个方向都执行一遍,参考代码:
public float bgspeed = 1.5f; // 每个方向持续移动的时长,单位秒 public float singleDirectionDuration = 2f; private float _moveTimer; private int _currentDirIndex = 0; // 按顺序存储四个移动方向 private readonly Vector3[] _moveDirs = new []{ Vector3.right, Vector3.down, Vector3.left, Vector3.up }; public void BackgroundMove(){ _moveTimer += Time.deltaTime; // 达到单方向移动时长后,切换到下一个方向 if (_moveTimer >= singleDirectionDuration) { _moveTimer = 0f; _currentDirIndex = (_currentDirIndex + 1) % _moveDirs.Length; } // 仅按当前激活的方向移动 bg.transform.Translate(_moveDirs[_currentDirIndex] * Time.deltaTime * bgspeed); }
额外提示
如果是做无限滚动的背景,记得加视口边界判断,当背景完全移出相机视野后,把背景位置重置到滚动起点,避免背景位置坐标越来越大导致的精度问题。
内容的提问来源于stack exchange,提问作者user17833773
相关产品推荐
相关产品推荐

