目录结构
1. Content 文件夹
- 用途:存放资源
- 可以自定义如下子文件夹,名称自定义:
- Materials:存放所有材质文件(.umaterial)。
- Textures:存放所有纹理图片(.utexture2d等)。
- Meshes:存放所有3D模型文件(.fbx、.obj导入后生成的.uasset)。
- Sounds:存放音效文件(.wav、.ogg等)。
- Blueprints:存放蓝图资源,包括蓝图类、蓝图函数库等。
- Levels:存放关卡文件(.umap)。
- UI:存放用户界面元素,如Slate UI或UMG组件。
- Animation:存放动画资源,如动画蓝图、动画序列等。
- Particles:存放粒子系统资源。
- Shaders:存放自定义着色器代码(虽然着色器通常在Materials中通过Material Editor或ShaderGraph创建)。
2. Source 文件夹
- 用途:存放项目的C++源代码文件
- 子文件夹:
- 项目名:这是自动生成的,与你的项目名称相同,包含项目的核心源代码和配置文件。
- Public:存放公共头文件(.h),这些文件可以被项目中的其他模块引用。
- Private:存放私有实现文件(.cpp),这些文件包含类的具体实现,通常不会被项目外的其他模块直接访问。
- 项目名.Build.cs:这是项目的构建配置文件,用于定义项目的依赖关系、编译设置等。
- 其他模块:项目可以包含多个模块,每个模块都有自己的
Public
、Private
和.Build.cs
文件。
- 项目名:这是自动生成的,与你的项目名称相同,包含项目的核心源代码和配置文件。
3. Binaries 文件夹
- 用途:存放编译后的二进制文件,包括可执行文件、动态链接库(DLLs)等。
- 注意:在构建游戏或项目时,编译器会在这个文件夹下生成必要的文件。对于发布游戏,可能会从这里复制最终的可执行文件和必要的资源。
4. 其他重要文件夹
- Config:存放项目配置文件,虽然这些文件通常位于Source目录下的模块文件夹内,但也可能在项目的根目录或其他特定位置。
- Intermediate:存放编译过程中的临时文件,这个文件夹通常不需要手动干预。
- Saved:存放编辑器会话和项目的保存数据,如编辑器布局、自定义的关卡编辑器内容等。
代码规范
1. 命名约定
- 类型命名:
- 使用大驼峰命名法(CamelCase)。
U
前缀用于UObject
及其派生类。A
前缀用于AActor
及其派生类。S
前缀用于 Slate UI 组件(如SWidget
)。F
前缀用于结构体(Struct)。E
前缀用于枚举(Enum)。I
前缀用于接口类。
- 变量命名:
- 使用小写字母开头,单词间使用下划线分隔(snake_case),但在C++类中通常使用小驼峰命名法(camelCase)。
- 布尔变量以小写
b
开头(如bIsVisible
)。
2. 关键字
- const:
- 用于函数参数,表示该参数在函数内部不会被修改。
- 用于成员函数,表示该函数不会修改对象的状态
- 不在返回类型上使用
const
。
- nullptr:
- 总是使用
nullptr
而不是NULL
或0
来表示空指针。
- 总是使用
- auto:
- 在循环迭代、类型推导复杂表达式结果时使用
auto
以提高代码可读性。 - 避免在函数返回类型或类成员变量上使用
auto
。
- 在循环迭代、类型推导复杂表达式结果时使用
- override 和 final:
- 在重写基类虚函数时使用
override
关键字,以确保重写正确无误。 - 如果不希望某个类被进一步继承,可以在类定义后使用
final
关键字。
- 在重写基类虚函数时使用
3. 代码风格
- 大括号:
- 总是将大括号放在新行上,以提高代码的可读性。
- 即使只有一行代码,也使用大括号包围
if
、for
、while
等语句块。
- 注释:
- 变量名和函数名应具有自描述性,以减少对注释的依赖。
- 对于复杂的逻辑或算法,提供清晰的注释说明。
4. API 设计
- 参数设计:
- 避免使用过多的布尔参数,考虑使用枚举或结构体来封装相关参数。
- 对于可选参数,考虑使用默认参数值或重载函数。
- 返回值:
- 尽可能使用返回值来传达函数执行的结果,而不是通过修改外部变量或输出参数。
- 对于可能失败的操作,考虑使用返回值或异常来报告错误。
5. 性能优化
- 移动语义:
- 在需要传递大型对象或容器时,考虑使用移动语义(
std::move
)来避免不必要的拷贝。
- 在需要传递大型对象或容器时,考虑使用移动语义(
- 资源管理:
- 使用智能指针(如
TSharedPtr
、TUniquePtr
)来管理资源,以避免内存泄漏。 - 注意对象的生命周期和所有权,确保在不再需要时及时释放资源。
- 使用智能指针(如