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
相关产品推荐
相关产品推荐

