Unity 物体移动碰撞抖动(原因和解决方法)

一、在解决这个问题前需要先看一下MonoBehaviour的生命周期(注意一下FixedUpdate和Update的顺序):
请添加图片描述
二、原因分析
移动物体加刚体后,在Update中碰撞体跟着物体进行了移动,那么这一次的生命周期循环里,Update之后没有物理判断了。这一帧的画面渲染出来的时候,物体碰撞体是嵌入了墙体。而在下一帧的FixedUpdate进行了物理判断,发现碰撞体是嵌入的。那么按照物理规则,物理引擎把物体给弹出来保证物理正确。这样也就导致我们看到物体发生碰撞时抖动。

三、解决方法
方法一:
FixedUpdate是固定帧,每一帧的时间相同,FixedUpdate控制移动逻辑(LateUpdate控制相机跟随),如下:

 	bool move = false;
    void Update()
    {
        if (!move) return;

        float speed = 10f;//移动速度

        transform.position += transform.forward * speed * Time.deltaTime;
    }

方法二:
如果一定要在Update方法里处理移动,那么可以按下面这样处理:

	bool move = false;
    void Update()
    {
        if (!move) return;

        float speed = 10f;//移动速度
        float radius = 0.58f;//物体碰撞半径

        Vector3 from = transform.position;
        Vector3 interpolation = transform.forward * radius;
        Vector3 dis = transform.forward * speed * Time.deltaTime;
        Vector3 to = from + interpolation +  dis;

        //Debug.DrawLine(from, to, Color.red);
        RaycastHit rh;
        if (Physics.Linecast(from, to, out rh, LayerMask.GetMask("Terrain")))
        {
            dis = rh.point - from - interpolation;
        }

        transform.position += dis;
    }

方法三:
使用CharacterController控件,使用方法可以看一下CharacterController

### Unity 2D角色移动上下抖动问题的解决方案 在Unity 2D开发中,当角色左右移动出现上下抖动现象,通常是由多种因素引起的。以下是可能的原因及其对应的解决方案: #### 1. **相机跟随脚本设置不当** 如果相机跟随目标物体的方式不恰当,可能会导致画面抖动。例如,在更新逻辑中未正确处理浮点运算误差或帧率变化的影响。 - 使用`LateUpdate()`方法来实现相机跟随逻辑可以有效缓解此问题,因为`LateUpdate()`会在所有物理计算完成后执行[^2]。 ```csharp public class CameraFollow : MonoBehaviour { public Transform target; public float smoothSpeed = 0.125f; void LateUpdate() { Vector3 desiredPosition = new Vector3(target.position.x, target.position.y, transform.position.z); Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed); transform.position = smoothedPosition; } } ``` #### 2. **像素对齐问题** 对于基于像素的艺术风格游戏来说,角色位置的小幅偏移可能导致渲染结果模糊不清,从而造成视觉上的抖动感。可以通过强制使对象的位置保持整数值的方法解决这一问题。 ```csharp void UpdatePosition(ref Vector3 pos) { pos.x = Mathf.Round(pos.x); pos.y = Mathf.Round(pos.y); } ``` #### 3. **碰撞器配置不合理** 有,刚组件与地面或其他障碍物之间的交互也会引发不必要的垂直方向微调动作,进而引起显示异常。调整接触检测模式以及摩擦系数有助于改善这种情况[^3]。 - 将Rigidbody2D的Interpolate属性设为Interpolate或者Extrapolate可以帮助平滑瞬态运动轨迹。 - 同确保TilemapCollider2D等静态元素具有足够的精度覆盖范围以避免间隙效应。 #### 4. **动画曲线设计缺陷** 假如正在使用的骨骼动画包含了某些特定的关键帧数据(如您提到的BakeIntoPose相关参数),它们也许会对最终呈现效果产生干扰作用。尽管如此,由于这些特性主要适用于三维环境下的应用场合,因此其实际效能在二维条件下未必能够正常现出来[^1]。 综上所述,针对上述每种可能性逐一排查并修正相应部分应该能彻底消除所遇到的角色晃动难题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值