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

wordpress 导出html5360优化大师官方免费下载

wordpress 导出html5,360优化大师官方免费下载,方庄网站制作,公安网站建设自查报告在上一篇文章里,我们实现了添加负面效果GE,并且在添加GE时,也会给角色应用一个负面效果标签作为标识。在这一篇里,我们将通过负面效果标签标识,应用角色身上展现对应的负面效果的表现。 我们将在这篇文章里添加一个自定…

在上一篇文章里,我们实现了添加负面效果GE,并且在添加GE时,也会给角色应用一个负面效果标签作为标识。在这一篇里,我们将通过负面效果标签标识,应用角色身上展现对应的负面效果的表现。
我们将在这篇文章里添加一个自定义的Niagara组件,来实现对应的负面效果表现,并通过观察角色身上是否应用的对应的标签,来激活和取消激活组件。

解决应用标签的bug

首先我们解决之前编写的通过代码设置GE标签的方法。
和之前的相比,有两处问题,第一处就是不应该直接获取,而是直接创建一个新的FInheritedTagContainer。
第二处是在添加的地方需要设置到Added对象上,对应UE里设置GE。

UTargetTagsGameplayEffectComponent& TargetTagsGameplayEffectComponent = Effect->AddComponent<UTargetTagsGameplayEffectComponent>();
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 = Cast<ICombatInterface>(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](UAbilitySystemComponent* InASC){//监听负面标签变动回调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);Cast<URPGAbilitySystemComponent>(AbilitySystemComponent)->AbilityActorInfoSet();//通过GE初始角色的属性if(HasAuthority()){InitializeDefaultAttributes();}//调用ASC广播OnASCRegistered.Broadcast(AbilitySystemComponent);
}

角色的函数内容不同,在函数执行完时,也完成了广播

void ARPGHero::InitAbilityActorInfo()
{ARPGPlayerState* PlayerStateBase = GetPlayerState<ARPGPlayerState>();check(PlayerStateBase); //检测是否有效,无限会暂停游戏//从playerState获取ASC和ASAbilitySystemComponent = PlayerStateBase->GetAbilitySystemComponent();AttributeSet = PlayerStateBase->GetAttributeSet();//初始化ASCAbilitySystemComponent->InitAbilityActorInfo(PlayerStateBase, this);//触发Actor的技能信息设置回调Cast<URPGAbilitySystemComponent>(AbilitySystemComponent)->AbilityActorInfoSet(); //获取PCif(ARPGPlayerController* PlayerControllerBase = Cast<ARPGPlayerController>(GetController())){if(ARPGHUD* HUD = Cast<ARPGHUD>(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) //火焰负面效果表现组件TObjectPtr<UDeBuffNiagaraComponent> BurnDeBuffComponent;

在构造函数里初始化,并设置好对应的负面标签

	//初始化火焰负面效果组件BurnDeBuffComponent = CreateDefaultSubobject<UDeBuffNiagaraComponent>("BurnDeBuffComponent");BurnDeBuffComponent->SetupAttachment(GetRootComponent());BurnDeBuffComponent->DeBuffTag = FRPGGameplayTags::Get().DeBuff_Burn; //设置匹配的负面标签

编译打开UE,可以看到,里面增加了对应的组件
在这里插入图片描述
我们可以在组件上设置使用的Niagara资产
在这里插入图片描述
还可以修改对应的DeBuff标签
在这里插入图片描述
实现完成后,我们需要进行测试,测试的主要内容是

  1. 在激活负面效果时,是否能够正确激活Niagara
  2. 在负面效果结束时,标签是否能够在角色身上正确清除,Niagara是否能够自动结束
  3. 在激活负面效果时,角色死亡是否能够自动停止激活等待销毁。
    如果都没有问题,基本上效果实现完毕。
http://www.hengruixuexiao.com/news/19003.html

相关文章:

  • 用Html5做网站企业培训课程推荐
  • 做网站gif代码上海seo招聘
  • 泰安网络诈骗网上报警seo在线教程
  • 一站式网站建设平台免费下载百度一下
  • 西安网站建设报价方案打开百度搜索
  • 做礼品公司网站的费用精准引流推广公司
  • 做一个大型网站需要多少钱中国十大营销策划公司排名
  • 安徽手机版建站系统信息湖北seo诊断
  • a站b站搭建网站需要哪些步骤
  • 网站群管理建设帮人推广的平台
  • 外贸工厂 网站建设web设计一个简单网页
  • 做网站公司关键词成免费crm特色
  • 怎么建设淘宝联盟的网站谷歌seo和百度seo
  • proudly powered by wordpress站长之家seo综合
  • 好的网站设计网络营销的模式有哪些
  • 梁平区高点击量网站建设哪家好短期的技能培训有哪些
  • 太原建立网站百度网盘资源搜索引擎
  • 嘉兴专业做网站的公司附近的教育培训机构有哪些
  • 做高效能的父母网站中级经济师考试
  • 制作宝安网站建设网络推广seo怎么弄
  • 郑州做网站好2023年5月最新疫情
  • 网站 验收一键优化软件
  • 网站建设流程 费用百度问问首页
  • wordpress网易云外贸网站优化推广
  • 做微信的网站叫什么名字外链网盘源码
  • 游戏类企业网站模板软件关键词排名
  • 网站收录排名怎么做热搜词工具
  • 我的世界做皮肤的网站自动seo系统
  • 学做网站的书籍怎么自己注册网站平台了
  • 做旅游宣传图的网站有哪些如何写好一篇软文