今天学习时,当时一直在思索 我 UAttributeSet类的子类 并没有在 UAbilitySystemComponent 的子类中 去进行附加 但是为何 使用时 能获取出来
在PlayerState的构造函数中进行创建
在AAEffectActo类的碰撞重叠函数中进行获取
玩家角色类 是继承自 IAbilitySystemInterface 所以 会使用
IAbilitySystemInterface* IASIF_AbilitySys = Cast<IAbilitySystemInterface>(OtherActor);
与
GetAbilitySystemComponent()函数
UAbilitySystemComponent::GetAttributeSet(TSubclassOf<UAttributeSet> AttributeSetClass) const 函数 意思就是 通过这个Class 去轮询 UAbilitySystemComponent:: SpawnedAttributes;
返回找到的首个
在此我就发现一个问题 我没主动将 PlayerState中的 AttributeSet 存进 SpawnedAttributes中
怎么能获取到呢?
事实就是获取到了 是否是闹鬼了? 根据以前我的一个老师告诉我的一句话
计算机是不会骗人的
我并存着这个思想 去看看是否是 UAbilitySystemComponent内部 给我存储了 究竟是如何存储的
我大为震撼UE的开放者们是如何去把我类外的对象找到的
于是不久找到了 位置
UAbilitySystemComponent::InitializeComponent()函数中
我找到是在此处存储的
直接通过拥有者对象去 查找 拥有者对象中全部包含的UObject 我理解是如此可能有误
然后逐一轮询添加 我看不懂这个操作 但是意思就是这样
这里的GetOwner()获取的我们可以看一下
其实返回的就是OwnerPrivate
WITH_EDITOR宏 我是忽略的
可以看到最终拿到的是 UObjectBase::OwnerPrivate 变量
CreateDefaultSubobject 函数的源码 我还看不懂 不过我知道的是在它进行创建组件时
会把当前的调用它的对象存到 UObjectBase::OwnerPrivate 中
这里可以看到 AbilitySystemComponent中的OwnerPrivate存的是当前的PlayerState对象
UAbilitySystemComponent::InitializeComponent()函数中使用GetObjectsWithOuter()函数
拿到了PlayerState中的AttributeSet
就直接存入了SpawnedAttributes中
现在应该可以说真相破案了
我估计分开放就不会有存储
可能有错误 欢迎大佬们指正