为什么要写这个
使用过虚幻一段时间过后,大家一定会发现,无论是ue4自己的各个模块源码,还是网络上的某些插件的模块源码,又或者是普通的游戏模块源码,你几乎都能看到,每个模块源码目录下,或多或少有包含,Public,Private,Classes这三个文件夹,起初并不知道UE4为什么要这么划分代码,教程这么教,那么我就跟着这么做,把所有的头文件都放到Public文件夹下,再把所有的实现文件都放到Private目录下。
直到某一天,我看到更奇葩的代码结构,那就是,Private既放了头文件,也放了实现文件,作为严重的强迫症患者,我实在受不了这一点,所以,我必须得搞清楚,这些Public,Private,Classes文件夹到底是什么鬼。
详细介绍
经过一番搜索得知,这三个文件夹,除了Public文件夹,其他两个文件夹并没有什么特殊性。
Classes文件夹
Classes文件夹曾经是特殊的,因为在旧版本的虚幻引擎中,所有UObject以及衍生类的声明,都必须写在Classes文件夹中。 但这一个限制已经不再存在,如果你对比并观察最近的几个虚幻版本,你就会发现,虚幻新加的功能模块,和新出的各种示例、教程等,也已经完全弃用了Classes文件夹。 所以,如果你还能看到带有Classes的文件夹结构,那估计是在旧版本虚幻下写的。在今后的代码中,你可以完全忘记有这么一回事。
Public文件夹
模块源码下的Public文件夹,目前的作用就是,当该模块本身被其他模块依赖时,该模块的Public文件夹路径,会被其他模块自动添加为“include path”。打个比方,假如你有一个模块A,A/Public/下有code1.h和code2.h两个头文件;然后我有一个模块B,我在模块B的PublicDependencyModuleNames
列表中加入模块A,这时候,我在模块B的代码中就可以直接include模块A的Public文件夹下的各种头文件了,比如#include "code1.h"
。
Private文件夹
Private文件夹并没有什么特殊的作用和意义。但已经作为惯例与Public文件夹成对使用了。下面会解释。
Public/Private文件夹分离
为什么要使用Public/Private文件夹分离文件呢?使用这个方法分离文件的主要好处是封装。假如你写了一个需要给别人使用的模块,那么,你只需把使用这个模块所需要的Header文件放到Public目录下,把它的实现文件放到Private目录下,如果有其他功能的头文件和实现文件且不需要使用者关心或者修改的,就可以都放到Private目录下,这样使用者要使用你的代码,只需要看看Public下有什么,并不需要深入去研究你的实现。
一些值得注意的地方
所以,虚幻的惯例是:
并不是Public下放头文件,Private下放实现文件,而是Public放需要暴露给别人的头文件,其他不需要暴露给其他人的头文件和实现文件放到Private目录下。
Private文件夹并没什么特殊性,只是习惯性地被拿来与Public成对使用而已,并非强制的,你使用Pipixia放私有文件都可以。
游戏模块(非插件模块),一般来说也不会被其他模块依赖,因为游戏模块基本就是所有其他现有模块的“使用者”,所以你会看到网上某些游戏模块的源码结构根本不遵守Public/Private分离的惯例,对于游戏模块来说,这是可取的,但不推荐,因为你的游戏模块可能会有一个对应的编辑器模块,而这个编辑器模块一般是要依赖你的游戏模块的。