ASC学习笔记0012:查找现有的属性集,如果不存在则断言

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

学习内容:

cpp 复制代码
/** 查找现有的属性集。如果不存在则断言。 */
	template <class T >
	const T*	GetSetChecked() const
	{
		return (T*)GetAttributeSubobjectChecked(T::StaticClass());
	}

这段代码是一个模板方法,用于安全地获取特定类型的属性集。让我来分析一下它的设计和用途:

代码分析

功能说明:

  1. 类型安全获取 :通过模板参数 T 指定要获取的属性集类型

  2. 编译时检查 :依赖 T::StaticClass() 确保类型有效性

  3. 安全检查Checked 后缀表明如果对象不存在会触发断言(assert)

  4. 常量保证 :返回 const T* 防止意外修改

设计特点:

  • 模板化 :支持任何具有 StaticClass() 静态方法的类型

  • 类型转换 :使用 C 风格强制转换 (T*)

  • 常量正确性 :方法标记为 const,返回常量指针

典型使用场景

cpp 复制代码
// 假设有属性集类型
class FPhysicsAttributes : public FAttributeSet
{
public:
    static UClass* StaticClass() { return FPhysicsAttributes::StaticClass(); }
    
    float Mass;
    float Friction;
};

// 使用示例
const FPhysicsAttributes* PhysicsAttrs = GetSetChecked<FPhysicsAttributes>();
if (PhysicsAttrs)
{
    float mass = PhysicsAttrs->Mass;
    // 安全使用物理属性...
}
复制代码

可能的改进建议

cpp 复制代码
// 1. 使用更安全的类型转换
template <class T>
const T* GetSetChecked() const
{
    return static_cast<const T*>(GetAttributeSubobjectChecked(T::StaticClass()));
}

// 2. 添加调试信息
template <class T>
const T* GetSetChecked() const
{
    const void* Result = GetAttributeSubobjectChecked(T::StaticClass());
    checkf(Result, TEXT("Failed to get attribute set of type: %s"), T::StaticClass()->GetName());
    return static_cast<const T*>(Result);
}
复制代码

这个方法体现了游戏开发中常见的"获取或断言"模式,确保在开发阶段及时发现问题。

相关推荐
优化Henry37 分钟前
5G基站开关电源故障导致小区频闪退服案例
学习·5g·信息与通信·tdd
chenzhou__1 小时前
独立游戏开发日志 ①:从信号博弈到涂色对战——一次玩法重构始
笔记·后端·学习·unity·go·独立游戏
杨先生哦1 小时前
【2026热端攻防系列 11/12】前端AI风控攻防实战:验证码缺陷、人机验证绕过、智能爬虫对抗与企业智能风控加固方案
前端·人工智能·笔记·爬虫·安全
for_ever_love__1 小时前
iOS: 网络请求第三方库的使用: AFNetworking
网络·学习·ios·objective-c·cocoa·xcode
摇滚侠1 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 使用监控体系 阅读笔记
spring boot·笔记·后端
我叫唧唧波1 小时前
【Java】Java 基础系统学习笔记
java·笔记·学习
Dobby_052 小时前
【CICD】Jenkins Pipeline 快速学习入门
运维·学习·jenkins
神秘的MT2 小时前
C# WinForm Socket 类 常用方法 (C# .NET,TCP 场景)
服务器·网络·学习·tcp/ip·c#·winform
艾莉丝努力练剑3 小时前
【MYSQL】MYSQL学习的一大重点:事务(上)- 原子性与持久性
android·数据库·学习·mysql·面试
丶玉面小蛟龙4 小时前
DGCNN网络学习
学习·点云·dgcnn