前些日子在写一个事件监听的逻辑。
有一个类需要订阅很多的事件,在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() |