ue4-接口的使用及对象回收机制
自己现在在做的demo中,用到了大量的UObject对象,战斗的过程中会频繁的new出这些对象,无疑会消耗很大的cpu,为了减少和现有架构的耦合性,本想用继承的方式写个基类,发现ue中不能同时继承两个UObject。根据answerhub里的提示,就是用接口来做。
接口的弊端是里面的成员不能用UPROPERTY宏标记给蓝图识别,不过可以在子类中写个方法来“曲线救国”
这个回收机制的相关类
1、ObjInter这个是给要回收对象继承的接口
ObjInter.h
1 |
|
ObjInter.cpp
1 |
|
2、ObjMgr是回收中心,里面有个回收池
回收池以类名为key,ue中的反射机制可以获取UObject具体的类名,value为对象数组
ObjMgr.h
1 | UCLASS() |
(ps:一系列的TSubclassOf是为了实现蓝图对象,如果某些类派生了某些蓝图类,在初始化时指定该蓝图类,即可new出蓝图实例对象)
ObjMgr.cpp
1 | UObjMgr::UObjMgr() : Super() |
(ps:在这基础上可以继续扩展,使用一些算法定时清除对象,LRU神马的)
3、继承接口,使用回收
FightData.h
1 |
|
FightData.cpp
1 |
|
用接口实现Broadcast,适用于多个类继承统一接口,处理不同实例对象
1 | class IBehavInterface |
必须用 UFUNCTION宏 声明为 BlueprintNativeEvent,所有继承这个接口的类都必须实现OnInputTap()方法
.h
1 | class AMyChar : public ACharacter, public IBehavInterface |
.cpp
1 | void AMyChar::OnInputTap_Implementation(const FVector& _pos) |
调用接口
1 | AMyChar* tarChar = Cast<AMyChar>(HitActor); |
(ps: 一定要先检查是否实现了接口)
结果:
小坑
1、不能直接调 BlueprintNativeEvent 声明的方法
1 | UFUNCTION(BlueprintNativeEvent) |
如:
xxx->OnInputTap(xx);
这种方法必须用这种方式调用
IBehavInterface::Execute_OnInputTap(tarChar, WorldPosition);
接口中的方法暴露给蓝图使用
必须声明为为 CannotImplementInterfaceInBlueprint,且不能用 BlueprintNativeEvent 声明的方法,
被声明为 BlueprintCallable 的方法必须是 virtual 方法
1 | UINTERFACE(meta = (CannotImplementInterfaceInBlueprint)) |
a