5.获取怪物头顶位置.md
2025/12/16预计阅读 5 分钟
比如在怪物头顶上面显示一个受击伤害数字
在怪物头顶上面显示一个受击伤害数字,可以使用 GetCapsuleComponent()->GetScaledCapsuleHalfHeight() 来获取怪物胶囊体的半高度,从而计算出头顶位置。
void AMyEnemyBase::ShowDamageUIWidget(const float DamageValue) const
{
const auto Clazz = LoadClass<UUDamageTextWidget>(nullptr,
TEXT("/Script/UMGEditor.WidgetBlueprint'/Game/Widget/UBP_DamageTextWidget.UBP_DamageTextWidget_C'"));
auto Widget = CreateWidget<UUDamageTextWidget>(GetWorld(),Clazz);
Widget->AddToViewport();
Widget->InitializeDamageText(DamageValue);
//在怪物的头顶位置显示
const auto WorldLocation = GetActorLocation() + FVector(0, 0, GetCapsuleComponent()->GetScaledCapsuleHalfHeight() + 30.f);
FVector2D ScreenPositon;
UGameplayStatics::ProjectWorldToScreen(GetWorld()->GetFirstPlayerController(), WorldLocation,ScreenPositon);
Widget->SetPositionInViewport(ScreenPositon,false);
}
ProjectWorldToScreen 函数说明
将三维世界坐标转换为二维屏幕坐标。
GetScaledCapsuleHalfHeight 函数说明
获取胶囊体组件的缩放后半高度。
下面来自 AI的解释
在 Unreal Engine 5(UE5)中,GetScaledCapsuleHalfHeight() 是一个常用于角色(Character)类中的函数,它的作用是 获取当前胶囊体碰撞组件(Capsule Component)在考虑缩放(Scaling)之后的“半高”(Half Height)。
下面我们来详细解释这个函数的含义和用途:
🔹 函数名解析
Get:获取Scaled:表示已经应用了 Actor 或组件的缩放(Scale)Capsule:指角色使用的胶囊体碰撞体(通常叫 CapsuleComponent)HalfHeight:胶囊体沿 Z 轴方向的一半高度(不是总高度)
所以:
GetScaledCapsuleHalfHeight()= 获取经过缩放后的胶囊体的一半高度
🔹 胶囊体(Capsule Component)是什么?
在 UE 的 ACharacter 类中,默认使用一个 Capsule Component 作为碰撞体。它是一个竖直的胶囊形状(上下两个半球 + 中间圆柱),用来代表角色的碰撞体积。
- 它有两个关键属性:
Capsule Radius(半径)Capsule Half Height(半高)——即从胶囊中心到顶部或底部的距离
例如:如果半高是 96,那么胶囊体总高度就是 192 单位。
🔹 为什么需要 “Scaled”?
当你对一个 Actor 进行缩放(比如设置 Actor 的 Actor Scale = 2.0),它的碰撞体也会被等比放大。
此时:
- 原始的
Capsule Half Height可能还是 96, - 但实际表现出来的“有效半高”变成了
96 * 2 = 192
👉 所以 GetScaledCapsuleHalfHeight() 返回的是 考虑了缩放之后的实际半高值。
而如果你直接访问 GetCapsuleComponent()->GetUnscaledCapsuleHalfHeight(),得到的是未缩放前的原始值。
🔹 使用示例(C++)
float HalfHeight = GetMesh()->GetAnimInstance()->GetOwningActor()->GetActorScale().Z *
GetCapsuleComponent()->GetUnscaledCapsuleHalfHeight();
// 更简单的方式:直接调用内置函数
float ScaledHalfHeight = GetCapsuleComponent()->GetScaledCapsuleHalfHeight();
或者在 Character 子类中:
float CurrentHalfHeight = GetScaledCapsuleHalfHeight();
🔹 常见用途
-
角色下蹲/站起动画时调整摄像机位置
Camera->SetRelativeLocation(FVector(0, 0, GetScaledCapsuleHalfHeight() - 10)); -
判断是否能在某空间通过(比如低头、潜行)
-
同步 UI 提示或物理行为
🔹 注意事项
- 该函数只反映 当前缩放下的视觉+碰撞尺寸,不涉及物理模拟细节。
- 如果你在蓝图中操作角色缩放(如变大变小道具),一定要使用
GetScaledCapsuleHalfHeight()来获取真实高度。 - 对于非均匀缩放(X/Y/Z 缩放不同),结果可能不准确,应尽量避免非均匀缩放角色。
✅ 总结
| 函数 | 含义 |
|---|---|
GetCapsuleComponent()->GetUnscaledCapsuleHalfHeight() | 原始半高(不受缩放影响) |
GetScaledCapsuleHalfHeight() | 实际显示/碰撞用的半高(受 Actor 缩放影响) |
📌 推荐使用
GetScaledCapsuleHalfHeight()来获取角色当前真正的“一半高度”,尤其是在有缩放的情况下。