当前位置: 首页 > news >正文

义乌建设网站制作广东的网站建设

义乌建设网站制作,广东的网站建设,上海阿里巴巴做网站,广州网站建设懂你所需在上一篇文章里#xff0c;制作了显示血量和蓝量的ui#xff0c;并且还将ui和获取数据使用的控制器层创建出来并初始化成功。现在只有主用户控件上面被添加了控制器层#xff0c;还未给每个用户控件赋予控制器层。接下来要实现对属性的广播功能#xff0c;在属性值变化的时…在上一篇文章里制作了显示血量和蓝量的ui并且还将ui和获取数据使用的控制器层创建出来并初始化成功。现在只有主用户控件上面被添加了控制器层还未给每个用户控件赋予控制器层。接下来要实现对属性的广播功能在属性值变化的时候能够在蓝图中获取到数值的变化并更新到用户控件上面。 使用广播设置初始值 首先在控制器层里面添加一个函数 virtual void BroadcastInitialValues();这个函数用于广播初始化函数。我们上一文章里基于控制器层类创建了一个子类专门用于Overlay的在里面复写这个函数 public:virtual void BroadcastInitialValues() override;接下来就是重点我们将以委托的形式设置每个属性的广播功能这里就需要用到委托对应的函数。不清楚的小伙伴可以看下这里 一文理解透UE委托Delegate 这里使用了动态多播委托函数绑定下面是实现委托的函数DelegateName 首字母必须以F开头。 一下是定义了获取血量的委托返回一个参数就是当前的血量浮点数。 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangedSignature,float, NewHealth);接下来定义一个变量实现对回调的引用 UPROPERTY(BlueprintAssignable, CategoryGAS|Attributes)FOnHealthChangedSignature FOnHealthChanged;然后最后通过广播形式将数据广播出去 FOnHealthChanged.Broadcast(50.f);当前我们需要实际的血量数值所以广播出去的就是从AttributeSet里面获取到的值 const UAttributeSetBase* AttributeSetBase CastCheckedUAttributeSetBase(AttributeSet);OnHealthChanged.Broadcast(AttributeSetBase-GetHealth());OnMaxHealthChanged.Broadcast(AttributeSetBase-GetMaxHealth());函数有了需要有个地方调用实例化这个函数我们是在HUD类里面实例化的那就在实例化完成后面调用。也就是MyHUD.cpp里面的InitOverlay()里面这个顺序不能错首先需要设置控制器层这时会触发蓝图里面可以调用的设置控制器层回调通知用户控件会以此来绑定广播回调。然后再广播初始的值用户控件里就实现了对值的初始化设置。 OverlayWidgetController GetOverlayWidgetController(WidgetControllerParams); //获取控制器层OverlayWidget-SetWidgetController(OverlayWidgetController); //设置用户控件的控制器层OverlayWidgetController-BroadcastInitialValues(); //初始化广播这样设置完成以后打开UE在设置的WBP_Overlay里面在上一章最后设置的设置完成控制器层对象后的回调中将控制器层对象传递给需要显示的用户控件节点。 做到这一步我们在需要同步数据的UI上面就都可以获取到控制器层对象。接着我们要将Overlay的控制器层类公开给蓝图。 UCLASS(BlueprintType, Blueprintable) class AURA_API UOverlayWidgetController : public UMyWidgetController直接在类上面的UCLASS()内添加上两个参数。 BlueprintType 将此类公开为可用于蓝图中的变量的类型。 Blueprintable 将此类公开为用于创建蓝图的可接受基类。默认为NotBlueprintable除非继承时就并非如此。此说明符由子类继承。 设置完成这两项我们就可以把控制器层对象转换为控制器层类的实例了。 为了方便后面的工作推荐不要直接使用c的类通过蓝图创建一个c的基类去使用。 将HUD里面的控制器层类的引用修改成蓝图的。 在进度条的蓝图基类WBP_GlobeProgressBar中添加一个函数用于设置进度条百分比接收一个参数 之前在OverlayWidget里面将在c里面生成的控制器层对象传递给了对应的用户组件。我们在血量控件中也可以使用WidgetControllerSet通知获得通知后将变量保存。 之前我们在OverlayWidgetController里面添加了对血量和最大血量的广播所以在蓝图里我们可以实现绑定血量变化。在数值变化后可以通过调用设置进度条百分比进行进度条设置。 顺便也绑定最大血量。 监听数值的变化 上面我们实现通过广播的形式对用户控件内的值进行初始化还未实现对数值变化后触发广播更新ui显示。 我们需要通过使用AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate()来注册一个监听一个值的变化如果监听的数值变化了接着将变化后的数值进行广播。比如下面就是监听血量属性是否变化 AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate(AttributeSetBase-GetHealthAttribute())为了区分开我们需要在控制器层类里面新加一个函数专门用来注册监听数据变化回调的。 virtual void BindCallbacksToDependencies() override;接着创建两个保护类型的函数用于监听到数值变化后的回调函数 protected:void HealthChanged(const FOnAttributeChangeData Data) const;void MaxHealthChanged(const FOnAttributeChangeData Data) const;接着在绑定监听函数内实现监听 void UOverlayWidgetController::BindCallbacksToDependencies() {const UAttributeSetBase* AttributeSetBase CastCheckedUAttributeSetBase(AttributeSet);AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate(AttributeSetBase-GetHealthAttribute()).AddUObject(this, UOverlayWidgetController::HealthChanged);AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate(AttributeSetBase-GetMaxHealthAttribute()).AddUObject(this, UOverlayWidgetController::MaxHealthChanged);}在数值变化时就会触发去调用Changed函数我们只需要在changed函数内将数值广播给蓝图即可。 void UOverlayWidgetController::HealthChanged(const FOnAttributeChangeData Data) const {OnHealthChanged.Broadcast(Data.NewValue); }void UOverlayWidgetController::MaxHealthChanged(const FOnAttributeChangeData Data) const {OnMaxHealthChanged.Broadcast(Data.NewValue); }最后需要找一个地方调用监听函数绑定我选在了HUD对初始化数值调用之后 OverlayWidget-SetWidgetController(OverlayWidgetController); //设置用户控件的控制器层OverlayWidgetController-BroadcastInitialValues(); //初始化广播的值OverlayWidgetController-BindCallbacksToDependencies(); //绑定监听数值变化接下来按照之前的方式将蓝的设置添加上这里不在编写实现因为和血量的方式一行按照上面一步步来即可。下面列一下代码。 控制器层代码 MyWidgetController.h // 版权归暮志未晚所有。#pragma once#include CoreMinimal.h #include AbilitySystemComponent.h #include UObject/NoExportTypes.h #include MyWidgetController.generated.hclass UAttributeSet; class UAbilitySystemComponent;/*** 生成用户控件控制器的结构体需要四项内容去生成。*/ USTRUCT(BlueprintType) struct FWidgetControllerParams {GENERATED_BODY()FWidgetControllerParams(){}FWidgetControllerParams(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS): PlayerController(PC),PlayerState(PS),AbilitySystemComponent(ASC),AttributeSet(AS){}UPROPERTY(EditAnywhere, BlueprintReadWrite)TObjectPtrAPlayerController PlayerController nullptr;UPROPERTY(EditAnywhere, BlueprintReadWrite)TObjectPtrAPlayerState PlayerState nullptr;UPROPERTY(EditAnywhere, BlueprintReadWrite)TObjectPtrUAbilitySystemComponent AbilitySystemComponent nullptr;UPROPERTY(EditAnywhere, BlueprintReadWrite)TObjectPtrUAttributeSet AttributeSet nullptr; };/*** 用户控件控制器层用户控件可从控制器层更新数据显示以及为控制器层提供输入。*/ UCLASS() class AURA_API UMyWidgetController : public UObject {GENERATED_BODY()public:UFUNCTION(BlueprintCallable)void SetWidgetControllerParams(const FWidgetControllerParams WCParams);virtual void BroadcastInitialValues(); //广播初始化的值virtual void BindCallbacksToDependencies(); //绑定数值变动后回调的广播protected:UPROPERTY(BlueprintReadOnly, CategoryWidgetController)TObjectPtrAPlayerController PlayerController;UPROPERTY(BlueprintReadOnly, CategoryWidgetController)TObjectPtrAPlayerState PlayerState;UPROPERTY(BlueprintReadOnly, CategoryWidgetController)TObjectPtrUAbilitySystemComponent AbilitySystemComponent;UPROPERTY(BlueprintReadOnly, CategoryWidgetController)TObjectPtrUAttributeSet AttributeSet;}; MyWidgetController.cpp // 版权归暮志未晚所有。#include UI/WidgetController/MyWidgetController.hvoid UMyWidgetController::SetWidgetControllerParams(const FWidgetControllerParams WCParams) {PlayerController WCParams.PlayerController;PlayerState WCParams.PlayerState;AbilitySystemComponent WCParams.AbilitySystemComponent;AttributeSet WCParams.AttributeSet; }void UMyWidgetController::BroadcastInitialValues() { }void UMyWidgetController::BindCallbacksToDependencies() { } OverlayWidgetController.h // 版权归暮志未晚所有。#pragma once#include CoreMinimal.h #include UI/WidgetController/MyWidgetController.h #include OverlayWidgetController.generated.hDECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChangedSignature,float, NewHealth); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMaxHealthChangedSignature,float, NewMaxHealth); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnManaChangedSignature,float, NewMana); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMaxManaChangedSignature,float, NewMaxMana);/*** 屏幕覆盖用户控件控制器层基类继承与用户控件控制器*/ UCLASS(BlueprintType, Blueprintable) class AURA_API UOverlayWidgetController : public UMyWidgetController {GENERATED_BODY()public:virtual void BroadcastInitialValues() override;virtual void BindCallbacksToDependencies() override;UPROPERTY(BlueprintAssignable, CategoryGAS|Attributes)FOnHealthChangedSignature OnHealthChanged;UPROPERTY(BlueprintAssignable, CategoryGAS|Attributes)FOnMaxHealthChangedSignature OnMaxHealthChanged;UPROPERTY(BlueprintAssignable, CategoryGAS|Attributes)FOnManaChangedSignature OnManaChanged;UPROPERTY(BlueprintAssignable, CategoryGAS|Attributes)FOnMaxManaChangedSignature OnMaxManaChanged;protected:void HealthChanged(const FOnAttributeChangeData Data) const;void MaxHealthChanged(const FOnAttributeChangeData Data) const;void ManaChanged(const FOnAttributeChangeData Data) const;void MaxManaChanged(const FOnAttributeChangeData Data) const; }; OverlayWidgetController.cpp // 版权归暮志未晚所有。#include UI/WidgetController/OverlayWidgetController.h#include AbilitySystem/AttributeSetBase.hvoid UOverlayWidgetController::BroadcastInitialValues() {const UAttributeSetBase* AttributeSetBase CastCheckedUAttributeSetBase(AttributeSet);OnHealthChanged.Broadcast(AttributeSetBase-GetHealth());OnMaxHealthChanged.Broadcast(AttributeSetBase-GetMaxHealth());OnManaChanged.Broadcast(AttributeSetBase-GetMana());OnMaxManaChanged.Broadcast(AttributeSetBase-GetMaxMana()); }void UOverlayWidgetController::BindCallbacksToDependencies() {const UAttributeSetBase* AttributeSetBase CastCheckedUAttributeSetBase(AttributeSet);AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate(AttributeSetBase-GetHealthAttribute()).AddUObject(this, UOverlayWidgetController::HealthChanged);AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate(AttributeSetBase-GetMaxHealthAttribute()).AddUObject(this, UOverlayWidgetController::MaxHealthChanged);AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate(AttributeSetBase-GetManaAttribute()).AddUObject(this, UOverlayWidgetController::ManaChanged);AbilitySystemComponent-GetGameplayAttributeValueChangeDelegate(AttributeSetBase-GetMaxManaAttribute()).AddUObject(this, UOverlayWidgetController::MaxManaChanged);}void UOverlayWidgetController::HealthChanged(const FOnAttributeChangeData Data) const {OnHealthChanged.Broadcast(Data.NewValue); }void UOverlayWidgetController::MaxHealthChanged(const FOnAttributeChangeData Data) const {OnMaxHealthChanged.Broadcast(Data.NewValue); }void UOverlayWidgetController::ManaChanged(const FOnAttributeChangeData Data) const {OnManaChanged.Broadcast(Data.NewValue); }void UOverlayWidgetController::MaxManaChanged(const FOnAttributeChangeData Data) const {OnMaxManaChanged.Broadcast(Data.NewValue); } 多人模式调试UI显示 在运行下拉中将人数修改为2 然后将客户端同时作为服务器使用 接着会发现运行了两个实例并且拥有相同的血量和蓝量 接下来控制一个角色去吃掉药瓶会发现她的血和蓝都产生了变化而另外一个没有变化 到这里功能实现了。
http://www.zqtcl.cn/news/509569/

相关文章:

  • 北京做网站开发公司有哪些网站技术开发文档模板
  • 图解asp.net网站开发实战外管局网站先支后收怎么做报告
  • 访问自己做的网站吗织梦自动生成手机网站
  • 湖南岳阳网站开发网络公司兰州最好的互联网公司
  • 网站上线 流程网站左侧漂浮代码
  • 基于mvc4商务网站开发网站建设引言
  • 深圳网站设计师西安企业100强
  • dz网站数据备份购物网站配色怎么设计
  • 适合网站开发工程师的公司图片百度搜索
  • 网站界面设计需求wordpress single.php
  • 比较权威的房产网站合肥瑶海区地图全图高清版
  • 网站建设公司果动小学电教检查网站建设资料
  • 电子商务网站设计成功的要素青岛网页设计师
  • 门户网站平台建设方案网站开发后如何上线
  • 濮阳做网站的番禺区网络推广渠道
  • 杭州网站seo外包外链图片
  • 苏州网站建设有限公司枣阳建网站
  • 网站开发平台选择如何制作购物网站
  • 专业建设网站企业外包公司企业网站
  • 网站开发需求确认书国家商标注册官网查询系统
  • 国内个人网站建设wordpress 添加搜索
  • 网站建设创新简述网站开发具体流程
  • wordpress小说网站模板南宁企业网站seo
  • 网站开发与设计课程时间网站推广的搜索引擎推广
  • 网站首页幻灯片不显示网页设计制作项目
  • 遂宁网站建设哪家好深圳做响应式网站设计
  • 慈溪建设企业网站wordpress 增加分类字段
  • 毕业设计做系统网站wordpress修改评论框
  • 上海网站开发孵化设计者联盟官网
  • 旅游网站开发需求报告微信创建小程序