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

Unity 2D游戏地板按键后错位回弹及角色滑行问题求助

Unity 2D游戏问题排查与修复

问题

开发2D游戏时遇到两个异常:

  • 按下A/D键(左右移动)时,地板会突然弹回初始位置
  • 角色在平台上无法正常行走,呈现滑行状态

相关代码(视差滚动脚本)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParralaxBackround : MonoBehaviour {

    [SerializeField] private Vector2 parallaxEffectMultiplier;

    private Transform cameraTransform;
    private Vector3 lastCameraPosition;
    private float textureUnitSizeX;

    private void Start () {
        cameraTransform = Camera.main.transform;
        lastCameraPosition = cameraTransform.position;
        Sprite sprite = GetComponent<SpriteRenderer>().sprite;
        Texture2D texture = sprite.texture;
        textureUnitSizeX = texture.width / sprite.pixelsPerUnit;
    }

    // Update is called once per frame
    private void LateUpdate()
    {
        Vector3 deltaMovement = cameraTransform.position - lastCameraPosition;
        transform.position += new Vector3(deltaMovement.x * parallaxEffectMultiplier.x, deltaMovement.y * parallaxEffectMultiplier.y);
        lastCameraPosition = cameraTransform.position;

        if (Mathf.Abs(cameraTransform.position.x - transform.position.x) >= textureUnitSizeX)
        {
            float offsetPositionX = (cameraTransform.position.x - transform.position.x) % textureUnitSizeX;
            transform.position = new Vector3(cameraTransform.position.x + offsetPositionX, transform.position.y);
        }
    }
}

修复方案

1. 地板弹回问题修正

问题出在视差滚动的位置重置逻辑上:原代码中计算偏移后直接将地板位置绑定到相机位置,导致地板突然跳转产生弹回效果。替换LateUpdate中的重置逻辑为以下代码,通过累加纹理单位长度实现无缝滚动,避免位置突变:

private void LateUpdate()
{
    Vector3 deltaMovement = cameraTransform.position - lastCameraPosition;
    transform.position += new Vector3(deltaMovement.x * parallaxEffectMultiplier.x, deltaMovement.y * parallaxEffectMultiplier.y);
    lastCameraPosition = cameraTransform.position;

    float distanceX = cameraTransform.position.x - transform.position.x;
    if (Mathf.Abs(distanceX) >= textureUnitSizeX)
    {
        // 按纹理单位长度偏移,保持无缝滚动
        float moveOffset = Mathf.Sign(distanceX) * textureUnitSizeX;
        transform.position += new Vector3(moveOffset, 0);
    }
}

2. 角色滑行问题修复

滑行通常由物理参数或地板运动异常导致,可从以下几点排查:

  • 调整角色刚体参数:选中角色的Rigidbody2D,适当提高**Linear Drag(线性阻尼)**的值(建议0.5-1),让角色移动后能快速停下
  • 设置地板物理材质:创建Physics Material 2D,将**Friction(摩擦力)**设为0.5以上,赋值给地板的Collider2D组件,增加角色与地板的摩擦力
  • 确保地板平滑移动:修复地板弹回问题后,若仍有滑行感,检查视差脚本的移动帧率,确保LateUpdate内的位置更新连续平滑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:25