Unity C#:如何通过代码修改CapsuleCollider2D的高度(下蹲场景)
修改CapsuleCollider2D实现下蹲效果的方法
和3D版本的CapsuleCollider不同,CapsuleCollider2D没有直接的height属性可修改,但可以通过调整**size和offset**两个参数,完美模拟下蹲时碰撞体高度变化的效果,以下是具体实现方案:
核心逻辑
CapsuleCollider2D的形态由两个关键参数控制:
size:Vector2类型,分别对应胶囊的宽度和高度(由direction属性决定轴向:垂直方向时size.y是高度,水平方向时size.x是高度)offset:Vector2类型,控制碰撞体相对于Transform中心的偏移量
下蹲时,我们需要:
- 按比例缩小对应轴向的尺寸值(比如垂直角色缩小
size.y) - 向下(或对应方向)调整
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
相关产品推荐
相关产品推荐

