Ue4 Charater 游戏世界血条

(1)FairyGUI 创建血条控件

(2)    //角色血条
        UGComponent*                m_pCharHp;     .h文件声明变量

(3) 

UWorld* kWorld = GetWorld();
	m_pCharHp = UUIPackage::CreateObject(TEXT("FightGame"), TEXT("charHp"), (UObject*)kWorld)->As<UGComponent>();
	if (m_pCharHp != nullptr)
	{
		m_pCharHp->SetParentToRoot();
		m_pCharHp->MakeFullScreen(true);	

		UGObject* CharHpWin = m_pCharHp->GetChild("CharHp");
		
		float modelWidth = GetCapsuleComponent()->GetUnscaledCapsuleRadius()/50.0f * 160.0f;
		CharHpWin->SetWidth(modelWidth);

	}

(4)设置位置

	UWorld* kWorld = GetWorld();
	FConstPlayerControllerIterator playerIterator = kWorld->GetPlayerControllerIterator();
	FVector2D sreenPos;
	tempCurrentPos.Z = tempCurrentPos.Z + 150.0f;
	UGameplayStatics::ProjectWorldToScreen(playerIterator->Get(), tempCurrentPos, sreenPos);
	FVector2D resPos = m_pCharHp->GetUIRoot()->GlobalToLocal(sreenPos);
	m_pCharHp->SetPosition(sreenPos);	

本文在Tick中调用

注意:位置设置一次时,在BeginPlay中调用ProjectWorldToScreen会失败,要延迟调用才对

效果移动地图血条相对角色的位置会变,没有Unity正交相机血条的效果

(5)将UGameplayStatics::ProjectWorldToScreen 换成 UWidgetLayoutLibrary::ProjectWorldLocationToWidgetPosition(playerIterator->Get(), tempCurrentPos, sreenPos,false);血条的效果就对了

<think>好的,用户想要了解如何在Unreal Engine中使用C++创建一个Widget,并且生成自定义的继承自UUserWidget的蓝图类。首先,我需要回忆UE中创建自定义Widget的步骤。 首先,用户可能已经知道如何在C++中创建类,但不确定具体步骤。我应该从创建C++类开始,继承UUserWidget。然后需要说明如何添加必要的函数,比如NativeConstruct,以及如何暴露变量或函数给蓝图。 接下来,用户提到生成蓝图类,所以需要解释如何在UE编辑器里基于这个C++类创建蓝图。这时候可能需要提到在内容浏览器中右键创建蓝图,并选择父类为生成的C++类。 另外,用户可能希望这个自定义Widget能被其他蓝图或C++代码创建,所以需要介绍CreateWidget函数的使用方法,包括传入World、Widget类型等参数。可能需要给出一个例子,比如在PlayerController中创建并添加到视口。 还需要考虑用户可能遇到的常见问题,比如没有正确编译项目导致找不到新类,或者忘记在头文件中使用UCLASS宏。另外,可能需要注意UPROPERTY和UFUNCTION的说明符,确保它们在蓝图中可见。 可能用户的实际需求是在游戏中动态生成UI元素,比如或菜单。因此,可能需要补充一些实际应用的例子,说明如何将变量绑定到蓝图,或者在C++中处理UI逻辑,再在蓝图中设计布局。 最后,检查是否有遗漏的步骤,比如模块依赖,需要确保项目的.Build.cs文件中添加了UMG模块,否则编译会失败。这也是常见的问题点,应该提醒用户注意。</think>在 Unreal Engine 中使用 C++ 创建自定义 `UUserWidget` 并生成蓝图类,可以通过以下步骤实现: --- ### **1. 创建 C++ 基类** 1. **新建 C++ 类** 在 Unreal Editor 中选择 **Tools > New C++ Class**,继承自 `UUserWidget`,命名为例如 `MyCustomWidget`。 2. **关键代码结构** ```cpp // MyCustomWidget.h #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "MyCustomWidget.generated.h" UCLASS() class YOURPROJECT_API UMyCustomWidget : public UUserWidget { GENERATED_BODY() public: // 声明可在蓝图中覆盖的初始化函数 virtual void NativeConstruct() override; // 示例:暴露给蓝图的变量 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "CustomWidget") FText DisplayText; // 示例:暴露给蓝图的函数 UFUNCTION(BlueprintCallable, Category = "CustomWidget") void UpdateText(const FText& NewText); }; ``` ```cpp // MyCustomWidget.cpp #include "MyCustomWidget.h" void UMyCustomWidget::NativeConstruct() { Super::NativeConstruct(); // 初始化逻辑 } void UMyCustomWidget::UpdateText(const FText& NewText) { DisplayText = NewText; // 更新 UI 逻辑 } ``` --- ### **2. 生成蓝图子类** 1. **创建蓝图** - 在内容浏览器中右键 **Blueprint Class**,搜索父类 `MyCustomWidget`。 - 命名蓝图,例如 `BP_MyCustomWidget`。 2. **设计 UI** - 双击蓝图,在 **Designer** 模式中添加按钮、文本等控件。 - 绑定 C++ 暴露的变量/函数到 UI 元素(如 `DisplayText` 绑定到 `TextBlock`)。 --- ### **3. 动态生成 Widget** 在 C++ 或蓝图中动态创建自定义 Widget: #### **C++ 中生成** ```cpp // 在 PlayerController 或 Character 中 if (UWorld* World = GetWorld()) { if (UMyCustomWidget* MyWidget = CreateWidget<UMyCustomWidget>(World, UMyCustomWidget::StaticClass())) { MyWidget->AddToViewport(); // 显示到屏幕 MyWidget->UpdateText(FText::FromString("Hello UE5!")); } } ``` #### **蓝图中生成** 1. 使用 `Create Widget` 节点,选择 `BP_MyCustomWidget`。 2. 连接 `Add to Viewport` 节点。 -- ### **4. 关键注意事项** 1. **模块依赖** 确保项目的 `.Build.cs` 文件中包含 `UMG` 模块: ```cpp PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "UMG" }); ``` 2. **蓝图可访问性** - 使用 `Blueprintable` 或 `BlueprintType` 修饰 C++ 类: ```cpp UCLASS(Blueprintable) class UMyCustomWidget : public UUserWidget { ... }; ``` 3. **数据绑定** 在蓝图中使用 `Bind Widget` 或 `Event Dispatchers` 实现动态交互。 --- ### **5. 实际应用场景** - **动态 UI**:如角色、任务提示。 - **配置化界面**:通过蓝图快速迭代 UI 样式,C++ 处理核心逻辑。 - **跨平台适配**:在 C++ 中统一逻辑,蓝图处理不同平台的 UI 差异。 通过结合 C++ 的功能性和蓝图的灵活性,可以高效开发复杂且可维护的 UE 界面系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值