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

Unity C#:如何通过代码修改CapsuleCollider2D的高度(下蹲场景)

修改CapsuleCollider2D实现下蹲效果的方法

和3D版本的CapsuleCollider不同,CapsuleCollider2D没有直接的height属性可修改,但可以通过调整**size和offset**两个参数,完美模拟下蹲时碰撞体高度变化的效果,以下是具体实现方案:

核心逻辑

CapsuleCollider2D的形态由两个关键参数控制:

  • size:Vector2类型,分别对应胶囊的宽度和高度(由direction属性决定轴向:垂直方向时size.y是高度,水平方向时size.x是高度)
  • offset:Vector2类型,控制碰撞体相对于Transform中心的偏移量

下蹲时,我们需要:

  1. 按比例缩小对应轴向的尺寸值(比如垂直角色缩小size.y)
  2. 向下(或对应方向)调整offset,抵消尺寸缩小后碰撞体的上移,避免角色穿模或碰撞检测异常

代码实现示例

假设你的角色使用垂直方向的CapsuleCollider2D,以下是C#脚本实现:

using UnityEngine;

public class PlayerCrouch : MonoBehaviour
{
    private CapsuleCollider2D _capsuleCollider;
    private Vector2 _originalSize;
    private Vector2 _originalOffset;
    
    [Header("下蹲配置")]
    [SerializeField] private float crouchHeightRatio = 0.5f; // 下蹲时高度为原高度的比例
    private Vector2 _crouchOffset;

    void Awake()
    {
        _capsuleCollider = GetComponent<CapsuleCollider2D>();
        // 保存初始状态
        _originalSize = _capsuleCollider.size;
        _originalOffset = _capsuleCollider.offset;
        // 计算下蹲时的偏移量:高度减少量的一半向下偏移
        float heightReduceAmount = _originalSize.y * (1 - crouchHeightRatio);
        _crouchOffset = new Vector2(_originalOffset.x, _originalOffset.y - heightReduceAmount / 2);
    }

    void Update()
    {
        // 检测下蹲输入(示例用Left Control键)
        if (Input.GetKeyDown(KeyCode.LeftControl))
        {
            SetCrouchState(true);
        }
        if (Input.GetKeyUp(KeyCode.LeftControl))
        {
            SetCrouchState(false);
        }
    }

    /// <summary>
    /// 设置角色蹲站状态
    /// </summary>
    /// <param name="isCrouching">是否下蹲</param>
    private void SetCrouchState(bool isCrouching)
    {
        if (isCrouching)
        {
            _capsuleCollider.size = new Vector2(_originalSize.x, _originalSize.y * crouchHeightRatio);
            _capsuleCollider.offset = _crouchOffset;
        }
        else
        {
            _capsuleCollider.size = _originalSize;
            _capsuleCollider.offset = _originalOffset;
        }
    }
}

注意事项

  • 如果角色使用水平方向的CapsuleCollider2D(Direction为Horizontal),只需将代码中针对size.y和offset.y的操作替换为size.x和offset.x即可
  • 建议配合角色的下蹲动画,在动画关键帧触发碰撞体的尺寸调整,让视觉表现和碰撞检测更同步
  • 测试时留意场景中的地面、平台等碰撞体,避免下蹲时碰撞体偏移导致角色陷入地形

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:10:28