如何在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
相关产品推荐
相关产品推荐

