个人网站备案能做宣传用么,网站开发主要学些什么软件,网络设计与实施课程设计,北京品牌建设网站公司前面几节文章介绍了如何在角色身上添加AbilitySystemComponent和AttributeSet。并且还实现了给AttributeSet添加自定义属性。接下来#xff0c;实现一下如何去修改角色身上的Attribute的值。 
实现拾取药瓶回血功能 首先创建一个继承于Actor的c类#xff0c;actor是可以放置到…前面几节文章介绍了如何在角色身上添加AbilitySystemComponent和AttributeSet。并且还实现了给AttributeSet添加自定义属性。接下来实现一下如何去修改角色身上的Attribute的值。 
实现拾取药瓶回血功能 首先创建一个继承于Actor的c类actor是可以放置到场景中的基类。 UPROPERTY(VisibleAnywhere)TObjectPtrUStaticMeshComponent Mesh;创建一个静态模型组件用来显示当前可拾取物的模型。 UPROPERTY(VisibleAnywhere)TObjectPtrUSphereComponent Sphere;创建一个碰撞体球用于检测和主角的碰撞来触发回调。 Mesh  CreateDefaultSubobjectUStaticMeshComponent(Mesh);SetRootComponent(Mesh);Sphere  CreateDefaultSubobjectUSphereComponent(Sphere);Sphere-SetupAttachment(GetRootComponent());然后初始化中创建对象并将Mesh设置为根节点并将球碰撞体挂在Mesh下面。 
UFUNCTION()
virtual void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult SweepResult);UFUNCTION()
virtual void EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);创建两个回调用于碰撞触发的开始和结束。 Sphere-OnComponentBeginOverlap.AddDynamic(this, AEffectActorBase::OnOverlap);Sphere-OnComponentEndOverlap.AddDynamic(this, AEffectActorBase::EndOverlap);绑定到球体碰撞事件上如果球体触发了碰撞则会调用这两个函数。 
void AEffectActorBase::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult SweepResult)
{//TODO: 为了测试数值修改功能启用了常量转变量功能。if(IAbilitySystemInterface* ASCInterface  CastIAbilitySystemInterface(OtherActor)){//根据类从ASC里面获取到对应的AS实例const UAttributeSetBase* AttributeSet  CastUAttributeSetBase(ASCInterface-GetAbilitySystemComponent()-GetAttributeSet(UAttributeSetBase::StaticClass()));UAttributeSetBase* MutableAttributeSet  const_castUAttributeSetBase*(AttributeSet); //将常量转为变量MutableAttributeSet-SetHealth(AttributeSet-GetHealth()  25.f);Destroy(); // 销毁自身}
}接着在碰撞触发的时候从接口获取到AttributeSet然后设置数值增长。  接下来在UE里面创建一个蓝图基于EffectActorBase。  左侧会发现我们在代码中添加的Mesh和Sphere。  添加模型网格体然后调整球的大小。  运行场景输入showdebug abilitysystem  如果值修改那证明功能实现。 
EffectActorBase.h 
// 版权归暮志未晚所有。#pragma once#include CoreMinimal.h
#include GameFramework/Actor.h
#include EffectActorBase.generated.hclass USphereComponent;
class UStaticMeshComponent;UCLASS()
class AURA_API AEffectActorBase : public AActor
{GENERATED_BODY()public:	AEffectActorBase();UFUNCTION()virtual void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult SweepResult);UFUNCTION()virtual void EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);protected:// 游戏开始或生成对象时回调virtual void BeginPlay() override;private:UPROPERTY(VisibleAnywhere)TObjectPtrUSphereComponent Sphere;UPROPERTY(VisibleAnywhere)TObjectPtrUStaticMeshComponent Mesh;
}; 
EffectActorBase.app 
// 版权归暮志未晚所有。#include Actor/EffectActorBase.h#include AbilitySystemComponent.h
#include AbilitySystemInterface.h
#include AbilitySystem/AttributeSetBase.h
#include Components/SphereComponent.hAEffectActorBase::AEffectActorBase()
{// 设置当前对象是否每帧调用Tick()PrimaryActorTick.bCanEverTick  false;Mesh  CreateDefaultSubobjectUStaticMeshComponent(Mesh);SetRootComponent(Mesh);Sphere  CreateDefaultSubobjectUSphereComponent(Sphere);Sphere-SetupAttachment(GetRootComponent());
}void AEffectActorBase::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult SweepResult)
{//TODO: 为了测试数值修改功能启用了常量转变量功能。if(IAbilitySystemInterface* ASCInterface  CastIAbilitySystemInterface(OtherActor)){//根据类从ASC里面获取到对应的AS实例const UAttributeSetBase* AttributeSet  CastUAttributeSetBase(ASCInterface-GetAbilitySystemComponent()-GetAttributeSet(UAttributeSetBase::StaticClass()));UAttributeSetBase* MutableAttributeSet  const_castUAttributeSetBase*(AttributeSet); //将常量转为变量MutableAttributeSet-SetHealth(AttributeSet-GetHealth()  25.f);Destroy(); // 销毁自身}
}void AEffectActorBase::EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
}void AEffectActorBase::BeginPlay()
{Super::BeginPlay();Sphere-OnComponentBeginOverlap.AddDynamic(this, AEffectActorBase::OnOverlap);Sphere-OnComponentEndOverlap.AddDynamic(this, AEffectActorBase::EndOverlap);
}