【UE4】TSubclassOf的使用

TSubclassOf

TSubclassOf 是提供 UClass 类型安全性的模板类。例如您在创建一个投射物类,允许设计者指定伤害类型。您可只创建一个 UClass 类型的 UPROPERTY,让设计者指定派生自 UDamageType 的类;或者您可使用 TSubclassOf 模板强制要求此选择。以下示例代码展示了不同之处:

/** type of damage */
UPROPERTY(EditDefaultsOnly, Category=Damage)
UClass* DamageType;

Vs.

/** type of damage */
UPROPERTY(EditDefaultsOnly, Category=Damage)
TSubclassOf<UDamageType> DamageType;

在第二个声明中,模板类告知编辑器的属性窗口只列出派生自 UDamageType 的类(作为属性选择)。在第一个声明中可选择任意 UClass。下图对此进行了说明。

image alt text

策略游戏投射物蓝图的范例

除 UPROPERTY 安全外,您还能获得 C++ 层级上的类型安全。如尝试进行不兼容 TSubclassOf 类型的相互指定,将出现编译错误。尝试指定泛型 UClass 时,它将执行一个运行时检查,以确定它可执行指定。如运行时检查失败,结果数值为 nullptr。

UClass* ClassA = UDamageType::StaticClass();

TSubclassOf<UDamageType> ClassB;

ClassB = ClassA; // Performs a runtime check

TSubclassOf<UDamageType_Lava> ClassC;

ClassB = ClassC; // Performs a compile time check
### 在虚幻引擎中使用蓝图结合数据表实现模型生成与移动 在虚幻引擎中,通过数据表和蓝图的结合可以实现对模型生成位置、移动路径等行为的动态控制。以下是具体实现方法: #### 1. 创建数据表结构 首先,需要定义一个数据表结构来存储模型生成所需的数据。打开内容浏览器,右键选择` Miscellaneous > Struct `创建一个新的结构体,并添加以下字段: - **SpawnLocation**:类型为`FVector`,用于指定模型生成的位置。 - **MovePath**:类型为`Array<FVector>`,用于存储模型的移动路径点。 - **ModelClass**:类型为`TSubclassOf<AActor>`,用于指定要生成的模型类。 ```cpp USTRUCT(BlueprintType) struct FSpawnData { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn") FVector SpawnLocation; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn") TArray<FVector> MovePath; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Spawn") TSubclassOf<AActor> ModelClass; }; ``` #### 2. 填充数据表 创建一个数据表后,将上述结构体应用到数据表中。在编辑器中打开数据表并填充生成位置、移动路径和模型类的信息。确保每个条目都正确配置[^1]。 #### 3. 蓝图逻辑实现 接下来,在蓝图中实现模型生成与移动的逻辑。以下是具体的实现步骤: ##### (a) 加载数据表 在蓝图中,使用`Get DataTable Row`节点加载数据表中的行数据。输入数据表资产引用以及对应的行名称以获取数据表中的信息。 ##### (b) 模型生成 使用`Spawn Actor from Class`节点根据数据表中的`ModelClass`字段生成模型实例。设置生成位置为数据表中的`SpawnLocation`字段值。 ```blueprint // 使用 Spawn Actor from Class 节点生成模型 // 输入参数包括 ModelClass 和 SpawnLocation ``` ##### (c) 移动路径控制 对于模型的移动路径,可以使用`For Loop`节点遍历数据表中的`MovePath`数组。在每次循环中,调用`Set Actor Location`节点更新模型的位置,逐步实现模型沿路径移动的效果。 ```blueprint // 使用 For Loop 遍历 MovePath 数组 // 在每次循环中调用 Set Actor Location 更新模型位置 ``` 为了平滑移动效果,可以结合`Timeline`节点实现基于时间的插值移动。创建一个`Timeline`节点,设置其范围从0到1,并绑定一个浮点曲线。在曲线变化过程中,计算当前位置与目标位置之间的插值,并更新模型位置。 ```blueprint // 使用 Timeline 节点实现平滑移动 // 绑定浮点曲线并在每帧更新模型位置 ``` #### 4. 触发机制 可以通过事件触发器(如`Event Begin Play`或自定义事件)来启动模型生成与移动逻辑。将上述蓝图逻辑封装在一个函数中,并在适当的时机调用该函数[^2]。 --- ### 注意事项 - 确保数据表中的路径点顺序正确,否则可能导致模型移动异常。 - 如果需要更复杂的移动逻辑,可以考虑使用导航网格(NavMesh)或行为树(Behavior Tree)。 - 数据表的内容可以通过Excel导入导出,方便团队协作和数据维护[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值