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

ASC学习笔记0014:手动添加一个新的属性集

中文注释:UrealEngine-5.2.1源码-AbilitySystemComponent.h

学习内容:

/** * 手动添加一个新的属性集,作为此能力系统组件的子对象。* 此组件的所有子对象在初始化期间会自动添加。*/template <class T>const T* AddAttributeSetSubobject(T* Subobject){AddSpawnedAttribute(Subobject);return Subobject;}

这是一个用于游戏能力系统组件(Ability System Component)中动态添加属性集(Attribute Set)子对象的方法。让我为您详细解释这个函数:

函数分析

功能说明

  • 目的:手动向能力系统组件添加一个属性集子对象

  • 使用场景:当需要动态添加属性集,而不是在初始化期间自动添加时

  • 返回值:返回添加的属性集指针(const限定)

关键组件

  1. 模板函数:支持任何继承自属性集基类的类型

  2. AddSpawnedAttribute:内部方法,实际执行添加操作

  3. 返回const指针:防止外部意外修改

使用示例

// 假设有一个自定义属性集类
class UMyCustomAttributeSet : public UAttributeSet
{// 属性定义...
};// 在能力系统组件中使用
UMyCustomAttributeSet* NewAttributeSet = NewObject<UMyCustomAttributeSet>(this);
const UMyCustomAttributeSet* AddedSet = AddAttributeSetSubobject(NewAttributeSet);

设计考虑

  1. 灵活性:允许运行时动态添加属性集

  2. 类型安全:模板确保类型正确性

  3. 所有权明确:组件管理属性集的生命周期

  4. 接口一致性:与自动添加的属性集使用相同的基础设施

这种设计在需要条件性添加属性集或支持插件式架构时特别有用。

在实际项目中,AddAttributeSetSubobject 方法在Gameplay Ability System (GAS) 中有广泛的应用。以下是一些典型的使用场景和实际案例:

1. 角色能力组件初始化

基础角色类

// MyCharacter.h
UCLASS()
class AMyCharacter : public ACharacter, public IAbilitySystemInterface
{GENERATED_BODY()public:AMyCharacter();virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override { return AbilitySystemComponent; }protected:UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Abilities")TObjectPtr<UMyAbilitySystemComponent> AbilitySystemComponent;UPROPERTY()TObjectPtr<UHealthAttributeSet> HealthAttributes;UPROPERTY()TObjectPtr<UManaAttributeSet> ManaAttributes;UPROPERTY()TObjectPtr<UCombatAttributeSet> CombatAttributes;
};// MyCharacter.cpp
AMyCharacter::AMyCharacter()
{// 创建能力系统组件AbilitySystemComponent = CreateDefaultSubobject<UMyAbilitySystemComponent>("AbilitySystemComponent");// 创建并添加属性集HealthAttributes = CreateDefaultSubobject<UHealthAttributeSet>("HealthAttributes");ManaAttributes = CreateDefaultSubobject<UManaAttributeSet>("ManaAttributes");CombatAttributes = CreateDefaultSubobject<UCombatAttributeSet>("CombatAttributes");// 设置组件依附关系AbilitySystemComponent->SetupAttachment(RootComponent);
}
 

自定义能力系统组件

// MyAbilitySystemComponent.h
UCLASS()
class UMyAbilitySystemComponent : public UAbilitySystemComponent
{GENERATED_BODY()public:template <class T>const T* AddAttributeSetSubobject(T* Subobject){AddSpawnedAttribute(Subobject);return Subobject;}protected:virtual void AddSpawnedAttribute(UAttributeSet* AttributeSet);
};// MyAbilitySystemComponent.cpp
void UMyAbilitySystemComponent::AddSpawnedAttribute(UAttributeSet* AttributeSet)
{if (AttributeSet){SpawnedAttributes.Add(AttributeSet);AddAttributeSetSubobject(AttributeSet);// 触发属性集初始化事件OnAttributeSetAdded.Broadcast(AttributeSet);}
}
 

2. 复杂的职业系统

不同职业的属性配置

// WarriorCharacter.cpp
AWarriorCharacter::AWarriorCharacter()
{AbilitySystemComponent = CreateDefaultSubobject<UMyAbilitySystemComponent>("AbilitySystemComponent");// 战士特有属性集HealthAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<UHealthAttributeSet>("HealthAttributes"));StaminaAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<UStaminaAttributeSet>("StaminaAttributes"));StrengthAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<UStrengthAttributeSet>("StrengthAttributes"));DefenseAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<UDefenseAttributeSet>("DefenseAttributes"));
}// MageCharacter.cpp
AMageCharacter::AMageCharacter()
{AbilitySystemComponent = CreateDefaultSubobject<UMyAbilitySystemComponent>("AbilitySystemComponent");// 法师特有属性集HealthAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<UHealthAttributeSet>("HealthAttributes"));ManaAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<UManaAttributeSet>("ManaAttributes"));IntelligenceAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<UIntelligenceAttributeSet>("IntelligenceAttributes"));SpellPowerAttributes = AbilitySystemComponent->AddAttributeSetSubobject(CreateDefaultSubobject<USpellPowerAttributeSet>("SpellPowerAttributes"));
}
 

3. 动态属性集管理

运行时添加/移除属性集

// 动态添加临时属性集(如增益效果)
void UMyAbilitySystemComponent::AddTemporaryAttributeSet(UAttributeSet* TempAttributeSet)
{if (TempAttributeSet && !TemporaryAttributeSets.Contains(TempAttributeSet)){AddAttributeSetSubobject(TempAttributeSet);TemporaryAttributeSets.Add(TempAttributeSet);// 通知属性变化ForceReplication();}
}void UMyAbilitySystemComponent::RemoveTemporaryAttributeSet(UAttributeSet* TempAttributeSet)
{if (TemporaryAttributeSets.Remove(TempAttributeSet)){RemoveSpawnedAttribute(TempAttributeSet);}
}
 

4. 装备系统集成

装备提供的属性集

// EquipmentComponent.cpp
void UEquipmentComponent::OnEquipmentEquipped(UEquipmentItem* Equipment)
{if (Equipment && Equipment->GrantedAttributeSet){// 为装备创建属性集实例UAttributeSet* EquipmentAttributeSet = NewObject<UAttributeSet>(GetOwner(), Equipment->GrantedAttributeSet);// 添加到能力系统组件if (UAbilitySystemComponent* ASC = GetOwnerAbilitySystemComponent()){if (UMyAbilitySystemComponent* MyASC = Cast<UMyAbilitySystemComponent>(ASC)){MyASC->AddAttributeSetSubobject(EquipmentAttributeSet);EquippedAttributeSets.Add(EquipmentAttributeSet);}}}
}
 

5. 状态效果系统

状态效果属性集

// StatusEffectComponent.cpp
void UStatusEffectComponent::ApplyStatusEffect(FStatusEffectHandle EffectHandle)
{if (UStatusEffect* StatusEffect = EffectHandle.GetEffect()){// 创建状态效果属性集UStatusEffectAttributeSet* EffectAttributeSet = NewObject<UStatusEffectAttributeSet>(this);EffectAttributeSet->InitializeFromEffect(StatusEffect);// 添加到能力系统if (UMyAbilitySystemComponent* MyASC = GetMyAbilitySystemComponent()){MyASC->AddAttributeSetSubobject(EffectAttributeSet);ActiveEffectAttributeSets.Add(EffectHandle, EffectAttributeSet);}}
}
 

6. 网络同步优化

属性复制配置

// 在属性集中配置网络同步
UCLASS()
class UHealthAttributeSet : public UAttributeSet
{GENERATED_BODY()public:UPROPERTY(BlueprintReadOnly, Category = "Health", ReplicatedUsing = OnRep_Health)FGameplayAttributeData Health;UPROPERTY(BlueprintReadOnly, Category = "Health", ReplicatedUsing = OnRep_MaxHealth)FGameplayAttributeData MaxHealth;// 复制通知UFUNCTION()void OnRep_Health(const FGameplayAttributeData& OldHealth);UFUNCTION()void OnRep_MaxHealth(const FGameplayAttributeData& OldMaxHealth);// 网络复制virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
};
 

实际项目中的最佳实践

  1. 明确的命名约定:属性集名称要清晰表达其用途

  2. 模块化设计:每个属性集专注于单一职责

  3. 内存管理:及时清理不再使用的属性集

  4. 网络优化:合理配置复制属性,减少带宽占用

  5. 错误处理:添加适当的空指针检查和验证

这种模式在大型项目中特别有用,因为它提供了清晰的架构来管理复杂的游戏属性系统,同时保持了代码的可维护性和扩展性。

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

相关文章:

  • 通过手机远程操控电脑,一步步学习便捷方法
  • 【AI学习-comfyUI学习-Segment Anything分割+实时图像裁剪-各个部分学习-第九节2】
  • [Linux]学习笔记系列 -- [kernel[params
  • AI 多模态全栈应用项目描述
  • SpringMVC(2)学习
  • 面向智能教育的生成式AI个性化学习内容生成研究
  • C语言编程代码编译 | 学习如何高效编译和调试C语言程序
  • 多模态学习与多模态模型
  • 网站建设费的税率网页设计制作用什么软件
  • Flutter Material 3设计语言详解
  • 天猫魔盒M19_晶晨S912H当贝桌面线刷机包_adb开启
  • 长沙seo优化排名东营优化网站
  • Python 编程实战 · 实用工具与库 — Flask 基础入门
  • supOS工厂操作系统 | 像“拼乐高”一样做数据分析
  • 青岛营销型网站推广wordpress doc导入
  • upload-labs(1-13)(配合源码分析)
  • Kubernetes-架构安装
  • 【剑斩OFFER】算法的暴力美学——二维前缀和
  • 网站开发教程全集哪些网站做的好看
  • 2025IPTV 源码优化版实测:双架构兼容 + 可视化运维
  • 建设一个网站步骤揭阳专业网站建设
  • ftp下的内部网站建设竞价培训课程
  • 技术观察 | 语音增强技术迎来新突破!TFCM模型如何攻克“保真”与“降噪”的难题?
  • FPGA系统架构设计实践5_IP的封装优化
  • UDP服务端绑定INADDR_ANY后,客户端该用什么IP访问?
  • 不同传感器前中后融合方案简介
  • 《C++在LLM系统中的核心赋能与技术深耕》
  • sward V2.1.5 版本发布,支持文档导出为html\PDF,社区版新增多种账号集成与认证
  • 东莞建站网站模板怎么做电脑网站后台
  • 物联网赋能互联网医院:构建智慧医疗新生态