虚幻GameAbilitySystem源码与设计解析-AbilitiesGameplayEffectComponent的实现

news/2025/2/24 0:08:13/文章来源:https://www.cnblogs.com/mcwhirr/p/18733140
// Copyright Epic Games, Inc. All Rights Reserved.
// 版权所有 (c) Epic Games, Inc. 保留所有权利。#pragma once#include "GameplayEffectComponent.h"
#include "GameplayAbilitySpec.h"
#include "AbilitiesGameplayEffectComponent.generated.h"/** * 关于如何配置要授予 Actor 的 GameplayAbilitySpec 的选项 */
USTRUCT()
struct FGameplayAbilitySpecConfig
{GENERATED_BODY()/** 要授予的技能类型 */UPROPERTY(EditDefaultsOnly, Category = "Ability Definition")TSubclassOf<UGameplayAbility> Ability;/** 授予该技能的等级 */UPROPERTY(EditDefaultsOnly, Category = "Ability Definition", DisplayName = "Level", meta=(UIMin=0.0))FScalableFloat LevelScalableFloat = FScalableFloat{ 1.0f };/** 要将此技能绑定到的输入 ID */UPROPERTY(EditDefaultsOnly, Category = "Ability Definition")int32 InputID = INDEX_NONE;/** 之后将如何移除这个技能 */UPROPERTY(EditDefaultsOnly, Category = "Ability Definition")EGameplayEffectGrantedAbilityRemovePolicy RemovalPolicy = EGameplayEffectGrantedAbilityRemovePolicy::CancelAbilityImmediately;
};/*** 在激活时,为游戏玩法效果的目标授予额外的游戏技能*/
UCLASS(DisplayName="Grant Gameplay Abilities")
class GAMEPLAYABILITIES_API UAbilitiesGameplayEffectComponent : public UGameplayEffectComponent
{// 为升级路径,让 UGameplayEffect 类可以访问私有成员friend class UGameplayEffect; GENERATED_BODY()public:/** 构造函数 */UAbilitiesGameplayEffectComponent();/** * 当我们应用时,注册相应的事件 * @param ActiveGEContainer 活动的游戏玩法效果容器* @param ActiveGE 活动的游戏玩法效果* @return 如果注册成功返回 true,否则返回 false*/virtual bool OnActiveGameplayEffectAdded(FActiveGameplayEffectsContainer& ActiveGEContainer, FActiveGameplayEffect& ActiveGE) const override;/** * 添加一个授予游戏技能的配置项 * @param Config 游戏技能规格配置*/void AddGrantedAbilityConfig(const FGameplayAbilitySpecConfig& Config);#if WITH_EDITOR/** * 对配置错误的游戏玩法效果发出警告 * @param Context 数据验证上下文* @return 数据验证结果*/virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override;
#endifprotected:/** * 当拥有的游戏玩法效果的抑制状态发生变化时(这可能在初始应用时发生),通知我们 * @param ActiveGEHandle 活动的游戏玩法效果句柄* @param bIsInhibited 是否被抑制*/virtual void OnInhibitionChanged(FActiveGameplayEffectHandle ActiveGEHandle, bool bIsInhibited) const;/** * 我们应该授予配置好的游戏技能 * @param ActiveGEHandle 活动的游戏玩法效果句柄*/virtual void GrantAbilities(FActiveGameplayEffectHandle ActiveGEHandle) const;/** * 我们应该移除配置好的游戏技能 * @param ActiveGEHandle 活动的游戏玩法效果句柄*/virtual void RemoveAbilities(FActiveGameplayEffectHandle ActiveGEHandle) const;private:/** * 当移除时,我们必须撤销所有效果 * @param RemovalInfo 游戏玩法效果移除信息*/void OnActiveGameplayEffectRemoved(const FGameplayEffectRemovalInfo& RemovalInfo) const;protected:/** * 当此游戏玩法效果激活时,要授予目标的技能 */UPROPERTY(EditDefaultsOnly, Category = GrantAbilities)TArray<FGameplayAbilitySpecConfig>    GrantAbilityConfigs;
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888638.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用大模型DeepSeek分析一篇小公司创业失败的文章,失败的原因有哪些?

第一步:把原文保存为Doc格式文档 原本我想直接让 DeepSeek 分析链接的文章,但是两次写提示词后让 DeepSeek 深度分析,都失败了,它说无法直接访问,所以就无法直接分析原文内容。但还是基于搜索的结果进行普遍原因分析。 于是就把原文直接保存为 Doc,上传到 DeepSeek 让它分…

Markdowm学习

标题 二级标题 三级标题 四级标题 五级标题 六级标题 (#*n+空格+标题内容+回车——n级标题 注:此方法最多为六级标题) 字体样式 Hello World (两边加**为粗体) Hello World (两边加*为斜体) Hello World (两边加***为粗体+斜体) Hello World (两边加~~为删除线) 引用h…

区块链模型原理入门学习2——细化模型

以上描述中,存在一些非生产情景的理想化设定。比如:1.没有设计谜题难度平衡 2.没有加入加密校验数字签证 3.没有设计个人钱包 4.广播问题【敬畏能量 敬畏自然】

upload-labs/Pass-12 白名单检测 - %00 截断 GET

save_path 为客户端向服务器端传递的额外信息,可能用此参数指定上传文件的保存目录将save_path 更改为../upload/test.php%00 filename=test.png,filename 的后缀名需要满足白名单 路径和文件名组合在一起会变成../upload/test.php%00test.png , 后缀名满足白名单那么文件就…

upload-labs/Pass-13 白名单检测 - %00 截断 POST

POST 数据包的路径在请求体中在请求体中添加文件名称test.php, 但是不能像GET请求的数据包一样直接添加%00 了,我们需要直接在hex 中将标记修改为00;同时记得把文件名修改为可以上传的后缀重放数据包即可成功绕过上传

upload-labs/Pass-14 Pass-15 图片码绕过

copy .\test.png/b+.\test.php/a kb.png /b:以二进制模式 读取文件 .\test.png /b:以二进制读取test.png /a:以 ASCII 文本模式 读取文件,遇到第一个 EOF(文件结束符,如 0x1A)时停止读取。 .\as.php /a:以 ASCII 文本模式 读取as.php +:表示合并操作,将多个文件内容拼…

upload-labs/Pass-07 黑名单检测 -空格绕过

代码中没有对文件左右两侧去除空格,在文件名后面添加空格不影响文件执行,因此可以绕过

upload-labs/Pass-06 黑名单检测 - 后缀大小写绕过

利用Windows对大小写不敏感的特性。代码中没有对文件大小写做归一,更改文件后缀名大小写可以绕过黑名单

upload-labs/Pass-05 Pass-10 黑名单检测 - 点空格点绕过

利用Windows系统的文件名特性,会自动去掉后缀名最后的.,上传 as.php..进行绕过。 在Windows系统下命名test.php. . ; 命名成功后显示的文件名称为test.php在BP 中更改文件名,文件上传成功访问文件成功 3. 代码分析:删除文件名最后的点之后,以字符串最后的点为分界线,点之…

jvm调优_内存泄漏诊断

1️⃣ 使用Spring Boot模拟场景:注入List持续添加数据(内存泄漏源) 2️⃣ Arthas实时分析: heapdump生成 → MAT导入 → 定位Dominator Tree 3️⃣ 修复验证: 优化弱引用缓存 → GC后观察对象回收实例代码通过api接口不断访问增加元空间的内存 启动 arthas 查看内存或使用…

【.NET】调用本地 Deepseek 模型

本篇咱们来聊一聊怎么在 .NET 代码中使用本地部署的 Deepseek 语言模型。大伙伴们不必要紧张,很简单的,你不需要学习新知识,只要你知道 .NET 如何访问 HTTP 和 JSON 的序列化相关就够了。 先说说如何弄本地模型,有伙伴会问:直接用在线的不好?其实,本地部署更实用,也更符…

抽象类和接口的对比、及各自的使用场景--java进阶day02

1.区别2.各自的使用场景1.抽象类的使用场景 如图,有三个类,其中存在共性,我们就会写一个父类并抽取出共性的东西,但有的方法难免会描述不清,所以我们就将其写为了抽象方法,抽象方法又得存在于抽象类中,所以抽象类主要是对事物做抽象,有些事物说不清2.接口的使用场景假如…