Skip to content

代码规范

命名规范

在团队协作开发中,统一命名规范能显著提升代码可读性,使变量、函数、类等元素的用途一目了然,降低团队成员的理解和沟通成本;同时,它有助于减少因命名歧义、大小写错误或缩写不一致导致的逻辑错误,提高代码的健壮性。规范一致的命名还能加快功能维护与扩展的速度,便于新成员快速熟悉项目,并更好地与静态分析、文档生成等自动化工具集成。尤其在基于 UE5 与 C++ 的复杂项目中,涵盖 Gameplay、动画、网络同步等模块的清晰命名对提升协作效率和代码质量至关重要。因此,制定并严格执行统一的命名规范,是保障项目长期可维护性与团队高效协作的基础。

类/结构命名

每个单词的首字母大写。部分名称过长的类则为类名缩写_自定义类名(文末列出)

cpp
/* 自定义角色类 */
UCLASS()
class ACustomCharacter : public ACharacter
{
    GENERATED_BODY()
}

/* 名称过长的类,比如ModMagnitudeCalculation */
UCLASS()
class UMMC_TestModify : public UGameplayModMagnitudeCalculation
{
    GENERATED_BODY()
}

/* 数据表行结构体 */
USTRUCT()
struct FMyDataTableRow : public FTableRowBase
{
    GENERATED_BODY()
}

变量命名

  • 每个单词的首字母大写
  • bool类型变量要在变量名前加上b
  • 尽量避免缩写,有缩写时需要写清晰的注释
cpp
/* bool变量 */
bool bIsWalking = false;

/* 其它变量 */
int32 ContainerNums = 0;

FVector2d Direction;

函数命名

  • 每个单词的首字母大写
  • 命名要表现出该函数的用途
cpp
bool IsEmpty()
{
    return false;
}

AbilitySystemComponent* GetAbilitySystemComponent()
{
    return AbilitySystemComponent;
}

委托命名

  • F开头
  • 命名带有On前缀或Delegate后缀
cpp
/* 使用On前缀 */
DECLARE_DELEGATE(FOnAttributeChanged)

/* 使用Delegate后缀 */
DECLARE_DELEGATE(FAttributeChangeDelegate)

GameplayTag命名

  • 每个单词首字母大写
  • 标签要正确写明层级
cpp
UE_DECLARE_GAMEPLAY_TAG_EXTERN(TestCharacter);

/* 标签层级 */
UE_DEFINE_GAMEPLAY_TAG_COMMENT(
    TestCharacter,
    "EternalVU.Character.Type.TestCharacter",
    "测试角色标签"
    );

蓝图命名

一般用蓝图资产的单词首字母做前缀,部分以BP_做前缀。见项目内资产命名。

代码写法

代码块

cpp
/* 大括号 */
void MyFunc()
{

}

函数

参数

cpp
/* 无参数 */
void MyFunc1()
{

}

/* 参数 > 3 */
void MyFunc2(
    int32 Param1,
    int32 Param2,
    int32 Param3,
    int32 Param4
)
{

}

虚函数重载

cpp
//.h
virtual void MyFunc3() override;

//.cpp
void MyFunc()
{
    //根据需求调用
    Super::MyFunc3();
}

RepNotify函数

cpp
UPROPERTY(ReplicatedUsing = OnRep_Number)
int32 Number = 0;

void OnRep_Number()
{

}

RPC函数

cpp
//.h
UFUNCTION(Server,Reliable)
void MyServerFunc()
{

}

UFUNCTION(Client,Reliable)
void MyClientFunc()
{

}

UFUNCTION(Multicast,Unreliable)
void MyMulticastFunc()
{

}

//.cpp
void MyServerFunc_Implementation()
{

}

void MyClientFunc_Implementation()
{

}

void MyMulticastFunc_Implementation()
{

}

lambda表达式

cpp
/* lambda表达式 */
auto CallBack = []()
{

};

ASyncTask(ENamedThread::Type::AnyBackgroundThreadNormalTask,[]()
{

});