20200907 UE4 容器类使用非UC++类型作为元素

前些日子在写一个事件监听的逻辑。

有一个类需要订阅很多的事件,在BeginPlay全部注册一波监听,然后在EndPlay又全部注销。

我的设想是,注册监听的时候将AddUObject()返回的FDelegateHandle全部添加到一个list里面,然后在EndPlay的时候遍历这个list,全部Remove掉。

于是我定义了这样一个成员变量:

1
2
3
4
5
6
7
UPROPERTY()
TArray<FDelegateHandle> HandleArray;

void AMyActor::BeginPlay()
{
HandleArray.Add(xxxDelegate->AddUObject(xxxxx));
}

但是编译的时候发生了报错:

1
Error: Unrecognized type 'FDelegateHandle' - type must be a UCLASS, USTRUCT or UENUM

这里的意思是如果容器类是UPROPERTY,那么参数必须是UCLASS, USTRUCT or UENUM

当然容器类也可以不是UPROPERTY,但是这样的话会少了一个引用数,如果没有做别的引用,这个容器实例马上就会被垃圾回收系统销毁。

所以UPROPERTY还是必须的。

解决方案

首先排除SharedPtr方案,因为它同样不是UCLASS, USTRUCT or UENUM

上网查了一波,最终只能采用苟且的方式,那就是在非UCLASS, USTRUCT or UENUM外头包一层UCLASSUSTRUCT的wrapper,然后元素的类型改成这个wrapper。

举个例子来说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
UCLASS()
class XXX_API UDelegateHandleWrapper
{
public:
FDelegateHandle Handle;

UDelegateHandleWrapper(){}
}

class XXX_API AMyActor
{
public:
UPROPERTY()
TArray<UDelegateHandleWrapper> HandleWrapperArray;
}

void AMyActor::BeginPlay()
{
UDelegateHandleWrapper Wrapper = NewObject<UDelegateHandleWrapper>();
Wrapper.Handle = XXX.AddUObject(xxxxx);
HandleWrapperArray.Add(Wrapper);
}
Buy Me A Coffee / 捐一杯咖啡的钱
分享这篇文章~
0%
//