虚幻4 C++编程经验总结
使用UE4开发FPS游戏将近1年半的时间了.伴随着对于UE4的越来越深入的理解.以前的编程观念发生了很大的改变.写下来做一个记录
1,为Actor添加功能还是创建Component封装功能
最近在编写一个体感控制功能,根据运动控制器的方向来确定角色的移动方向.是否跳跃等.在开始使用UE4时,我会把功能放在Character类中,渐渐的Character类的功能越来越多,维护起来也变得复杂了.而且Character类在诸多文件中都要包含,每次改变Character类的声明,都需要重现编译很多文件,开发效率变低.当创建Component来封装体感控制功能时,代码变得内聚,Character类只需要挂接此Componnent,就可以提供功能.在开发此组件时,每次编译只要编译此Component即可,极大的加快了编译速度.所以使用Component来开发功能优势很明显.
2,使用BlueprintCallable,BlueprintImplementableEvent函数在蓝图中调试
为一个函数加上BlueprintCallable可以在蓝图中方便调用,而为一个函数加上BlueprintImplementableEvent,则可以在蓝图中实现,然后打印变量,或者绘制调试图形,调用DebugDrawLine系列函数.
3,添加UBlueprintFunctionLibrary函数
UBlueprintFunctionLibrary中的函数可以在蓝图中全局调用,把常用的功能写入它里面,可以提高开发效率.例如下面使用meta = (WorldContext = "WorldContextObject")标记可以在蓝图中把当前上下文对象传入
UCLASS() class SHOOTERGAME_API UShooterBlueprintFunctionLibrary : public UBlueprintFunctionLibrary { //获取其他的玩家 UFUNCTION(BlueprintPure, meta = (WorldContext = "WorldContextObject"), Category = "Player") static AShooterCharacter* GetOtherPlayer(UObject* WorldContextObject, AShooterCharacter* Player); } AShooterCharacter* UShooterBlueprintFunctionLibrary::GetOtherPlayer(UObject* WorldContextObject, AShooterCharacter* Player) { if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject)) { for (TActorIterator<AShooterCharacter> it(World); it; ++it) { if (*it != Player) { return *it; } } } return nullptr;
4,UPROPERTY属性标记
虚幻的垃圾回收依赖于UPROPERTY,不管是在struct,还是在class中,对于UObject及其子类类型的属性,都需标记UPROPERTY,以防止被垃圾回收.
5,Replicated属性
Replicated属性用于同步服务器的状态到客户端中,尤其对于中途加入的玩家,标记为Replicated的属性可以保持客户端与服务器端的状态一致