【UE4】常见的 反射宏

本文解析UPROPERTY的作用,包括其在内存管理和蓝图编辑中的设置,以及如何避免因不当使用导致的开发问题,如TMap的内存释放问题实例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UPROPERTY
UPROPERTY(EditAnywhere)
FString  fStr

UPROPERTY 到底有啥用

  1. 首先 会把该变量 加入到UE的内存计数管理中 。(很重要)
  2. 根据后面的参数 表示该变量的状态
    2.1. 是否可以被 蓝图 使用 只读 可写 可见 等等

UPROPERTY 不能用来标识 复杂的嵌套声明

//UPROPERTY(EditAnywhere, BlueprintReadWrite) 加宏 会报错
TMap<int32,TArray<int32>>  MMap;

但是可以拆分之后声明

UCLASS(BlueprintType, Blueprintable)
class UArrayList : public UObject
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<int32> List;
};


UCLASS(BlueprintType, Blueprintable)
class UMapTest : public UObject
{
GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TMap<int32, UArrayList* >  MMap;
}

类似这种问题 未加宏 Map会 内存释放 , value为 null
开发过程中会造成莫名其妙的问题 ,Crash都是幸运的

<think>嗯,用户想了解Unreal Engine中枚举类型的相关信息,特别是中文文档和使用说明。首先,我需要回忆一下UE的官方文档结构。记得UE的官方文档有中文版,但有些部分可能还是英文的,特别是较新的内容。枚举类型在编程中很常见UE中可能有特定的实现方式,比如使用UENUM来定义,或者有蓝图支持的枚举。 接下来,我应该先确定用户的具体需求。他们可能是在C++中定义枚举,或者在蓝图中使用,或者两者都有。UE中的枚举分为普通枚举和枚举类,枚举类的作用域更安全,可能更推荐使用。需要提到UENUM的用法,Meta标签如BlueprintType,这样枚举才能在蓝图中显示。 然后,文档部分,用户明确提到需要中文文档,所以应该直接引用官方中文文档的链接,即引用[1]中的地址。同时,可能还需要补充一些实际代码示例,比如如何声明一个枚举,如何在C++和蓝图中使用,以及如何通过反射获取枚举值,这在游戏开发中很常见。 另外,用户的问题可能涉及到枚举的高级用法,比如位掩码(Bitflags),这在UE中通过meta=(Bitflags)来实现,允许枚举值进行按位操作。这也是一个需要说明的点。 可能还需要考虑常见问题,比如枚举的序列化、网络同步等,但用户的问题可能更基础,所以先覆盖基本用法。然后,生成相关问题,比如如何在不同场景中使用枚举,如何优化,注意事项等,这些可以帮助用户进一步探索。 需要确保回答结构清晰,分点说明,包括定义、声明、使用、高级特性、文档参考,以及注意事项。同时,代码示例要用正确的格式,比如C++代码块,蓝图操作步骤。最后,相关问题要引导用户深入,比如性能影响、动态修改、最佳实践等。 检查引用是否正确,用户提供的引用[1]是中文文档,引用[2]是动作组件开发,可能不相关,引用[3]是联系方式,所以主要引用[1]。确保所有提到的UE特性都有对应的文档支持,避免提供错误信息。 总结回答的步骤:介绍枚举类型的作用,如何在C++中定义,如何在蓝图中使用,高级特性,中文文档的位置,注意事项,最后相关问题。保持语言简洁,技术点明确,适合不同层次的开发者参考。</think>### Unreal Engine 枚举类型使用说明 #### 一、枚举类型基础 在Unreal Engine中,枚举类型(Enum)用于定义一组具名常量,常用于状态管理、选项配置等场景。UE通过`UENUM`扩展了C++原生枚举功能,支持反射系统和蓝图可视化编辑[^1]。 #### 二、枚举类型声明 在C++中声明枚举类型需遵循特定格式: ```cpp // 必须包含UENUM且继承uint8类型 UENUM(BlueprintType) enum class ECharacterState : uint8 { Idle UMETA(DisplayName = "待机状态"), Running UMETA(DisplayName = "奔跑状态"), Jumping UMETA(DisplayName = "跳跃状态"), Dead UMETA(DisplayName = "死亡状态") }; ``` *注:`BlueprintType`元数据使枚举可在蓝图中使用,`UMETA`定义显示名称* #### 三、蓝图中的使用 1. **创建枚举变量**: - 在蓝图变量列表选择枚举类型 - 设置默认值 2. **分支判断**: - 使用`Switch on Enum`节点处理不同状态 3. **动态修改**: - 通过`Set Enum Value`节点更新状态 #### 四、高级特性 1. **位掩码(Bitflags)**: ```cpp UENUM(meta = (Bitflags)) enum class EAbilityFlags : uint8 { None = 0, Fire = 1 << 0, Ice = 1 << 1, Electric= 1 << 2 }; ``` 2. **反射系统访问**: ```cpp UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("ECharacterState")); FString DisplayName = EnumPtr->GetDisplayNameTextByValue(Value).ToString(); ``` #### 五、中文文档参考 官方中文文档提供了完整的枚举类型使用说明,包含以下内容: - 枚举类型的内存管理 - 网络同步注意事项 -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值