使用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的属性可以保持客户端与服务器端的状态一致
原文链接: https://www.cnblogs.com/sichuanke/p/7810816.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/262944
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!