前些日子在写一个事件监听的逻辑。
有一个类需要订阅很多的事件,在BeginPlay全部注册一波监听,然后在EndPlay又全部注销。
我的设想是,注册监听的时候将AddUObject()返回的FDelegateHandle全部添加到一个list里面,然后在EndPlay的时候遍历这个list,全部Remove掉。
于是我定义了这样一个成员变量:
1 | UPROPERTY() |
但是编译的时候发生了报错:
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外头包一层UCLASS或USTRUCT的wrapper,然后元素的类型改成这个wrapper。
举个例子来说:
1 | UCLASS() |