做投资理财网站,百度快照seo,网站运营与管理实训报告,iis做网站跳转在前两篇中#xff0c;我们在C中实现了对GameplayTag的创建#xff0c;并且创建DataAsset存储数据#xff0c;按照之前的规划#xff1a;
首先我们需要通过c去实现创建GameplayTag#xff0c;这样可以在c和UE里同时获取到Tag创建一个DataAsset类#xff0c;用于设置tag对…在前两篇中我们在C中实现了对GameplayTag的创建并且创建DataAsset存储数据按照之前的规划
首先我们需要通过c去实现创建GameplayTag这样可以在c和UE里同时获取到Tag创建一个DataAsset类用于设置tag对应的属性和显示内容创建AttributeMenuWidgetController实现对应逻辑
我们将在这一篇里实现对AttributeMenuWidgetController创建可以将数据从AS里同步到UI上面。
创建AttributeMenuWidgetController
首先基于之前的创建的WidgetController的基类创建一个子类 将其命名为AttributeMenuWidgetController 覆盖一下父类的初始化属性函数和构件委托的函数我们后续将在这两个函数内实现对属性面板的属性的广播。 我们并创建了一个委托AttributeInfoDelegate这个委托设置了BlueprintAssignable修饰符那么就可以在蓝图里面作为回调绑定使用。 AttributeInfo参数只能在UE面板编辑我们在上一篇添加了对应的Tag和属性名描述作为显示内容如果需要本地化可以添加多个切换中英文等其它语种的显示。
// 版权归暮志未晚所有。#pragma once#include CoreMinimal.h
#include UI/WidgetController/MyWidgetController.h
#include AttributeMenuWidgetController.generated.hclass UAttributeInfo;
struct FMyAttributeInfo;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FAttibuteInfoSignature, const FMyAttributeInfo, Info);/*** */
UCLASS(BlueprintType, Blueprintable)
class AURA_API UAttributeMenuWidgetController : public UMyWidgetController
{GENERATED_BODY()public:virtual void BindCallbacksToDependencies() override;virtual void BroadcastInitialValues() override;UPROPERTY(BlueprintAssignable, CategoryGAS|Attributes)//设置BlueprintAssignable可以在蓝图作为委托绑定监听FAttibuteInfoSignature AttributeInfoDelegate;protected:UPROPERTY(EditDefaultsOnly)//EditDefaultsOnly只能在UE面板编辑TObjectPtrUAttributeInfo AttributeInfo;
};
这两个函数我们将在后续对其内容进行实现。
在HUD设置Controller
之前我们在HUD类设置了创建OverlayWidgetController用于进入游戏时主界面生命值和法力值的更新。 相应的我们也将实现对AttributeMenuWidgetController的添加作为AttributeMenuWidgetController的单例承载。 我们在HUD类里面创建一个承载它实例的变量并添加一个获取方法
UAttributeMenuWidgetController* GetAttributeMenuWidgetController(const FWidgetControllerParams WCParams);UPROPERTY()TObjectPtrUAttributeMenuWidgetController AttributeMenuWidgetController;UPROPERTY(EditAnywhere)TSubclassOfUAttributeMenuWidgetController AttributeMenuWidgetControllerClass;
函数的实现这里其实就是保证只实例化一次后面的都复用它即可
UAttributeMenuWidgetController* AMyHUD::GetAttributeMenuWidgetController(const FWidgetControllerParams WCParams)
{if(AttributeMenuWidgetController nullptr){AttributeMenuWidgetController NewObjectUAttributeMenuWidgetController(this, AttributeMenuWidgetControllerClass);AttributeMenuWidgetController-SetWidgetControllerParams(WCParams);AttributeMenuWidgetController-BindCallbacksToDependencies(); //绑定监听数值变化}return AttributeMenuWidgetController;
}编译打开UE创建一个基于AttributeMenuWidgetController类的蓝图这里创建蓝图的原因是我们需要通过蓝图去设置AttributeInfo的数据。 将我们之前创建的属性数据设置上去 接着到HUD蓝图这里将AttributeMenuWidgetControllerClass类设置上蓝图。 这样在项目运行得时候这两个Controller都会被创建出来去使用。
接下来就是需要考虑如何在UI里面去获取到Controller我们之前对OverlayWidgetController的获取是在创建UI的时候在Widget的事件里面通过蓝图设置过去的但是在属性面板内层级太多我们一层层的设置过去太过于麻烦下面我们将使用一个新的方式能够在全局蓝图里获取Controller。
创建蓝图函数库获取Controller
我们创建一个蓝图函数库可以通过静态函数在任意位置获取到对应的Controller这样可以让结构更加的清晰也更加方便。
首先打开UE创建一个新的c类这个类继承至BlueprintFunctionLibrary 设置好名称 编辑器打开创建两个静态函数分别用于获取OverlayWidgetController和AttributeMenuWidgetController BlueprintPure 为去掉在蓝图内使用时的执行接口这样我们不需要调用也可以直接从节点获取返回。
// 版权归暮志未晚所有。#pragma once#include CoreMinimal.h
#include Kismet/BlueprintFunctionLibrary.h
#include MyAbilitySystemBlueprintLibrary.generated.hclass UAttributeMenuWidgetController;
class UOverlayWidgetController;
/*** */
UCLASS()
class AURA_API UMyAbilitySystemBlueprintLibrary : public UBlueprintFunctionLibrary
{GENERATED_BODY()public:UFUNCTION(BlueprintPure, CategoryMyAbilitySystemLibrary|WidgetController)static UOverlayWidgetController* GetOverlayWidgetController(const UObject* WorldContextObject);UFUNCTION(BlueprintPure, CategoryMyAbilitySystemLibrary|WidgetController)static UAttributeMenuWidgetController* GetAttributeMenuWidgetController(const UObject* WorldContextObject);
};
在函数实现这里我们通过函数从世界上下文的对象获取到本地的PlayerController然后根据PlayerController获取到所需的配置项再从HUD身上的函数获取Controller。 这里比较有意思的就是通过在一个世界上下文的对象可以获取到它所处的世界内的PlayerController。
// 版权归暮志未晚所有。#include AbilitySystem/MyAbilitySystemBlueprintLibrary.h#include Kismet/GameplayStatics.h
#include Player/PlayerStateBase.h
#include UI/HUD/MyHUD.h
#include UI/WidgetController/MyWidgetController.hUOverlayWidgetController* UMyAbilitySystemBlueprintLibrary::GetOverlayWidgetController(const UObject* WorldContextObject)
{//获取到playerController 需要传入一个世界空间上下文的对象用于得到对应世界中的PC列表0为本地使用的PCif(APlayerController* PC UGameplayStatics::GetPlayerController(WorldContextObject, 0)){//从PC获取到HUD我们就可以从HUD获得对应的Controllerif(AMyHUD* HUD CastAMyHUD(PC-GetHUD())){APlayerStateBase* PS PC-GetPlayerStateAPlayerStateBase();UAbilitySystemComponent* ASC PS-GetAbilitySystemComponent();UAttributeSet* AS PS-GetAttributeSet();const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);return HUD-GetOverlayWidgetController(WidgetControllerParams);}}return nullptr;
}UAttributeMenuWidgetController* UMyAbilitySystemBlueprintLibrary::GetAttributeMenuWidgetController(const UObject* WorldContextObject)
{//获取到playerController 需要传入一个世界空间上下文的对象用于得到对应世界中的PC列表0为本地使用的PCif(APlayerController* PC UGameplayStatics::GetPlayerController(WorldContextObject, 0)){//从PC获取到HUD我们就可以从HUD获得对应的Controllerif(AMyHUD* HUD CastAMyHUD(PC-GetHUD())){APlayerStateBase* PS PC-GetPlayerStateAPlayerStateBase();UAbilitySystemComponent* ASC PS-GetAbilitySystemComponent();UAttributeSet* AS PS-GetAttributeSet();const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);return HUD-GetAttributeMenuWidgetController(WidgetControllerParams);}}return nullptr;
}
然后编译我们在UE打开Overlay的UI就可以直接右键获取下面的事OverlayWidget里面的函数上面的则是静态函数 我们直接将之前设置方式修改 也能够实现之前的效果。
接着我们在WBP_AttributeMenu里面使用静态函数获取到AttributeMenuWidgetController设置 可以做一下测试打印一下Controller的名称 运行项目点击打开属性面板查看是否有名称打印。 这里有个问题我们在设置OverlayWidgetController时是在C内初始化UI属性显示的。 在函数内执行逻辑是
OverlayWidget-SetWidgetController(OverlayWidgetController); //设置用户控件的控制器层设置属性后会调用WidgetControllerSet();执行函数这个在UI里面可以 Widget会在WidgetControllerSet()执行后进行Controller设置并绑定监听。 接着就会执行OverlayWidgetController-BroadcastInitialValues();在函数内进行广播将数据广播出去实现了数据在UI上面初始显示。
但是属性面板是动态创建的所以我们需要将BroadcastInitialValues设置为蓝图可调用 然后打开WBP_AttributeMenu里面等构造完成后使用蓝图调用BroadcastInitialValues函数。 Event Construct事件是在自身和自己的子元素都创建完成后才会被调用我在子元素的Event Construct后面打印11111111在WBP_AttributeMenu里面打印Hello发现在最后打印了Hello证明我们在使用蓝图调用BroadcastInitialValues函数时子元素可以在Event Construct里面绑定监听委托即可实现初始化。 我说这么多的原因在于大家一定要了解清楚引擎的运行逻辑这样才能更好的梳理逻辑学习以及使用内置的内容。
到这里我们创建了AttributeMenuWidgetController并实现了在Widget内的任意位置获取它由于篇幅太长我将在下一篇里对AttributeMenuWidgetController内部进行实现实现数据更新直接同步到UI上面。