介绍
通过C#可以动态生成UClass,UInterface,UStruct和UEnum,并且不需要蓝图载体。
基础概念
在反射中,有介绍C++中Package和C#中Namespace的映射关系,对于动态类来说,不论namespace是什么,都会被创建到/Script/CoreUObject
中。这样做的目是有一些特殊的情景,如动态类被其他类所引用或者被放置在场景中时,但是由于没有蓝图载体,如果放在其他Package中,会导致序列化失败。其中UClassAttribute,UStructAttribute和UFunctionAttribute继承于OverrideAttribute,换言之,动态类的变量访问和函数调用又会回到反射绑定流程。同时,为了编辑器热重载,文件命名具有规范。
UEnum
如果需要标记BlueprintType,即被蓝图使用,需要将UnderlyingType设置为byte。枚举名和文件名都需要E
前缀。
示例:UEnum
- C#
using Script.Dynamic;
namespace Script.CoreUObject
{
[UEnum, BlueprintType]
public enum ETestDynamicEnum : byte
{
TestDynamicZero = 0,
TestDynamicOne = 1,
TestDynamicTwo = 2
}
}
UStruct
类名需要F
前缀,文件名不需要F
前缀。
示例:UStruct
- C#
using Script.Dynamic;
namespace Script.CoreUObject
{
[UStruct, BlueprintType]
public partial class FTestDynamicStruct
{
[UProperty, BlueprintReadWrite]
public int Value { get; set; }
}
}