本文档是为正在开始使用虚幻引擎进行开发的程序员提供的。它简单地讲解了基础代码的各个方面。它绝不是一个针对引擎的完整指南,而是一个在您编译引擎代码之后的一个很好的准备工作。如果您还没有编译您的项目,请访问首先访问: 入门指南或快速入门页面。
当从Perforce上同步了UE3基础代码后,在您的Perforce depot(仓库)的根文件夹中应该有一个称为 UnrealEngine3 的目录。
在"UnrealEngine3"文件夹内有以下目录:
为了分离系统并帮助维持跨平台的兼容性,UE3被分割成了多个工程。
基本的结构如下所示(从最层代码到高层层次代码):
注意,所有的这些工程都要建立于彼此之上的,这意味着Engine依赖Core、Editor依赖Engine、UnrealED依赖Editor。
也有很多针对其它平台的特定功能,比如D3DDrv(渲染的Direct 3D实现),WinDrv(创建视口、处理事件的Windows实现等)。如果一个工程是跨平台界面的特定平台实现,那么很可能它需要附加后缀Drv。
虚幻引擎一般把游戏代码和引擎代码分割为2个不同的程序语言:
INT
、 FLOAT
、 UBOOL
等)。应该总是使用这些数据类型,而不是标准的C++数据类型,从而保证跨平台的兼容性。TCHAR
)。所有的字符串文字都需要在 TEXT()
宏进行封装,从而确保它们可以正确地被转换为宽字符。示例:
const TCHAR* TestString = TEXT("My Test String");
关于虚幻编码规范的更多信息,请参照编码规范页面。
在类和struct前附加一个字母前缀是很重要的,因为Unreal使用这些前缀让程序员知道应该如何处理一个对象。
本文档仅简要地略微谈到了一个新的程序员在使用虚幻引擎时需要处理的某些问题。
关于UnrealScript的全面描述,请参照UnrealScript参考指南页面。
当声明类时,可以指定一些UnrealScript Classes的选项。关于这个功能的详细介绍,请参照UnrealScript参考指南: (Gameplay/UnrealScript/Reference#Class_overview)。
在本讲解中,我们将简要地覆盖这些选项中的一个,因为它很容易使初识虚幻引擎的程序员犯错误。
如果为一个类指定了 native
选项,那么UnrealScript编译器将会自动地为那个UrealScript类生成相应的C++类声明。这些头文件具有后缀词"Classes",一般和工程的名称相关。比如"EngineClasses.h"、"EnginePhysicsClasses.h"、"EditorClasses.h"等。
因为当指定 native
时,UnrealScript将会自动生成C++类,所以程序员应该注意不要修改自动生成的头文件,而是在.uc文件中进行修改。
某些类在指定了 native
的同时也指定了 noexport
选项。这些类不能自动生成相应的C++部分,但是仍然期望C++声明存在。所以程序员必须自己书写一个头文件。在引擎中有很多这种情况的示例(请参照 Development/Src/Editor/Inc/Editor.h 文件中的UEditorEngine)。
noexport
UnrealScript 类需要和它们的C++对应部分保持‘同步’。因此,当修改UnrealScript文件时,程序员应该小心。
关于编译native 类的更多信息,请参照编译Native 类。
因为UObjects是由引擎自动管理的,所以可能有一些新程序员不熟悉的独特的微小差别:
new
进行创建, 而是用 ConstructObject
模板函数。delete
进行删除。垃圾回收器将会自动地处理删除UObjects。UObject::StaticClass
可以用于获得指向任何UObject静态实例的指针。Unreal World对象包含了它内部所有的Actors列表。
new
或 ConstructObject
来创建AActors – 您应该使用 SpawnActor
函数。DestroyActor
函数。虚幻引擎的一个强大功能是它可以对定义在.uc文件中的UObjects的所有属性根据名称自动地进行序列化。这允许您改变属性的顺序、添加新的属性、在类层次中移动属性,并且这些操作不会破坏向后的兼容性。
因为Unreal垃圾回收系统使用序列化来决定哪个 UObjects 是 可获得的 ,所以您需要确保您具有到任何您不想清除的UObjects的序列化引用。在编辑器中创建工具时是可能导致问题的一种情况。我们一般从FSerializableObject接口继承工具,它提供了一个=Serialize= 函数,可以通过实现这个函数来保存到在工具中创建的UObjects的引用。
void FSomeTool::Serialize(FArchive& Ar)
{
Ar << SomeUObjectPointer;
}
如果您使用native序列化工具来序列化永久性数据,您需要明确地支持老版本的序列化数据。要想启用这个功能,两个版本号存储在每个包中,一个供引擎使用,一个供授权用户使用。当授权用户在进行序列化改变时,可以更新 GPackageFileLicenseeVersion
,并且在反序列化过程中将会检查 Ar.LicenseeVer()
来决定保存的是哪个版本的序列换数据。
UE3使用层次化的配置系统,意味着默认值将会从 base(基类) 的配置文件向下传递,并且子类可以覆盖这些基类的配置文件。
所有的配置文件都是.INI文件,并且遵循特殊的命名规则:
比如,Editor配置文件的结构将是:
这个系统是强大的,因为它也用于为脚本中定义的属性填充数据,而这些脚本属性可以非常快速地配置游戏的任何部分。
引擎的主Tick循环可以在LaunchEngineLoop.cpp文件中找到: FEngineLoop::Tick()
。这个函数调用UEngine类的 Tick
函数,这样它将会更新游戏世界(UWorld)并监控更新引擎的其它各种子系统。
如果您想获得关于Actor ticking(更新)循环函数是如何工作的,请参照Actor 更新页面
虚幻引擎编程乍一看令人畏惧,但是随着时间的推移,您将会开始理解是某些复杂设计的决定使得它成为了今天的样子。既然您已经学习了虚幻引擎编程的第一个速成教程,那么请随便浏览UDN上提供给程序员的其它技术资源。
这里是为初学者提供的一些有用页面:
虚幻引擎编码规范:
编码规范
如何跟踪ue3中您的内存应用情况:
Memory使用
actor更新循环是如何工作的:
Actor更新
UnrealScript参考指南(这是必读页面):
虚幻脚本概述:
关于编译标记为'native'类的更多信息:
编译Native类
虚幻引擎中常见的技术问题(FAQ):
常见技术问题
本文档是为正在开始使用虚幻引擎进行开发的程序员提供的。它简单地讲解了基础代码的各个方面。它绝不是一个针对引擎的完整指南,而是一个在您编译引擎代码之后的一个很好的准备工作。如果您还没有编译您的项目,请访问首先访问: 入门指南或快速入门页面。
当从Perforce上同步了UE3基础代码后,在您的Perforce depot(仓库)的根文件夹中应该有一个称为 UnrealEngine3 的目录。
在"UnrealEngine3"文件夹内有以下目录:
为了分离系统并帮助维持跨平台的兼容性,UE3被分割成了多个工程。
基本的结构如下所示(从最层代码到高层层次代码):
注意,所有的这些工程都要建立于彼此之上的,这意味着Engine依赖Core、Editor依赖Engine、UnrealED依赖Editor。
也有很多针对其它平台的特定功能,比如D3DDrv(渲染的Direct 3D实现),WinDrv(创建视口、处理事件的Windows实现等)。如果一个工程是跨平台界面的特定平台实现,那么很可能它需要附加后缀Drv。
虚幻引擎一般把游戏代码和引擎代码分割为2个不同的程序语言:
INT
、 FLOAT
、 UBOOL
等)。应该总是使用这些数据类型,而不是标准的C++数据类型,从而保证跨平台的兼容性。TCHAR
)。所有的字符串文字都需要在 TEXT()
宏进行封装,从而确保它们可以正确地被转换为宽字符。示例:
const TCHAR* TestString = TEXT("My Test String");
关于虚幻编码规范的更多信息,请参照编码规范页面。
在类和struct前附加一个字母前缀是很重要的,因为Unreal使用这些前缀让程序员知道应该如何处理一个对象。
本文档仅简要地略微谈到了一个新的程序员在使用虚幻引擎时需要处理的某些问题。
关于UnrealScript的全面描述,请参照UnrealScript参考指南页面。
当声明类时,可以指定一些UnrealScript Classes的选项。关于这个功能的详细介绍,请参照UnrealScript参考指南: (Gameplay/UnrealScript/Reference#Class_overview)。
在本讲解中,我们将简要地覆盖这些选项中的一个,因为它很容易使初识虚幻引擎的程序员犯错误。
如果为一个类指定了 native
选项,那么UnrealScript编译器将会自动地为那个UrealScript类生成相应的C++类声明。这些头文件具有后缀词"Classes",一般和工程的名称相关。比如"EngineClasses.h"、"EnginePhysicsClasses.h"、"EditorClasses.h"等。
因为当指定 native
时,UnrealScript将会自动生成C++类,所以程序员应该注意不要修改自动生成的头文件,而是在.uc文件中进行修改。
某些类在指定了 native
的同时也指定了 noexport
选项。这些类不能自动生成相应的C++部分,但是仍然期望C++声明存在。所以程序员必须自己书写一个头文件。在引擎中有很多这种情况的示例(请参照 Development/Src/Editor/Inc/Editor.h 文件中的UEditorEngine)。
noexport
UnrealScript 类需要和它们的C++对应部分保持‘同步’。因此,当修改UnrealScript文件时,程序员应该小心。
关于编译native 类的更多信息,请参照编译Native 类。
因为UObjects是由引擎自动管理的,所以可能有一些新程序员不熟悉的独特的微小差别:
new
进行创建, 而是用 ConstructObject
模板函数。delete
进行删除。垃圾回收器将会自动地处理删除UObjects。UObject::StaticClass
可以用于获得指向任何UObject静态实例的指针。Unreal World对象包含了它内部所有的Actors列表。
new
或 ConstructObject
来创建AActors – 您应该使用 SpawnActor
函数。DestroyActor
函数。虚幻引擎的一个强大功能是它可以对定义在.uc文件中的UObjects的所有属性根据名称自动地进行序列化。这允许您改变属性的顺序、添加新的属性、在类层次中移动属性,并且这些操作不会破坏向后的兼容性。
因为Unreal垃圾回收系统使用序列化来决定哪个 UObjects 是 可获得的 ,所以您需要确保您具有到任何您不想清除的UObjects的序列化引用。在编辑器中创建工具时是可能导致问题的一种情况。我们一般从FSerializableObject接口继承工具,它提供了一个=Serialize= 函数,可以通过实现这个函数来保存到在工具中创建的UObjects的引用。
void FSomeTool::Serialize(FArchive& Ar)
{
Ar << SomeUObjectPointer;
}
如果您使用native序列化工具来序列化永久性数据,您需要明确地支持老版本的序列化数据。要想启用这个功能,两个版本号存储在每个包中,一个供引擎使用,一个供授权用户使用。当授权用户在进行序列化改变时,可以更新 GPackageFileLicenseeVersion
,并且在反序列化过程中将会检查 Ar.LicenseeVer()
来决定保存的是哪个版本的序列换数据。
UE3使用层次化的配置系统,意味着默认值将会从 base(基类) 的配置文件向下传递,并且子类可以覆盖这些基类的配置文件。
所有的配置文件都是.INI文件,并且遵循特殊的命名规则:
比如,Editor配置文件的结构将是:
这个系统是强大的,因为它也用于为脚本中定义的属性填充数据,而这些脚本属性可以非常快速地配置游戏的任何部分。
引擎的主Tick循环可以在LaunchEngineLoop.cpp文件中找到: FEngineLoop::Tick()
。这个函数调用UEngine类的 Tick
函数,这样它将会更新游戏世界(UWorld)并监控更新引擎的其它各种子系统。
如果您想获得关于Actor ticking(更新)循环函数是如何工作的,请参照Actor 更新页面
虚幻引擎编程乍一看令人畏惧,但是随着时间的推移,您将会开始理解是某些复杂设计的决定使得它成为了今天的样子。既然您已经学习了虚幻引擎编程的第一个速成教程,那么请随便浏览UDN上提供给程序员的其它技术资源。
这里是为初学者提供的一些有用页面:
虚幻引擎编码规范:
编码规范
如何跟踪ue3中您的内存应用情况:
Memory使用
actor更新循环是如何工作的:
Actor更新
UnrealScript参考指南(这是必读页面):
虚幻脚本概述:
关于编译标记为'native'类的更多信息:
编译Native类
虚幻引擎中常见的技术问题(FAQ):
常见技术问题