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

如何在C#(非GDScript)中获取碰撞形状的高度属性?

无法直接读取高度的原因

Godot的C#绑定采用静态类型检查机制,和GDScript的动态类型特性存在本质差异:

  • GDScript的类型校验在运行时执行,只要实际挂载的碰撞形状确实存在height属性,就可以直接用CollisionShape.shape.height链式访问
  • C#中CollisionShape.Shape属性的声明类型是抽象基类Shape3D或Shape2D,基类没有定义通用的Height属性,因此无法直接通过CollisionShape.Shape.xxx的形式读到高度值,必须将基类引用转换为具体的形状子类实例,才能访问子类专属的高度属性。
实际实现步骤
  • 先确认当前碰撞节点下挂载的具体形状类型:只有特定的形状子类才存在高度相关的属性,比如3D场景下的CapsuleShape3D、CylinderShape3D,2D场景下的CapsuleShape2D、SegmentShape2D等
  • 用C#的模式匹配做安全类型转换,转换成功后直接读取对应子类的高度值,避免无保护强转引发的运行时崩溃

参考代码

3D 胶囊碰撞取高度

var collisionShape = GetNode<CollisionShape3D>("Player/CollisionShape3D");
if (collisionShape.Shape is CapsuleShape3D capsuleShape)
{
    float height = capsuleShape.Height;
}

3D 盒形碰撞取高度

盒形碰撞没有独立的Height属性,高度存储在Size向量的Y轴分量中:

if (collisionShape.Shape is BoxShape3D boxShape)
{
    float height = boxShape.Size.Y;
}

2D 胶囊碰撞取高度

var collisionShape2D = GetNode<CollisionShape2D>("Enemy/CollisionShape2D");
if (collisionShape2D.Shape is CapsuleShape2D capsule2D)
{
    float height = capsule2D.Height;
}
注意要点
  • 禁止使用无保护的强制类型转换(比如((CapsuleShape3D)collisionShape.Shape).Height),一旦实际挂载的形状和转换目标不匹配,会直接触发类型转换异常导致游戏崩溃
  • 不同形状的高度存储逻辑不统一,读取前务必确认对应形状子类的API定义,不要默认所有碰撞形状都有独立的Height属性

内容的提问来源于stack exchange,提问作者Rubén ramirez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 12:57:03