UE4
类命名(基础类actor、Uobject)
- 派生自 Actor 的类带有 A 前缀,如AController。
- 派生自 Object 的类带有 U 前缀,如UComponent。
- Enums 的前缀是 E,如EFortificationType。
- Interface 的前缀通常是 I,如IAbilitySystemInterface。
- Template 的前缀是 T,如TArray。
- 派生自 SWidget 的类(Slate UI)带有前缀 S,如SButton。
- 其他类的前缀为字母F ,如FVector。
虚幻反射系统
- UCLASS()——用于告诉虚幻为类生成反射数据。类必须派生自UObject。
- USTRUCT()——用于告诉虚幻为结构体生成反射数据。
- GENERATED_BODY()——UE4将这个标记替换为将为该类型生成的所有必要的样板代码。
- UPROPERTY()——支持将UCLASS的成员变量或USTRUCT用作UPROPERTY。UPROPERTY有很多用法。它可以允许复制变量、序列化变量和从蓝图访问变量。它们可以供垃圾回收程序使用,用来跟踪对UObject的引用次数。
- UFUNCTION()——支持将UCLASS的类方法或USTRUCT用作UFUNCTION。UFUNCTION可以允许从蓝图调用类方法,用作RPC等多种用途。
UCLASS标记
- Blueprintable
暴露这个类为创建蓝图时可以接受的基类。默认为是NotBlueprintable,除非从其他类继承Blueprintable关键字。子类可以继承这个属性。 - BlueprintType
暴露这个类作为蓝图中变量可以使用的一种类型。 - NotBlueprintable
指定这个类是不能作为创建蓝图的基类。使得父类具有的Blueprintable关键字无效。UPROPERTY标记
- Blueprintable - 该类可以由蓝图扩展。
- BlueprintReadOnly - 该属性可以从蓝图读取,但不能写入蓝图。
- BlueprintReadWrite - 该属性可以从蓝图中读取或写入。
- EditAnywhere - 该属性可以在原型和实例上的属性窗口中编辑。
- Category - 定义该属性将出现在编辑器“细节(Details)”视图下面的哪个部分。这对于整理结构而言十分有用。
- BlueprintCallable - 该功能可以从蓝图调用。
- BlueprintAssignable - 暴露该属性来在蓝图中进行分配赋值。
UFUNCTION标记
- 蓝图到原生代码的通信
- BlueprintCallable
这是一个可以从蓝图中调用的原生函数,它执行原生代码,修改正在调用它的对象上的一些内容或者一些其他的全局状态。这意味着它应该是“提前规划的”,或者已经清楚地知道相对于其他节点的执行顺序。我们通过白色执行连线完成这个处理。所有蓝图可调用的函数都按照它们沿着白色执行线出现的顺序进行调用。 - BlueprintPure
这是一个可以从蓝图中调用的原生函数,它执行原生代码,不会修改调用它的对象的任何内容,也不会修改任何其他的全局状态。这意味着调用该代码不会修改任何内容,它仅是取入输入,并向您提供一个输出。像数学节点(+ 、 - 、 * 等)、变量获取节点、或者任何不永久性地修改任何内容的东西都属于这类内容。这些内容不需要规划如何执行,它们没有线连接到白色执行线。编译器会根据哪个BlueprintCallable节点需要这些节点处理的数据来自动地辨别出他们。
- BlueprintCallable
- 原生代码到蓝图的通信
- BlueprintImplementableEvent
这是我们允许原生函数调用蓝图的主要方式。它们就像您在蓝图本身内实现的虚函数。如果函数没有实现,那么该函数调用将会被忽略掉。需要注意的很重要的一点是,如果一个BlueprintImplementableEvent没有返回值或输出参数,那么它将呈现为一个事件,您可以通过右击并从蓝图的事件图表中选择它。如果他具有返回值或任何输出参数,那么它将列在 My Blueprints(我的蓝图) 中,并且可以通过右击它并选择 “实现”函数来重载它。注意,BlueprintImplementableEvents没有该函数的原生代码实现。 - BlueprintNativeEvent
这些关键字和上面的一样,但是它具有该函数的原生默认实现,如果蓝图没有重载该函数则调用默认实现。如果蓝图没有实现函数,您需要某种默认行为;但是在需要重载函数的地方,您又需要重载该函数,对于这种情况这个关键字是非常有用的。这些关键字的性能消耗较大,所以我们仅把它们放在需要该功能的地方。当您重载该BlueprintNativeEvent时,如果您想调用原生实现,那么通过右击该事件或函数入口节点并选择"Add call to parent" , 您仍然可以调用原生实现。
- BlueprintImplementableEvent
构建状态
- 调试(Debug)
该配置包含用于调试的符号。该配置在调试配置中同时构建引擎和游戏代码。如果通过 调试(Debug) 配置编译项目并打算用虚幻编辑器打开项目,则必须使用“-debug”标志查看项目中反映出来的代码变化。 - 调试游戏(DebugGame)
该配置按最优方式构建引擎,但游戏代码为可调试状态。此配置适用于调试游戏模块。 - 开发(Development)
该配置等同于发布。虚幻编辑器默认采用 开发(Development) 配置。如采用 开发(Development) 配置编译项目,可在编辑器中看到项目代码的变化情况。 - 交付(Shipping)
这是最佳性能配置,用于交付游戏。此配置剥离了控制台命令、统计数据和性能分析工具。 - 测试(Test)
该配置就是启用了一些控制台命令、统计数据和性能分析工具后的 交付(Shipping) 配置。
构建目标
- [空(empty)]
该配置构建项目的独立可执行版本,但需要特定于平台的已烘焙内容。请参阅我们的打包项目 参考页面,以进一步了解烘焙内容。 - 编辑器(Editor)
为了能够在虚幻编辑器中打开项目并看到反映出来的所有代码更改,项目必须以 编辑器(Editor) 配置构建。 - 客户端(Client)
如果您使用UE4联网功能处理多人项目,该目标将指定项目用作面向多玩家游戏的UE4客户端-服务器模型中的客户端。如果存在Client.Target.cs文件,则 客户端(Client) 构建配置将有效。 - 服务器(Server)
如果您使用UE4联网功能处理多人项目,该目标将指定项目用作面向多玩家游戏的UE4客户端-服务器模型中的服务器。如果存在Server.Target.cs文件,则 服务器(Server) 构建配置将有效。
编译(*.Target.cs)
代码编译在两个阶段中进行
- UnrealHeaderTool(UHT) 被调用。它将解析 C++ 头中引擎相关类元数据,并生成自定义代码,以实现诸多 UObject 相关的功能。
- UnrealBuildTool(UBT)被调用,以便对结果进行编译。
UnrealBuildTool(UBT)编译*.Target.cs配置
public 构造函数(TargetInfo Target)
{
Type = TargetType.Game;
}
UnrealBuildTool源码中定义的编译目标
public enum TargetType
{
/// <summary>
/// Cooked monolithic game executable (GameName.exe). Also used for a game-agnostic engine executable (UE4Game.exe or RocketGame.exe)
/// </summary>
Game,
/// <summary>
/// Uncooked modular editor executable and DLLs (UE4Editor.exe, UE4Editor*.dll, GameName*.dll)
/// </summary>
Editor,
/// <summary>
/// Cooked monolithic game client executable (GameNameClient.exe, but no server code)
/// </summary>
Client,
/// <summary>
/// Cooked monolithic game server executable (GameNameServer.exe, but no client code)
/// </summary>
Server,
/// <summary>
/// Program (standalone program, e.g. ShaderCompileWorker.exe, can be modular or monolithic depending on the program)
/// </summary>
Program,
}
代理
-
Bind()
绑定到一个现有的代理对象上。 -
BindRaw()
绑定到一个原始的C++指针全局函数代理上。原始指针不使用任何引用,所以如果从代理的底层删除了该对象,那么调用它可能是不安全的。因此,当调用Execute()时一定要小心! -
BindSP()
绑定一个基于共享指针的成员函数代理。共享指针代理保持到您的对象的弱引用。您可以使用 ExecuteIfBound() 来调用它们。 -
BindUObject()
绑定一个基于UObject的成员函数代理。UObject 代理保持到您的对象的弱引用。您可以使用 ExecuteIfBound() 来调用它们。 -
UnBind()
解除绑定该代理。 -
Execute()
-
ExecuteIfBound()对于没有返回值的代理
-
IsBound()判断函数是否已经“绑定”了代理
class FLogWriter
{
void WriteToLog( FString );
};
DECLARE_DELEGATE_OneParam( FStringDelegate, FString );//代理
代理对象绑定
FSharedRef< FLogWriter > LogWriter( new FLogWriter() );
WriteToLogDelegate.BindSP( LogWriter, &FLogWriter::WriteToLog );
WriteToLogDelegate.Execute( TEXT( "Delegates are spiffy!" ) );
蓝图
蓝图原生化(蓝图转code)
-
如需启用蓝图原生化,使用 Edit 菜单 打开 Project Settings。在 Packaging 下启用 Nativize Blueprint Assets 复选框
类型
Impure Function(非纯函数) - 可以*修改类的状态及成员的函数
Pure Function(纯函数)- 承诺不会修改类的状态或成员的函数
Function Call(函数调用) - 可以放置在事件图表中来执行一个函数 的节点
Private Variable(私有变量)- 仅能在 Blueprint Defaults(蓝图默认值) 中编辑的变量,每次运行 构建脚本 时变量都会重置为默认值
Public Variable(公有变量) - 可以在每个 蓝图 的实例中独立编辑的变量,但是在 蓝图 的图表中认为是常量节点引脚
有两种主要引脚类型: 执行引脚(execution pins)和数据引脚(data pins)。数据引脚可提升为变量。
元素
函数(有输入输出)、宏(有输入输出)、事件调度(事件集合)、事件
构造脚本在begin play之前
着色器(*.usf文件)
PIE模式
- play in editor