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

UE5多人MOBA+GAS 20、添加眩晕

制作眩晕功能

添加眩晕标签

添加一个眩晕标签

CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Stun)
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Stats_Stun, "Stats.Stun", "眩晕")

使用GE来定制眩晕的时长

创建一个GE设置一个定长的眩晕GE
在这里插入图片描述
造成伤害的GE处添加眩晕GE
在这里插入图片描述
输入AbilitySystem.DebugAbilityTags就能看到赋予的Tag
在这里插入图片描述
在这里插入图片描述

添加对眩晕标签的处理,以及添加眩晕动画

到角色基类中添加对接收眩晕Tag的处理

#pragma region GAS组件相关
private:// 眩晕标签的更新void StunTagUpdated(const FGameplayTag Tag, int32 NewCount);
#pragma endregion#pragma region 眩晕(Stun)
private:UPROPERTY(EditDefaultsOnly, Category = "Stun")UAnimMontage* StunMontage;virtual void OnStun();virtual void OnRecoverFromStun();
#pragma endregion
void ACCharacter::BindGASChangeDelegates()
{if (CAbilitySystemComponent){CAbilitySystemComponent->RegisterGameplayTagEvent(TGameplayTags::Stats_Dead).AddUObject(this, &ACCharacter::DeathTagUpdated);CAbilitySystemComponent->RegisterGameplayTagEvent(TGameplayTags::Stats_Stun).AddUObject(this, &ACCharacter::StunTagUpdated);}
}
void ACCharacter::StunTagUpdated(const FGameplayTag Tag, int32 NewCount)
{if (IsDead()) return;if (NewCount != 0){OnStun();PlayAnimMontage(StunMontage);}else{OnRecoverFromStun();StopAnimMontage(StunMontage);}
}void ACCharacter::OnStun()
{
}void ACCharacter::OnRecoverFromStun()
{
}

在子类中重写获得眩晕标签和移除眩晕标签的函数
CPlayerCharacter

#pragma region 眩晕(Stun)
private:virtual void OnStun();virtual void OnRecoverFromStun();
#pragma endregion

眩晕了无法操作跟死亡一样禁用玩家的输入,解除眩晕的时候判断一下是否死亡,不然就会诈尸了

void ACPlayerCharacter::OnStun()
{SetInputEnabledFromPlayerController(false);
}void ACPlayerCharacter::OnRecoverFromStun()
{if (IsDead()) return;SetInputEnabledFromPlayerController(true);
}

另外还需要处理AI

	// 监听Pawn眩晕Tag变化,控制AI逻辑启停void PawnStunTagUpdated(const FGameplayTag Tag, int32 Count);// 标记AI当前是否处于死亡状态bool bIsPawnDead = false;

在死亡标签变化的时候修改布尔变量

void ACAIController::OnPossess(APawn* InPawn)
{Super::OnPossess(InPawn);UAbilitySystemComponent* PawnASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(InPawn);if (PawnASC){PawnASC->RegisterGameplayTagEvent(TGameplayTags::Stats_Dead, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &ACAIController::PawnDeadTagUpdated);PawnASC->RegisterGameplayTagEvent(TGameplayTags::Stats_Stun).AddUObject(this, &ACAIController::PawnStunTagUpdated);}
}void ACAIController::PawnDeadTagUpdated(const FGameplayTag Tag, int32 Count)
{if (Count != 0){GetBrainComponent()->StopLogic("Dead"); // 停止死亡状态下的逻辑ClearAndDisableAllSenses(); // 清除感知数据bIsPawnDead = true;}else{GetBrainComponent()->StartLogic(); // 重新启动AI逻辑EnableAllSenses(); // 启用感知系统bIsPawnDead = false;}
}void ACAIController::PawnStunTagUpdated(const FGameplayTag Tag, int32 Count)
{if (bIsPawnDead) return;if (Count != 0){GetBrainComponent()->StopLogic("Stun");}else{GetBrainComponent()->StartLogic();}
}

在技能的基类中,从构造函数中添加阻止标签,眩晕不能用技能,再去被动技能中移除这个标签。

UCGameplayAbility::UCGameplayAbility()
{// 眩晕状态无法激活技能ActivationBlockedTags.AddTag(TGameplayTags::Stats_Stun);
}
UGAP_Launched::UGAP_Launched()
{// 设置网络执行策略为仅在服务器端执行NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::ServerOnly;// 创建一个新触发数据对象FAbilityTriggerData TriggerData;// 设置触发数据的触发源为游戏事件TriggerData.TriggerSource = EGameplayAbilityTriggerSource::GameplayEvent;// 设置触发数据的触发标签为击飞被动技能激活标签TriggerData.TriggerTag = GetLaunchedAbilityActivationTag();//TGameplayTags::Ability_Passive_Launch_Activate;// 移除被击飞技能的禁用眩晕标签ActivationBlockedTags.RemoveTag(TGameplayTags::Stats_Stun);// 将创建的触发数据添加到能力触发器列表中AbilityTriggers.Add(TriggerData);
}

添加小兵的死亡动画以及眩晕动画,依旧是关闭自动混出功能,设置一下对应的插槽
在这里插入图片描述
在这里插入图片描述
设置一下死亡动画,偏移时间调为0
在这里插入图片描述
再设置一下眩晕蒙太奇
在这里插入图片描述
设置一个机器人的眩晕蒙太奇
在这里插入图片描述
顺利的播放了蒙太奇动画
在这里插入图片描述

http://www.dtcms.com/a/277544.html

相关文章:

  • 基于Flink的实时开发平台-Dinky
  • 基于Leaflet调用天地图在线API的多层级地名检索实战
  • LeetCode第 458 场周赛题解
  • 复习笔记 35
  • PHP语法高级篇(二):文件处理
  • c++ thread_local
  • Java求职面试:从Spring到微服务的全面挑战
  • 牛客周赛 Round 100
  • Android事件分发机制完整总结
  • CMSIS(Cortex Microcontroller Software Interface Standard)ARM公司为 Cortex-M 系列处理器
  • 互联网大厂Java面试:从Spring Boot到微服务的场景应用
  • 2024CVPR:Question Aware Vision Transformer for Multimodal Reasoning介绍
  • 考研复习-数据结构-第六章-图
  • RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段
  • git实操
  • HTML 标题标签
  • 香港理工大学实验室定时预约
  • 【windows办公小助手】快速搜索文件及文件所处目录everything
  • 内存对齐与缓存优化:从硬件原理到代码实战
  • 前端进阶之路-从传统前端到VUE-JS(第五期-路由应用)
  • 通信网络编程5.0——JAVA
  • 新手向:使用Python从PDF中高效提取结构化文本
  • LeetCode经典题解:21、合并两个有序链表
  • 【基础算法】倍增
  • Qt:编译qsqlmysql.dll
  • React强大且灵活hooks库——ahooks入门实践之常用场景hook
  • NoSQL 介绍
  • day052-ansible handler、roles与优化
  • Spring AI 项目实战(十七):Spring + AI + 通义千问星辰航空智能机票预订系统(附完整源码)
  • SDN软件定义网络架构深度解析:分层模型与核心机制