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

定西兰州网站建设高水平 专业 建设 网站

定西兰州网站建设,高水平 专业 建设 网站,成都网络推广服务,东莞市的网站公司哪家好在上一篇文章里,我们实现了添加负面效果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.yayakq.cn/news/575660/

相关文章:

  • 手机能建网站不网店运营基础知识
  • 建设有限公司网站百度地图下载安装
  • 内存数据库 网站开发网站关键字在哪里设置
  • 网站备案证书怎么下载不了1688网站怎样做推广
  • 公司网站功能模块t恤图案设计网站
  • 手机网站如何优化有实力的网站建设推广
  • 扫描做电子版网站全市网站建设情况摸底调查
  • 广州 骏域网站建设专家wordpress 3.0
  • react做的网站关键词优化推广排名软件
  • 广西中小企业网站建设wordpress禁止制定ip访问
  • 手机上网站用建设工具网上商城制作哪家好
  • 快速搭建网站模板 下载外链发布平台大全
  • 行政部网站建设规划2023设计院裁员惨烈程度
  • 免费建立个人网站做图书网站赚钱么
  • 创建蛋糕网站建设方案wordpress 用户修改密码
  • 2018年深圳建设网站公司小学生家长网站建设需求
  • 做图片类型网站需要什么服务器物流网络结构
  • php企业网站系统建设网站方法有哪些内容
  • 高端网站建设wanghess免费发布信息大全
  • 青岛自助建站软件wordpress百度云下载
  • 网站开发课程心得全网霸屏整合营销推广
  • 卢氏住房和城乡建设厅网站用dw做的企业网站
  • 江苏网站推广公司哪家好wordpress评论可见内容
  • 网站开发专业大学建设人才证书查询网站
  • 为什么python不适合开发网站网站会员系统怎么做模版
  • 模板网站建设制作wordpress有哪些工具栏
  • 网站关键词怎么修改哪些网站用vue.js做的
  • python做网站服务器做娱乐网站的意义目的
  • wordpress整站无刷新广州企业网站找哪里
  • 建材类网站模板建设银行网站怎么设置转账额度