如何加盟网站建设济南行知网站建设有限公司怎么样
- 作者: 五速梦信息网
- 时间: 2026年03月21日 09:51
当前位置: 首页 > news >正文
如何加盟网站建设,济南行知网站建设有限公司怎么样,wordpress七牛云图床插件,查看网站开发语言方法在上一篇文章里#xff0c;我们实现了添加负面效果GE#xff0c;并且在添加GE时#xff0c;也会给角色应用一个负面效果标签作为标识。在这一篇里#xff0c;我们将通过负面效果标签标识#xff0c;应用角色身上展现对应的负面效果的表现。 我们将在这篇文章里添加一个自定…在上一篇文章里我们实现了添加负面效果GE并且在添加GE时也会给角色应用一个负面效果标签作为标识。在这一篇里我们将通过负面效果标签标识应用角色身上展现对应的负面效果的表现。 我们将在这篇文章里添加一个自定义的Niagara组件来实现对应的负面效果表现并通过观察角色身上是否应用的对应的标签来激活和取消激活组件。 解决应用标签的bug 首先我们解决之前编写的通过代码设置GE标签的方法。 和之前的相比有两处问题第一处就是不应该直接获取而是直接创建一个新的FInheritedTagContainer。 第二处是在添加的地方需要设置到Added对象上对应UE里设置GE。 UTargetTagsGameplayEffectComponent TargetTagsGameplayEffectComponent Effect-AddComponentUTargetTagsGameplayEffectComponent(); FInheritedTagContainer InheritableOwnedTagsContainer; //创建组件所需的标签容器 InheritableOwnedTagsContainer.Added.AddTag(DeBuffType); //添加标签 TargetTagsGameplayEffectComponent.SetAndApplyTargetTagChanges(InheritableOwnedTagsContainer); //应用并更新创建自定义的Niagara组件类 为了能够自定义负面效果表现的自动开关功能我们需要自己扩展Niagara类在里面增加内容。 我们基于NiagaraComponent创建一个派生类 设定好相关名称和目录 在派生类里我们添加构造函数设置标识当前对应的负面效果的标签以及对应标签变动回调以及角色死亡回调。 UCLASS() class RPG_API UDeBuffNiagaraComponent : public UNiagaraComponent {GENERATED_BODY()public:UDeBuffNiagaraComponent();UPROPERTY(EditDefaultsOnly)FGameplayTag DeBuffTag; //用来标识粒子系统的标签protected:virtual void BeginPlay() override; //覆写开始运行void DeBuffTagChanged(const FGameplayTag CallbackTag, int32 NewCount); //当前的负面标签变动回调UFUNCTION()void OnOwnerDeath(AActor* DeadActor); //在角色死亡时的回调 };在构造函数中我们将自动激活关闭 UDeBuffNiagaraComponent::UDeBuffNiagaraComponent() {bAutoActivate false; //关闭自动激活 }在事件开始执行时我们绑定对应的回调用来检测角色的变动并在变动时触发回调 void UDeBuffNiagaraComponent::BeginPlay() {Super::BeginPlay();ICombatInterface* CombatInterface CastICombatInterface(GetOwner()); //获取到战斗接口//通过函数库获取角色身上的ASCif(UAbilitySystemComponent* ASC UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetOwner())){//监听负面标签变动回调ASC-RegisterGameplayTagEvent(DeBuffTag, EGameplayTagEventType::NewOrRemoved).AddUObject(this, UDeBuffNiagaraComponent::DeBuffTagChanged);}else if(CombatInterface) //如果绑定时ASC未初始化成功则监听ASC创建完成委托完成对负面标签的监听{//AddWeakLambda 这种绑定方式的主要好处是当绑定的对象被销毁时委托不会保持对象的引用从而避免悬空指针问题和内存泄漏。CombatInterface-GetOnASCRegisteredDelegate().AddWeakLambda(this,this{//监听负面标签变动回调InASC-RegisterGameplayTagEvent(DeBuffTag, EGameplayTagEventType::NewOrRemoved).AddUObject(this, UDeBuffNiagaraComponent::DeBuffTagChanged);});}//绑定死亡后销毁if(CombatInterface){CombatInterface-GetOnDeathDelegate().AddDynamic(this, UDeBuffNiagaraComponent::OnOwnerDeath);} }监听负面效果标签的回调里我们可以获取角色身上对应标签的个数如果不为0则激活粒子 void UDeBuffNiagaraComponent::DeBuffTagChanged(const FGameplayTag CallbackTag, int32 NewCount) {if(NewCount 0){Activate(); //绑定的负面标签大于0激活特效}else{Deactivate(); //没有对应标签关闭激活} }在触发死亡回调时关闭激活 void UDeBuffNiagaraComponent::OnOwnerDeath(AActor* DeadActor) {Deactivate(); }添加对应委托 在自定义Niagara组件里我们需要两个委托来监听角色身上的负面标签变动以及角色是否死亡 在战斗接口类里我们增加两个委托可以通过其进行绑定 Dynamic的区别在于能不能绑定蓝图非Dynamic的无法绑定Dynamic的需要通过UE反射绑定也可以直接蓝图获取绑定。 DECLARE_MULTICAST_DELEGATE_OneParam(FOnASCRegistered, UAbilitySystemComponent); //Actor初始化ASC完成后委托 DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDeath, AActor, DeadActor); //Actor死亡后的委托然后我们在类里增加两个获取函数可以获取对应的委托这里我们需要返回引用 virtual FOnASCRegistered GetOnASCRegisteredDelegate() 0; //获取ASC注册成功后的委托virtual FOnDeath GetOnDeathDelegate() 0; //获取死亡委托接着我们在角色基类里增加两个对应的委托 FOnASCRegistered OnASCRegistered; //ASC注册成功委托FOnDeath OnDeath; //角色死亡后触发的死亡委托覆写两个函数 virtual FOnASCRegistered GetOnASCRegisteredDelegate() override; //获取ASC注册成功委托virtual FOnDeath GetOnDeathDelegate() override; //角色死亡委托对其实现一下返回对应的委托 FOnASCRegistered ARPGCharacter::GetOnASCRegisteredDelegate() {return OnASCRegistered; }FOnDeath ARPGCharacter::GetOnDeathDelegate() {return OnDeath; }触发委托 现在我们创建完成了对应的委托还需要在合适的位置对其进行广播 首先是ASC创建完成后的广播我选择在InitAbilityActorInfo函数里创建完成ASC后广播 void ARPGEnemy::InitAbilityActorInfo() {AbilitySystemComponent-InitAbilityActorInfo(this, this);CastURPGAbilitySystemComponent(AbilitySystemComponent)-AbilityActorInfoSet();//通过GE初始角色的属性if(HasAuthority()){InitializeDefaultAttributes();}//调用ASC广播OnASCRegistered.Broadcast(AbilitySystemComponent); }角色的函数内容不同在函数执行完时也完成了广播 void ARPGHero::InitAbilityActorInfo() {ARPGPlayerState* PlayerStateBase GetPlayerStateARPGPlayerState();check(PlayerStateBase); //检测是否有效无限会暂停游戏//从playerState获取ASC和ASAbilitySystemComponent PlayerStateBase-GetAbilitySystemComponent();AttributeSet PlayerStateBase-GetAttributeSet();//初始化ASCAbilitySystemComponent-InitAbilityActorInfo(PlayerStateBase, this);//触发Actor的技能信息设置回调CastURPGAbilitySystemComponent(AbilitySystemComponent)-AbilityActorInfoSet(); //获取PCif(ARPGPlayerController* PlayerControllerBase CastARPGPlayerController(GetController())){if(ARPGHUD* HUD CastARPGHUD(PlayerControllerBase-GetHUD())){HUD-InitOverlay(PlayerControllerBase, PlayerStateBase, AbilitySystemComponent, AttributeSet);}}//通过GE初始角色的属性InitializeDefaultAttributes();//调用ASC广播OnASCRegistered.Broadcast(AbilitySystemComponent); }然后就是角色的死亡委托广播我们之前创建了一个多播函数在角色死亡后每个游戏端都会触发此函数 void ARPGCharacter::MulticastHandleDeath_Implementation() {//播放死亡音效UGameplayStatics::PlaySoundAtLocation(this, DeathSound, GetActorLocation());//开启武器物理效果Weapon-SetSimulatePhysics(true); //开启模拟物理效果Weapon-SetEnableGravity(true); //开启重力效果Weapon-SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); //开启物理碰撞通道//开启角色物理效果GetMesh()-SetSimulatePhysics(true); //开启模拟物理效果GetMesh()-SetEnableGravity(true); //开启重力效果GetMesh()-SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); //开启物理碰撞通道GetMesh()-SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block); //开启角色与静态物体产生碰撞//关闭角色碰撞体碰撞通道避免其对武器和角色模拟物理效果产生影响GetCapsuleComponent()-SetCollisionEnabled(ECollisionEnabled::NoCollision);//设置角色溶解Dissolve();//设置死亡状态bDead true;//触发死亡委托OnDeath.Broadcast(this); }在蓝图编辑 接着我们在角色积累增加一个Niagara组件设置火的负面效果 UPROPERTY(VisibleAnywhere) //火焰负面效果表现组件TObjectPtrUDeBuffNiagaraComponent BurnDeBuffComponent;在构造函数里初始化并设置好对应的负面标签 //初始化火焰负面效果组件BurnDeBuffComponent CreateDefaultSubobjectUDeBuffNiagaraComponent(BurnDeBuffComponent);BurnDeBuffComponent-SetupAttachment(GetRootComponent());BurnDeBuffComponent-DeBuffTag FRPGGameplayTags::Get().DeBuff_Burn; //设置匹配的负面标签编译打开UE可以看到里面增加了对应的组件 我们可以在组件上设置使用的Niagara资产 还可以修改对应的DeBuff标签 实现完成后我们需要进行测试测试的主要内容是 在激活负面效果时是否能够正确激活Niagara在负面效果结束时标签是否能够在角色身上正确清除Niagara是否能够自动结束在激活负面效果时角色死亡是否能够自动停止激活等待销毁。 如果都没有问题基本上效果实现完毕。
相关文章
-
如何韩国视频网站模板下载 迅雷下载地址网页设计素材图标
如何韩国视频网站模板下载 迅雷下载地址网页设计素材图标
- 技术栈
- 2026年03月21日
-
如何规范使用静态网站中国建设银行征信网站
如何规范使用静态网站中国建设银行征信网站
- 技术栈
- 2026年03月21日
-
如何管理网站内容做网站用新域名还是老域名
如何管理网站内容做网站用新域名还是老域名
- 技术栈
- 2026年03月21日
-
如何加强网站内容建设想找做海报的超清图片去哪个网站找
如何加强网站内容建设想找做海报的超清图片去哪个网站找
- 技术栈
- 2026年03月21日
-
如何加入网站网络营销策划包括哪些内容
如何加入网站网络营销策划包括哪些内容
- 技术栈
- 2026年03月21日
-
如何架设一个网站泰州网站优化公司
如何架设一个网站泰州网站优化公司
- 技术栈
- 2026年03月21日






