跳到主内容
Documentation

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();

🔹 常见用途

  1. 角色下蹲/站起动画时调整摄像机位置

    
    Camera->SetRelativeLocation(FVector(0, 0, GetScaledCapsuleHalfHeight() - 10));
    
  2. 判断是否能在某空间通过(比如低头、潜行)

  3. 同步 UI 提示或物理行为


🔹 注意事项

  • 该函数只反映 当前缩放下的视觉+碰撞尺寸,不涉及物理模拟细节。
  • 如果你在蓝图中操作角色缩放(如变大变小道具),一定要使用 GetScaledCapsuleHalfHeight() 来获取真实高度。
  • 对于非均匀缩放(X/Y/Z 缩放不同),结果可能不准确,应尽量避免非均匀缩放角色。

✅ 总结

函数含义
GetCapsuleComponent()->GetUnscaledCapsuleHalfHeight()原始半高(不受缩放影响)
GetScaledCapsuleHalfHeight()实际显示/碰撞用的半高(受 Actor 缩放影响)

📌 推荐使用 GetScaledCapsuleHalfHeight() 来获取角色当前真正的“一半高度”,尤其是在有缩放的情况下。


返回顶部