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

Unity2D多段蠕虫角色添加重力并保持段间距离约束的实现方法

2D蠕虫角色段间距离约束+重力实现方案

当前代码直接修改transform.position会绕过Rigidbody2D的物理模拟,导致重力完全失效。要同时保留重力和段间距离约束,有两种可靠方案:

方案一:使用Unity内置2D关节(推荐)

利用Unity物理系统的DistanceJoint2D或SpringJoint2D,无需手动编写跟随逻辑,物理引擎会自动处理重力和距离约束:

  • 给每个蠕虫段(包括头部)添加Rigidbody2D:
    • 开启Gravity Scale(默认1即可,可根据需求调整)
    • 设置合适的Mass(建议从0.5-1开始测试)
    • 可选添加Linear Drag和Angular Drag,让移动更平滑
  • 给每个非头部段添加DistanceJoint2D:
    • 将Connected Rigidbody设置为前一段的Rigidbody2D
    • 设置Distance为你需要的段间最大距离
    • 关闭Enable Collision,避免段之间互相碰撞
    • 若需要弹性跟随效果,改用SpringJoint2D,调整Spring和Damper参数控制弹性

方案二:修改现有代码,物理优先+位置修正

如果不想用关节,可调整代码逻辑,让物理引擎先处理重力,再在物理更新周期内修正位置:

替换原WormFollow代码为:

public class WormFollow : MonoBehaviour
{
    [SerializeField] private Transform _front;
    [SerializeField] private Rigidbody2D _rb;

    [SerializeField] private float _maxDistance = 1f; // 段间允许的最大距离

    private void FixedUpdate()
    {
        // 计算当前段与前一段的方向和距离
        Vector2 direction = _front.position - _rb.position;
        float currentDistance = direction.magnitude;

        // 超过最大距离时,修正位置(用MovePosition让物理引擎处理)
        if (currentDistance > _maxDistance)
        {
            Vector2 targetPos = (Vector2)_front.position - direction.normalized * _maxDistance;
            _rb.MovePosition(targetPos);
        }
    }
}

头部控制注意事项

头部不能直接设置transform.position,需用物理方式驱动,示例代码:

public class WormHead : MonoBehaviour
{
    [SerializeField] private Rigidbody2D _rb;
    [SerializeField] private float _moveSpeed = 5f;

    private void FixedUpdate()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector2 moveDir = new Vector2(horizontal, vertical).normalized;

        // 用AddForce驱动,保留物理效果
        _rb.AddForce(moveDir * _moveSpeed);
        // 限制最大速度,避免失控
        _rb.velocity = Vector2.ClampMagnitude(_rb.velocity, _moveSpeed);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:43:11